zoukankan      html  css  js  c++  java
  • 如来神掌第一式第三招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)' can't 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@localhost's 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 don't trust ~/.ssh/known_hosts for
    # RhostsRSAAuthentication and HostbasedAuthentication
    #IgnoreUserKnownHosts no
    # Don't read the user's ~/.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抓包分析

  • 相关阅读:
    phpcms列表页调用 点击量
    详解响应式布局设计
    PHPCMS V9 全站通用日期时间标签
    phpcms v9模板制作常用代码集合(转)
    Oracle 学习之 Select 1
    Oracle 学习之exists
    Hive学习之数据去重
    Hive学习之Union和子查询
    Clojure学习之defmulti
    Clojure学习之比线性箭头操作
  • 原文地址:https://www.cnblogs.com/Mahavairocana/p/6925908.html
Copyright © 2011-2022 走看看