[前言]
[由于业务需要,最近在云上新购买了一批centos7.0的服务器,用脚本批量添加了用户(脚本请见我之前的博客/秘钥认证用户自动控制:]](http://my.oschina.net/pwd/blog/388254)[),加完秘钥之后发现,但是secureCRT抛出了一下异常。]
[解决过程:]
[1.初步怀疑秘钥有问题,通过命令行去探测是否可以连接,-> ssh -i 秘钥文件 用户名@主机,发现能正常连接,确认秘钥是OK的。]
[2.可能出在secureCRT配置问题,具体操作不详解了,主要是涉及客户端一些可视化的设置,捣鼓完以后没好。]
[3.根据以上报错联想,可能是这个secureCrt 不支持以上的加密算法,上面已经明确的提示了,于是验证了xshell和putty,以及高版本的SecureCRT是可以连接.]
[常见终端客户端的介绍请戳链接: ]
[由于低版本 SecreCRT 不支持 AES-128-CBC 这个 Cipher,而 Linux 下用 ssh-keygen 生成的公钥默认采用这个 Cipher的,于是对应的私钥可能会加载不了,所以登陆不上。]
[思考和学习]
[参考:http://blog.csdn.net/macrossdzh/article/details/5691924]
一、什么是 SSH
SSH 是英文 Secure Shell 的简写形式。通过使用 SSH,你可以把所有传输的数据进行加密,这样 " 中间人 " 这种攻击方式就不可能实现了,而且也能够防止 DNS 欺骗和 IP 欺骗。使用 SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH 有很多功能,它既可以代替 Telnet,又可以为 FTP、Pop、甚至为 PPP 提供一个安全的 " 通道 "。
二、SSH 基本框架
SSH 协议框架中最主要的部分是三个协议:
- 传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性 等的支持;
- 用户认证协议(The User Authentication Protocol) 则为服务器提供客户端的身份鉴别;
- 连接协议(The Connection Protocol) 将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用; 各种高层应用协议可以相对地独立于 SSH 基本体系之外,并依靠这个基本框架,通过连接协议使用 SSH 的安全机制。
同时 SSH 协议框架中还为许多高层的网络安全应用协议提供扩展的支持。它们之间的层次关系可以用如下图来表示:
三、主机密钥机制
对于 SSH 这样以提供安全通讯为目标的协议,其中必不可少的就是一套完备的密钥机制。由于 SSH 协议是面向互联网网络中主机之间的互访与信息交换,所以主机密钥成为基本的密钥机制。也就是说,SSH 协议要求每一个使用本协议的主机都必须至少有一个自己的主机密钥对,服务方通过对客户方主机密钥的认证之后,才能允许其连接请求。一个主机可以使用多个密钥,针对不同的密钥算法而拥有不同的密钥,但是至少有一种是必备的,即通过 DSS 算法产生的密钥。关于 DSS 算法,请参考 [FIPS-186]。
SSH 协议关于主机密钥认证的管理方案有两种,如下图所示:
每一个主机都必须有自己的主机密钥,密钥可以有多对,每一对主机密钥对包括公开密钥和私有密钥。在实际应用过程中怎样使用这些密钥,并依赖它们来实现安全特性呢?如上图所示,SSH 协议框架中提出了两种方案。
在第一种方案中,主机将自己的公用密钥分发给相关的客户机,客户机在访问主机时则使用该主机的公开密钥来加密数据,主机则使用自己的私有密钥来解密数据,从而实现主机密钥认证,确定客户机的可靠身份。在图 2(a)中可以看到,用户从主机 A 上发起操作,去访问,主机 B 和主机 C,此时,A 成为客户机,它必须事先配置主机 B 和主机 C 的公开密钥,在访问的时候根据主机名来查找相应的公开密钥。对于被访问主机(也就是服务器端)来说则只要保证安全地存储自己的私有密钥就可以了。
在第二种方案中,存在一个密钥认证中心,所有系统中提供服务的主机都将自己的公开密钥提交给认证中心,而任何作为客户机的主机则只要保存一份认证中心的公开密钥就可以了。在这种模式下,客户机在访问服务器主机之前,还必须向密钥认证中心请求认证,认证之后才能够正确地连接到目的主机上。
很显然,第一种方式比较容易实现,但是客户机关于密钥的维护却是个麻烦事,因为每次变更都必须在客户机上有所体现;第二种方式比较完美地解决管理维护问题,然而这样的模式对认证中心的要求很高,在互联网络上要实现这样的集中认证,单单是权威机构的确定就是个大麻烦,有谁能够什么都能说了算呢?但是从长远的发展来看,在企业应用和商业应用领域,采用中心认证的方案是必要的。
另外,SSH 协议框架中还允许对主机密钥的一个折中处理,那就是首次访问免认证。首次访问免认证是指,在某客户机第一次访问主机时,主机不检查主机密钥,而向该客户都发放一个公开密钥的拷贝,这样在以后的访问中则必须使用该密钥,否则会被认为非法而拒绝其访问。
四、SSH 的工作过程
在整个通讯过程中,为实现 SSH 的安全连接,服务器端与客户端要经历如下五个阶段:
* 版本号协商阶段,SSH 目前包括 SSH1 和 SSH2 两个版本, 双方通过版本协商确定使用的版本
* 密钥和算法协商阶段,SSH 支持多种加密算法, 双方根据本端和对端支持的算法,协商出最终使用的算法
* 认证阶段,SSH 客户端向服务器端发起认证请求, 服务器端对客户端进行认证
* 会话请求阶段, 认证通过后,客户端向服务器端发送会话请求
* 交互会话阶段 ,会话请求通过后,服务器端和客户端进行信息的交互
1 . 版本号协商阶段
1. 服务器打开端口 22,等待客户端连接。
2. 客户端向服务器端发起 TCP 初始连接请求,TCP 连接建立后,服务器向客户端发送第一个报文,包括版本标志字符串,格式为 “SSH-< 主协议版本号 >.< 次协议版本号 >-< 软件版本号 >”,协议版本号由主版本号和次版本号组成,软件版本号主要是为调试使用。
3. 客户端收到报文后,解析该数据包,如果服务器端的协议版本号比自己的低,且客户端能支持服务器端的低版本,就使用服务器端的低版本协议号,否则使用自己的协议版本号。
4. 客户端回应服务器一个报文,包含了客户端决定使用的协议版本号。服务器比较客户端发来的版本号,决定是否能同客户端一起工作。
5. 如果协商成功,则进入密钥和算法协商阶段,否则服务器端断开 TCP 连接。
Note: 版本号协商阶段报文都是采用明文方式传输的。
2. 密钥和算法协商阶段
1. 服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等;
2. 服务器端和客户端根据对端和本端支持的算法列表得出最终使用的算法。
3. 服务器端和客户端利用 DH 交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话 ID。
通过以上步骤,服务器端和客户端就取得了相同的会话密钥和会话 ID。
* 对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全
* 在认证阶段,两端会使用会话 ID 用于认证过程。
Note:
在协商阶段之前,服务器端已经生成 RSA 或 DSA 密钥对,他们主要用于参与会话密钥的生成。
3. 认证阶段
1. 客户端向服务器端发送认证请求,认证请求中包含用户名、认证方法、与该认证方法相关的内容(如:password 认证时,内容为密码)。
2. 服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。
3. 客户端从认证方法列表中选取一种认证方法再次进行认证。
4. 该过程反复进行, 直到认证成功或者认证次数达到上限, 服务器关闭连接为止。
SSH 提供两种认证方式:
1. password 认证:客户端向服务器发出 password 认证请求,将用户名和密码加密后发送给服务器;服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败的消息。
2. publickey 认证:采用数字签名的方法来认证客户端。目前,设备上可以利用 RSA 和 DSA 两种公共密钥算法实现数字签名。客户端发送包含用户名、公共密钥和公共密钥算法的 publickey 认证请求给服务器端。服务器对公钥进行合法性检查,如果不合法,则直接发送失败消息;否则,服务器利用数字签名对客户端进行认证,并返回认证成功或失败的消息
SSH2.0 还提供了 password-publickey 认证和 any 认证:
1. password-publickey 认证:指定该用户的认证方式为 password 和 publickey 认证同时满足。客户端版本为 SSH1 的用户只要通过其中一种认证即可登录;客户端版本为 SSH2 的用户必须两种认证都通过才能登录。
2. any 认证:指定该用户的认证方式可以是 password,也可以是 publickey。
4. 会话请求阶段
1. 服务器等待客户端的请求;
2. 认证通过后,客户端向服务器发送会话请求;
3. 服务器处理客户端的请求。请求被成功处理后, 服务器会向客户端回应 SSH_SMSG_SUCCESS 包,SSH 进入交互会话阶段;否则回应 SSH_SMSG_FAILURE 包,表示服务器处理请求失败或者不能识别请求。
5. 交互会话阶段
在这个模式下,数据被双向传送:
1. 客户端将要执行的命令加密后传给服务器;
2. 服务器接收到报文,解密后执行该命令, 将执行的结果加密发还给客户端;
3. 客户端将接收到的结果解密后显示到终端上.
五、SSH 的应用
首先,SSH 最常见的应用就是,用它来取代传统的 Telnet、FTP 等网络应用程序,通过 SSH 登录到远方机器执行你想进行的工作与命令。在不安全的网路通讯环境中,它提供了很强的验证(authentication)机制与非常安全的通讯环境。实际上,SSH 开发者的原意是设计它来取代原 UNIX 系统上的 rcp、rlogin、rsh 等指令程序的;但经过适当包装后,发现它在功能上完全可以取代传统的 Telnet、FTP 等应用程序。
传统 BSD 风格的 r 系列指令(如 rcp,rsh,rlogin)往往都被视为不安全的,很容易就被各种网络攻击手段所破解,几乎所有找得到有关 UNIX 安全的书或文件,都会一而再、再而三地警告系统管理者,留心 r 系列指令的设定,甚至要求系统管理者将 r 系列指令通通关闭。
而用来替代 r 系列指令的 SSH,则在安全方面做了极大的强化,不但对通讯内容可以进行极为安全的加密保护,同时也强化了对身份验证的安全机制,它应用了在密码学(Cryptography)中已发展出来的数种安全加密机制,如 Symmetric Key Cryptography,Asymmetric Key Cryptography, One-way Hash Function,Random-number Generation 等,来加强对于身份验证与通讯内容的安全保护。通讯时资料的加密有 IDEA,three-key triple DES,DES,RC4-128,TSS,Blowfish 等数种多种安全加密算法可供选择,加密的 key 则是通过 RSA 进行交换的。资料的加密可以对抗 IP spoofing,RSA 这种非对称性的加密机制则可用来对抗 DNS spoofing 与 IP routing spoofing,同时 RSA 也可以进行对主机身份的验证。
其次,通过使用用 SSH 可以在本地主机和远程服务器之间设置 " 加密通道 ",并且这样设置的 " 加密通道 " 可以跟常见的 Pop 应用程序、X 应用程序、Linuxconf 应用程序相结合,提供安全保障。
SSH 的 " 加密通道 " 是通过 " 端口转发 " 来实现的。你可以在本地端口(没有用到的)和在远程服务器上运行的某个服务的端口之间建立 " 加密通道 "。然后只要连接到本地端口。所有对本地端口的请求都被 SSH 加密并且转发到远程服务器的端口。当然只有远程服务器上运行 SSH 服务器软件的时候 " 加密通道 " 才能工作。
六、SSH Q&A
Q1: SSH 的版本和区别。
SSH2 避免了 RSA 的专利问题,并修补了 CRC 的缺陷。SSH2 用数字签名算法(DSA)和 Diffie-Hellman(DH)算法代替 RSA 来完成对称密钥的交换,用 HMAC 来代替 CRC。同时 SSH2 增加了 AES 和 Twofish 等对称加密算法。
A1: SSH(Secure SHell) 到目前为止有两个不兼容的版本——SSH1 和 SSH2。SSH1 又分为 1.3 和 1.5 两个版本。SSH1 采用 DES、3DES、 Blowfish 和 RC4 等对称加密算法保护数据安全传输,而对称加密算法的密钥是通过非对称加密算法(RSA)来完成交换的。SSH1 使用循环冗余校验码(CRC)来保证数据的完整性,但是后来发现这种方法有缺陷。
更多内容请参考 The SSHv1 Protocol & The SSHv2 Protocol
Q2: 什么是 HMAC?
A2: HMAC(Hash Message Authentication Code) ,散列消息鉴别码,基于密钥的 Hash 算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即 MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
Q3: 什么是 X11 forwarding?
A3: sh 的 X11 forwarding 特性可以使 X client 和 X server 安全地通讯。使用 X11 forwarding 后,从 X client 到 X Server 方向的数据先被送至 ssh server,ssh server 利用和 ssh client 的安全通道转发给 ssh client,再由 ssh client 转发给 X server,从 X server 到 X client 的数据流同理。这里 ssh server 和 ssh client 充当了 X client 和 X server 间数据的转发器,由于 ssh server 和 X client、ssh client 和 X server 一般在同一台机器上,它们之间是一种安全的进程间通讯,而 ssh server 和 ssh client 间的通讯也是安全的,所以 X client 和 X server 间的通讯就是安全的。
Q4: 什么是 TTY?
A4: 终端是一种字符型设备,它有多种类型,通常使用 tty 来简称各种类型的终端设备。tty 是 Teletype 的缩写。Teletype 是最早出现的一种终端设备,很象电传打字机,是由 Teletype 公司生产的。设备名放在特殊文件目录 /dev/ 下。
Q5: 简单描述下 SSH 运行的过程?
A5: 简要过程如下:
* Client 端向 Server 端发起 SSH 连接请求。
* Server 端向 Client 端发起版本协商。
* 协商结束后 Server 端发送 Host Key 公钥 Server Key 公钥,随机数等信息。到这里所有通信是不加密的。
* Client 端返回确认信息,同时附带用公钥加密过的一个随机数,用于双方计算 Session Key。
* 进入认证阶段。从此以后所有通信均加密。
* 认证成功后,进入交互阶段。