首页 > 代码库 > 如来神掌第一式第三招----SSH详解

如来神掌第一式第三招----SSH详解


###############################################################################
# Name : Mahavairocana                                                                                                                                           
# Author : Mahavairocana                                                                                                                                         
# QQ : 10353512                                                                                                                                                    
# WeChat : shenlan-qianlan                                                                                                                                      
# Blog : http://www.cnblogs.com/Mahavairocana/                                                                                                       
# Description : You are welcome to reprint, or hyperlinks to indicate the                                                                        
#                    source of the article, as well as author information.                                                                                
###############################################################################



1、SSH服务介绍
      
(一个服务、两种级别、三种协议)      
ssh是一种安全通道协议(默认端口:TCP 22,)采用C/S架构,主要用来实现字符界面的远程登录,远程复制等功能,ssh协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,与早期的telnet,rsh远程执行命令,rcp远程复制命令。SSH有很多功能,它既可以代替Telnet,又可以为FTP、Pop、甚至为PPP提供一个安全的"通道"。

从客户端来看,SSH提供两种级别的安全验证。
  第一种级别(基于口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
      建立过程:(缺点:如果有人冒充服务器,就会给你假服务器公钥,最后就能获得你回应的密码,这就是中间人攻击。)
    1、服务器建立公钥: 每一次启动 sshd 服务时,该服务会主动去找 /etc/ssh/ssh_host* 的文件,若系统刚刚安装完成时,由于没有这些公钥,因此 sshd 会主动去计算出这些需要的公钥,同时也会计算出服务器自己需要的私钥
    2、客户端主动联机请求: 若客户端想要联机到 ssh 服务器,则需要使用适当的客户端程序来联机,包括 ssh, putty 等客户端程序连接
    3、服务器传送公钥给客户端: 接收到客户端的要求后,服务器便将第一个步骤取得的公钥传送给客户端使用 (此时应是明码传送,反正公钥本来就是给大家使用的)
    4、客户端记录并比对服务器的公钥数据及随机计算自己的公私钥: 若客户端第一次连接到此服务器,则会将服务器的公钥记录到客户端的用户家目录内的 ~/.ssh/known_hosts 。若是已经记录过该服务器的公钥,则客户端会去比对此次接收到的与之前的记录是否有差异。若接受此公钥, 则开始计算客户端自己的公私钥
    5、回传客户端的公钥到服务器端: 用户将自己的公钥传送给服务器。此时服务器:具有服务器的私钥与客户端的公钥,而客户端则是: 具有服务器的公钥以及客户端自己的私钥,你会看到,在此次联机的服务器与客户端的密钥系统 (公钥+私钥) 并不一样,所以才称为非对称加密系统
    6、开始双向加解密: (1)服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用自己的私钥解密 (2)客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密,这样就能保证通信安全

  第二种级别(基于密匙的安全验证)需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

  用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。
  第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。
     建立过程:(缺点:需要提前预置公钥)
    1.客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证;
    2.服务器收到请求之后,先在该服务器上寻找你的公钥,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用这个公钥加密一个【随机字符串】并把它发送给客户端软件;
    3.客户端软件收到【加密后的-随机字符串】之后,就可以用你的私人密匙解密,再把【随机字符串】发送给服务器

SSH协议框架中最主要的部分是三个协议:
    传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性 等的支持;
    用户认证协议(The User Authentication Protocol) 则为服务器提供客户端的身份鉴别;
    连接协议(The Connection Protocol) 将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用;各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。

2、概念描述
    明文:需要秘密传送的消息。
    密文:明文经过密码变换后的消息。
    加密:由明文到密文的变换。
    解密:从密文恢复出明文的过程。
    破解:非法接收者试图从密文分析出明文的过程。
    加密算法:对明文进行加密时采用的一组规则。
    解密算法:对密文进行解密时采用的一组规则。
    密钥:加密和解密时使用的一组密码信息。
    对称加密:是采用单钥密码系统的加密方法,使用同一密钥对信息进行加密和解密的加密方法。
    非对称加密:需要两个密钥:公共密钥和私有密钥,它们成对出现,公钥加密的数据有且只有私钥能解密,私钥加密的数据有且只有公钥解密,相对于“对称加密”,“非对称加密”加密方法加密和解密使用不同的密钥,所以叫“非对称加密”加密方法。
    对称加密和非对称加密的区别:在于加密和解密是否使用的同一个密钥。
    公钥 :用于向外发布,任何人都能获取,
    私钥 :要自己保存,切勿给别人
    情况1:公钥用于【加密】, 私钥用于【解密】
    如果加密密钥是公开的,这用于客户给私钥所有者上传加密的数据,这被称作为公开密钥加密(狭义)。 例如,网络银行的客户发给银行网站的账户操作的加密数据。HTTPS 等。

    情况2:公钥用于【解密】,私钥用于【加密】
    如果解密密钥是公开的,用私钥加密的信息,可以用公钥对其解密,用于客户验证持有私钥一方发布的数据或文件是完整准确的,接收者由此可知这条信息确实来自于拥有私钥的某人,这被称作数字签名,公钥的形式就是数字证书。例如,从网上下载的安装程序,一般都带有程序制作者的数字签名,可以证明该程序的确是该作者(公司)发布的而不是第三方伪造的且未被篡改过(身份认证/验证)。
 
加密、身份认证、数字签名认证:
    加密:将数据资料加密,使得非法用户即便获取加密后的资料,也无法获取正确的资料内容,所以数据加密可以保证数据防止监听攻击;其重点在于数据的安全性。
    身份认证:判断某身份的真实性,确认身份后,系统才可以依不同的身份赋予不同的权限;其重点在于用户的真实性。
    数字签名认证:首先"数字签名"就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许接收者判断数据的来源和数据的完整性,防止被伪造篡改。数字签名认证侧重于把保证数据的完整性,防止被伪造和篡改。


3、SSH版本介绍
    SSH1又分为1.3和1.5两个版本。SSH1采用DES、3DES、Blowfish和RC4等对称加密算法保护数据安全传输,而对称加密算法的密钥是通过非对称加密算法(RSA)来完成交换的。SSH1使用循环冗余校验码(CRC)来保证数据的完整性,但是后来发现这种方法有缺陷。
    SSH2避免了RSA的专利问题,并修补了CRC的缺陷。SSH2用数字签名算法(DSA)和Diffie-Hellman(DH)算法代替RSA来完成对称密钥的交换,用消息证实代码(HMAC)来代替CRC。同时SSH2增加了AES和Twofish等对称加密算法。


4、SSH相关原理


    
    4.1 建立过程
    ssh的登录过程分为5个阶段
    1、版本号协商阶段
    2、密钥和算法协商阶段
    3、认证阶段
    4、会话请求阶段
    5、会话交互阶段


        1、版本号协商阶段
            服务端打开端口22,等待客户连接。
            客户端向服务端发起TCP连接,连接建立后,服务端向客户端发送第一个报文,包括版本标志字符串,格式为“协议版本号 次协议版本号 软件版本号”。
            客户端收到报文后,解析协议版本号,如果服务端的协议版本号比自己的低,且客户端能支持服务端的低版本,就使用服务端的协议号,否则使用自己的协议版本号。
            客户端回复服务端一个报文,包含了客户端决定使用的协议版本号。
            服务端比较客户端发过来的版本号,决定是否能同客户端交互。
            如果协商成功,就进入密钥和算法协商阶段。否则服务端断开TCP连接。
        
        2、密钥和算法协商阶段
            服务端和客户端分别发送算法协商报文给对方,报文中包含自己支持的公钥算法列表、加密算法列表、消息验证码算法列表、压缩算法列表等。
            服务端和客户端根据对方和自己支持的算法得出最终使用的算法。
            服务端和客户端利用DH交换算法、主机密钥对等参数,生成会话密钥和会话ID。
                c公 客户端公钥
                c密 客户端密钥
                s公 服务端公钥
                s密 服务端密钥
        在版本号协商阶段完成后:
            服务端将 s公 发送给客户端。
            服务端生成会话ID ,设为 id ,发送给客户端。
            客户端生成会话密钥,设为 key ,并计算 res = id 异或 key。
            客户端将 res 用 s公 进行加密,将结果发送给服务端。
            服务端用 s密 进行解密,得到 res。
            服务器计算 res 异或 id,得到 key。
            至此服务端和客户端都知道了会话密钥和会话ID,以后的数据传输都使用会话密钥进行加密和解密。
        
        3、认证阶段
        基于账号和口令的验证方式:
            客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方法、口令,将结果发送给服务器。
            服务端使用获得的会话密钥解密报文,得到账号和口令。
            服务端对这个账号和口令进行判断,如果失败,向客户端发送认证失败报文,其中包含了可以再次认证的方法列表。
            客户端从认证方法列表中选择一种方法进行再次认证。
            这个过程反复进行,直到认证成功或者认证次数达到上限,服务端关闭本次TCP连接。
        基于公钥和私钥的验证方式:
            使用ssh-keygen程序生成公钥 id_dsa.pub 和私钥 id_dsa,一般是在客户端上生成,然后把 id_dsa.pub 通过某种方式发送给服务端。
            服务端放在将要远程登录过来的那个账号的目录的.ssh目录下面。
            客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方法、id_dsa.pub,将结果发送给服务端。
            服务端使用会话密钥解密报文,得到账号、id_dsa.pub。    服务端在这个账号的目录的.ssh目录下找对应的公钥,如果没有找到,发送失败消息给客户端,如果找到,比较客户发送过来的        这个公钥和找到的公钥,如果内容相同,服务端生成一个随机的字符串,简称“质询”,然后使用找到的公钥加密这个质询,然后使用会话密钥再次加密。
            服务端把这个双重加密的数据发送给客户端。
            客户端使用会话密钥解密报文,然后使用id_dsa再次解密数据,得到质询。
            客户端使用会话密钥加密质询,发送给服务端。
            服务端使用会话密钥解密报文,得到质询,判断是不是自己生成的那个质询,如果不相同,发送失败消息给客户端,如果相同,认证通过。
        
      

 [root@work ~]# /usr/bin/ssh -v localhost
        OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013                    第一阶段,双方确认协议版本号和ssh版本号
        debug1: Reading configuration data /etc/ssh/ssh_config
        debug1: Applying options for *
        debug1: Connecting to localhost [::1] port 22.
        debug1: Connection established.
        debug1: permanently_set_uid: 0/0
        debug1: identity file /root/.ssh/identity type -1
        debug1: identity file /root/.ssh/identity-cert type -1
        debug1: identity file /root/.ssh/id_rsa type 1
        debug1: identity file /root/.ssh/id_rsa-cert type -1
        debug1: identity file /root/.ssh/id_dsa type -1
        debug1: identity file /root/.ssh/id_dsa-cert type -1
        debug1: identity file /root/.ssh/id_ecdsa type -1
        debug1: identity file /root/.ssh/id_ecdsa-cert type -1
        debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
        debug1: match: OpenSSH_5.3 pat OpenSSH*
        debug1: Enabling compatibility mode for protocol 2.0
        debug1: Local version string SSH-2.0-OpenSSH_5.3
        debug1: SSH2_MSG_KEXINIT sent                            #第二阶段,双方确认/支持使用的数据加密算法,消息摘要算法,
        debug1: SSH2_MSG_KEXINIT received
        debug1: kex: server->client aes128-ctr hmac-md5 none
        debug1: kex: client->server aes128-ctr hmac-md5 none
        debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
        debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
        debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
        debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
        The authenticity of host localhost (::1) cant be established.
        RSA key fingerprint is 23:67:cf:22:2c:74:27:ec:29:e1:d9:a6:49:cd:4c:a2.
        Are you sure you want to continue connecting (yes/no)? yes
        Warning: Permanently added localhost (RSA) to the list of known hosts.
        debug1: ssh_rsa_verify: signature correct
        debug1: SSH2_MSG_NEWKEYS sent
        debug1: expecting SSH2_MSG_NEWKEYS
        debug1: SSH2_MSG_NEWKEYS received
        debug1: SSH2_MSG_SERVICE_REQUEST sent
        debug1: SSH2_MSG_SERVICE_ACCEPT received
        debug1: Authentications that can continue: publickey,password
        debug1: Next authentication method: publickey
        debug1: Trying private key: /root/.ssh/identity
        debug1: Offering public key: /root/.ssh/id_rsa
        debug1: Authentications that can continue: publickey,password
        debug1: Trying private key: /root/.ssh/id_dsa
        debug1: Trying private key: /root/.ssh/id_ecdsa
        debug1: Next authentication method: password                #第三阶段,进入身份验证的过程
        root@localhosts password:
        debug1: Authentication succeeded (password).
        debug1: channel 0: new [client-session]
        debug1: Requesting no-more-sessions@openssh.com
        debug1: Entering interactive session.                         
        debug1: Sending environment.
        debug1: Sending env LANG = en_US.UTF-8
        Last login: Wed May 31 16:41:45 2017 from 192.168.199.1

 



   4.2 公钥认证原理
      所谓的公钥认证,实际上是使用一对加密字符串,一个称为公钥(public key),任何人都可以看到其内容,用于加密;另一个称为密钥(private key)只有拥有者才能看到,用于解密。通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难。
    ssh 的公钥认证就是使用了这一特性。服务器和客户端都各自拥有自己的公钥和密钥。为了说明方便,以下将使用这些符号。
    Ac 客户端公钥
    Bc 客户端密钥
    As 服务器公钥
    Bs 服务器密钥
    在认证之前,客户端需要通过某种方法将公钥 Ac 登录到服务器上。
    认证过程分为两个步骤。
    会话密钥(session key)生成
    客户端请求连接服务器,服务器将 As 发送给客户端。
    服务器生成会话ID(session id),设为 p,发送给客户端。
    客户端生成会话密钥(session key),设为 q,并计算 r = p xor q。
    客户端将 r 用 As 进行加密,结果发送给服务器。
    服务器用 Bs 进行解密,获得 r。
    服务器进行 r xor p 的运算,获得 q。
    至此服务器和客户端都知道了会话密钥q,以后的传输都将被 q 加密。
    认证
    服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端
    客户端使用 Bc 解密 S(x) 得到 x
    客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话密钥
    服务器计算 q + x 的 md5 值 m(q+x)
    客户端将 n(q+x) 发送给服务器
    服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功



5、SSH安装  配置文件  详解

[root@work ~]# rpm -qa|grep openssh; rpm -ql openssh-server  
openssh-5.3p1-104.el6.x86_64
openssh-clients-5.3p1-104.el6.x86_64
openssh-askpass-5.3p1-104.el6.x86_64
openssh-server-5.3p1-104.el6.x86_64

全部配置文件
/etc/pam.d/ssh-keycat
/etc/pam.d/sshd
/etc/rc.d/init.d/sshd
/etc/ssh/sshd_config      服务端配置文件
/etc/ssh/ssh_config    客户端配置文件
/etc/sysconfig/sshd /usr/libexec/openssh/sftp-server /usr/libexec/openssh/ssh-keycat /usr/sbin/.sshd.hmac /usr/sbin/sshd /usr/share/doc/openssh-server-5.3p1 /usr/share/doc/openssh-server-5.3p1/HOWTO.ssh-keycat /usr/share/man/man5/moduli.5.gz /usr/share/man/man5/sshd_config.5.gz /usr/share/man/man8/sftp-server.8.gz /usr/share/man/man8/sshd.8.gz /var/empty/sshd

 



服务端配置文件/etc/ssh/sshd_config 详解

#       $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options change a
# default value.

#Port 22    SSH服务端口号
#AddressFamily any          #指定运行时使用的协议簇如果配置只使用了 IPV6,而系统内没有启用 IPV6、或 IPV6 协议没有得到有效配置,就可能会导致出现Cannot bind any address问题
#ListenAddress 0.0.0.0    #监听IPV4地址
#ListenAddress ::          #监听IPV6地址

# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2            #使用ssh2协议  也可以配置Protocol 2,1 代表i如果2协商不成功,再使用1 ,不建议配置

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key   # SSH version 1 使用的私钥 
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key  # SSH version 2 使用的 RSA 私钥 
#HostKey /etc/ssh/ssh_host_dsa_key  # SSH version 2 使用的 DSA 私钥 

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 1024

# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH    # 当有人使用 SSH 登入系统的时候,SSH会记录登陆信息,这个信息要记录在什么 daemon name 底下,预设是以 AUTH 来设定的,即是 /var/log/secure 里面 
SyslogFacility AUTHPRIV
#LogLevel INFO# 登录记录的等级 任何讯息!  QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3. 

# Authentication:

#LoginGraceTime 2m   当使用者连上 SSH server 之后,会出现输入密码的画面,在该画面中,在多久时间内没有成功连上 SSH server就断线!时间为秒! 
#PermitRootLogin yes     #定义是否允许root登陆
#StrictModes yes
#MaxAuthTries 6   最大登陆尝试次数
#MaxSessions 10  最大绘画连接数

#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys
#AuthorizedKeysCommand none
#AuthorizedKeysCommandRunAs nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you dont trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Dont read the users ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes# 定义是否使用密码登陆,如果准备使用公钥认证可以设置为no
#PermitEmptyPasswords no   # 定义是否允许空密码登陆.
PasswordAuthentication yes

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no     是否允许质疑-应答(challenge-response)认证。默认值是"yes"。
# Kerberos options 
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes
# GSSAPI options GSSAPIAuthentication no #用于Kerberos验证的,而对于绝大多数人来说,不可能使用这种验证机制的,所以要注意把他们停掉。
#GSSAPIAuthentication yes   #是否允许使用基于 GSSAPI 的用户认证。默认值为"no"。仅用于SSH-2。
#GSSAPICleanupCredentials yes GSSAPICleanupCredentials yes 是否在用户退出登录后自动销毁用户凭证缓存。默认值是"yes"。仅用于SSH-2。
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
# Set this to
yes to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of
"PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication,
then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to
no.
#UsePAM no
UsePAM yes 支持PAM,从而支持可**的安全模块,加载安全配置,如limit.conf等
# Accept locale
-related environment variables AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no X11Forwarding yes
#X11DisplayOffset
10
#X11UseLocalhost yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no   是否在交互式会话的登录过程中使用 login(1) 。默认值是"no"。
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression delayed 开启压缩选项
#ClientAliveInterval
0
#ClientAliveCountMax
3
#ShowPatchLevel no
UseDNS no #是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应。默认值为"yes"。
#PidFile
/var/run/sshd.pid
#MaxStartups
10:30:100
#PermitTunnel no
#ChrootDirectory none
# no default banner path
#Banner none
# override default of no subsystems
Subsystem sftp
/usr/libexec/openssh/sftp-server
# Example of overriding settings on a per
-user basis
#Match User anoncvs
# X11Forwarding no# 是否允许进行 X11 转发,如果允许X11转发并且sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。需要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器。如果启用了 UseLogin ,那么X11转发将被自动禁止。
# AllowTcpForwarding no
# ForceCommand cvs server

允许有1000次验证连接请求,如20秒不能完成校验,则断开验证连接请求 
有三次密码验证机会 
MaxStartups 1000 
LoginGraceTime 20 
MaxAuthTries 3


7、SSH 维护技巧

1、自动交互,密码以明文保存到本地(部署在本地可以直接免密码登陆)

1、 expect程序
#!/usr/bin/expect -f set timeout 10 set server [lindex $argv 0] set user [lindex $argv 1] set upasswd [lindex $argv 2] set rpasswd [lindex $argv 3] set "sudoers" [lindex $argv 4] set "Keys" [lindex $argv 5] set time [exec date +"%Y-%m-%d_%H:%M.%S"] log_file /home/mssh/program/log/host/$server$time spawn ssh -l $user $server -i "/root/.ssh/$Keys" expect { "yes/no)?\ " {send "yes\r";exp_continue} "Pass*" {send "$upasswd\r";exp_continue} "pass*" {send "$upasswd\r";exp_continue} #"*ass*" {send "$upasswd\r";exp_continue} "*@*" {send "$sudoers\r"} } expect { "pass*" {send "$rpasswd\r";exp_continue} "Pass*" {send "$rpasswd\r";exp_continue} "" {send "$rpasswd\r";exp_continue} "*令*" {send "$rpasswd\r";exp_continue} "#" interact }

 

调用执行程序
#!/bin/bash #rm -rf ./log/* PASSWDPath=/home/mssh/program/log/passwd.txt >/home/mssh/program/log/run.log if [ ! -d "/home/mssh/program/log/host" ]; then mkdir "/home/mssh/program/log/host" fi #cmd=`cat /home/mssh/program/config/hosts.txt | grep -w "$1"` host=`cat /home/mssh/program/config/hosts.txt | grep -w "$1"| awk -F "|" ‘{print $1}‘` user=`cat /home/mssh/program/config/hosts.txt | grep -w "$1"| awk -F "|" ‘{print $2}‘` upasswd=`cat /home/mssh/program/config/hosts.txt | grep -w "$1"| awk -F "|" ‘{print $3}‘` rpasswd=`cat /home/mssh/program/config/hosts.txt | grep -w "$1"| awk -F "|" ‘{print $4}‘` sudoers=`cat /home/mssh/program/config/hosts.txt | grep -w "$1"| awk -F "|" ‘{print $5}‘` keys=`cat /home/mssh/program/config/hosts.txt | grep -w "$1"| awk -F "|" ‘{print $8}‘` /home/mssh/program/mssh.exp $host $user $upasswd $rpasswd "$sudoers" "$keys"
密码文件格式: 
10.200
.64.221|gasd|123456|123456|su - root|JSSZ|JSSZ-AZ01-POD01-VRM-01|rd_rsa
(需要使用dos2unix  对密码文件进行转换,否则在读取密钥的时候会报 not accessible: No such file or directory.Linux和Windows文本文件的行结束标志不同。在Linux中,
文本文件用"/n"表示回车换行,而Windows用"/r/n"表示回车换行。有时候在Windows编写shell脚本时需要注意这个,否则shell脚本会报"No such file or directory"或"
command not found line x"之类的错误,如果不知晓前因后果,肯定会被这个折腾得相当郁闷。)


转换前
技术分享

 




转换后
技术分享

 


2、profile 增加相关配置,使用户登陆后记录详细日志文件到指定目录。最好结合ldap或windowsAD使用

export HISTTIMEFORMAT="[%F %T]"
# history
USER_IP=`who -u am i 2>/dev/null| awk {print $NF}|sed -e s/[()]//g`
USER=`who am i 2>/dev/null| awk {print $1}`
if [ "$USER_IP" = "" ]
then
  USER_IP=`hostname`
fi

if [ ! -d /tmp/.hist ]
then
   mkdir /tmp/.hist
   chmod 777 /tmp/.hist
fi

if [ ! -d /tmp/.hist/${LOGNAME} ]
then
    mkdir /tmp/.hist/${LOGNAME}
    chmod 300 /tmp/.hist/${LOGNAME}
fi
HISTSIZE=100000
export HISTSIZE
DT=`date "+%Y%m%d_%H%M%S"`
export DT
export DEL
HISTFILE="/tmp/.hist/${LOGNAME}/${USER}.hist"
chmod 600 /tmp/.hist/${LOGNAME}/*.hist 2>/dev/null
umask 022

9、SSH抓包分析

技术分享

技术分享

 

如来神掌第一式第三招----SSH详解