首页 > 代码库 > 如来神掌第一式第三招----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)‘ 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抓包分析
如来神掌第一式第三招----SSH详解