如来神掌第一式第三招----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再次解密数据,得到质询。
            客户端使用会话密钥加密质询,发送给服务端。
            服务端使用会话密钥解密报文,得到质询,判断是不是自己生成的那个质询,如果不相同,发送失败消息给客户端,如果相同,认证通过。

 [[email protected] ~]# /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                #第三阶段,进入身份验证的过程
        [email protected]‘s password:
        debug1: Authentication succeeded (password).
        debug1: channel 0: new [client-session]
        debug1: Requesting no-more-[email protected]
        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安装  配置文件  详解

[[email protected] ~]# 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抓包分析

时间: 2024-10-29 08:48:10

如来神掌第一式第三招----SSH详解的相关文章

查看登陆系统用户的信息的三种方法详解

查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [OPTION]... [ FILE | ARG1 ARG2 ] 1.参数:-u,显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串. 例如: 2.参数:-m,此参数的效果和指定"a

Dijkstra算法(三)之 Java详解

前面分别通过C和C++实现了迪杰斯特拉算法,本文介绍迪杰斯特拉算法的Java实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想

Kruskal算法(三)之 Java详解

前面分别通过C和C++实现了克鲁斯卡尔,本文介绍克鲁斯卡尔的Java实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的代码说明 6. 克鲁斯卡尔算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的

哈夫曼树(三)之 Java详解

前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树. 这

数据库三个范式详解

数据库三个范式详解 数据库范式的提出是为了对关系数据库中的数据进行规范而提出的一个概念,第一范式,第二范式,第三范式这三个范式逐渐对数据进行细分,意思就是指属于这三种范式之一的关系数据库的数据相互之间的依赖关系越来越清晰明了.下面对三种范式进行详细的讲解. 第一范式(1NF):属于第一范式的数据库的表的列(属性)是不能再进一步拆分的.如 学号 课程 2014212797 软件技术基础   高数 很显然,这个表格的第二列是可以在细分的,所以不属于第一范式.第一范式是数据库数据的最低要求,不满足第一

elasticsearch系列三:索引详解(分词器、文档管理、路由详解)

一.分词器 1. 认识分词器  1.1 Analyzer   分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如处理文本中的html标签字符.处理完后再交给tokenizer进行分词.一个analyzer中可包含0个或多个字符过滤器,多个按配置顺序依次进行处理. tokenizer:分词器,对文本进行分词.一个analyzer必需且只可包含一个tokenizer. token filter:词项过滤器,对to

C++11 并发指南三(std::mutex 详解)

C++11 并发指南三(std::mutex 详解) 上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文件中,所以如果你需要使用 std::mutex,就必须包含 <mutex> 头文件. <mutex> 头文件介绍 Mu

Spring笔记(三):Aop详解

一.Aop原理 (一)动态代理 1.详见:java进阶(七):详解JAVA代理 2.主要是Proxy 与 InvocationHandle r接口 (二)Cglib 实现 1.主要是 Enhancer 和 MethodInterceptor 接口 2.实现代码如下: <span style="font-size:18px;"> /** * 利用 cglib 实现 * @param targrt * @return */ public static Object getCgP

Mybatis(三) 映射文件详解

前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输入映射 输入映射:配置statement中输入参数的类型.有四种 1.1.传递简单类型,八大基本类型,比如int类型 findUserById:根据id进行查询对应user,那么传入的就应该是int类型的值.所以使用别名int来映射传入的值 1.2.传递pojo(代表正常的对象,比如user的jav