SSH登录详解
SSH(SecureShell),是建立在应用层基础上的安全协议,其SSH客户端适用于多种平台,可以有效防止远程管理过程中的信息泄露问题。
1.SSH发展历史
-
SSH1.x
SSH是1995年由芬兰赫尔辛基大学研究员Tatu Ylönen提出用于替代Telnet等非安全协议的远程Shell协议。SSH1.x通过CRC-32避免数据被篡改,后来逐步演化为私有软件。
-
SSH2.x
由IETF工作小组发布SSH-2标准。采用MD5和SHA-1实现通信的完整性,安全性优于SSH-1。
-
OpenSSH
目前最流行的SSH实现的开源版本,具有可移植性,一直维护并支持SSH-2协议,目前很多操作系统中默认安装的版本。
2.SSH加密原理
互联网上的数据传输,若未经加密,请求可能会被其他恶意拦截轻松获取账号密码等信息,可通过数据加密的方式进行避免。加密的方式主要有两种:
-
对称加密(秘钥加密),即客户端和服务端使用同一套秘钥对数据进行加密和解密,如下图1所示。对称加密的加密强度高,破解难度大。但是在多个客户端和服务端安全的保存秘钥是一个比较困难的操作,一个秘钥被泄露,则整个系统会失去安全性。
-
非对称加密(公钥加密),为解决一个秘钥的问题,非对称加密应运而生。非对称加密有一个公钥和一个私钥,公钥加密后的数据只能通过对应的私钥解密(反之亦然),而通过公钥推出私钥的可能性微乎其微。SSH即通过非对称加密完成用户登录。
3.SSH工作流程
从客户端的角度来看,SSH提供两种级别的安全验证。分别为基于口令(密码)的安全验证和基于公钥的安全验证。
-
密码登录:密码登录流程如下图2所示。
Server收到Client用户的登录请求,Server将自己的公钥发送给用户;
Client使用公钥将自己的密码加密
Client将加密后的数据发送至Server端
Server端使用对应的私钥解密数据,然后验证其合法性
如果密码正确,Server同意用户登录
私钥是Server端独有的,从而保证了网络传输过程中登录数据的安全性。但是实施的过程中存在一个风险:比如攻击者插在用户与远程主机间,冒充Server端将伪造的公钥发送给用户,即可获取用户的密码登录远程主机。这就是所谓的中间人攻击。
SSH设计通过口令确认的方式避免中间人攻击。如果用户是第一次登录Server,系统会出现如下提示:
ssh xxx@xxx
The authenticity of host 'host (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
提示的信息主要表达的意思是:“无法确认主机xxx的真实性,其公钥指纹为xxx,是否继续登录?”由于公钥长度较长难以比对,提示信息中将其经过MD5计算转换为128位的指纹便于比较。而为确保用户能比对公钥指纹,Server需在自己的网站上贴出自己的公钥指纹用于用户核对。
若用户同意连接该Server后,系统会提示用户该host已被确认并被追加到文件known_hosts文件中以便下次登录时跳过警告。然后即可输入密码按上述流程登录。
每个SSH用户(client端)都有自己的known_hosts文件, 此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。
-
公钥登录:密码登录的一个问题在于,每次登录都要输入密码。为避免多次登录的麻烦,SSH提供了另一种可以免密的登录方式:公钥登录。
Client将自己的公钥存放在Server端,追加到authorized_keys文件中。
Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey(R)
,然后将加密后信息发送给Client。
Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
Server端会最后比较Digest1和Digest2是否相同,完成认证过程。
此后登录服务器就不再需要密码。比如git使用SSH登录,就可以在git下设置和管理SSH公钥,如下图所示。
4.SSH密钥相关工具
依托于不同的操作系统,SSH密钥生成和客户端登录各有其不同的工具。
Linux系统 |
Windows系统 |
|
生成密钥 |
ssh-keygen |
keygen.exe Xshell |
客户端登录 |
ssh命令 |
Putty Xshell |
5.SSH密钥格式
由SSH的发展历史可见,SSH有SSH1.x、SSH2.x(IETF)、openssh等不同的版本,因此也定义了不同的密钥格式。puttygen.exe可生成IETF格式的密钥,ssh-kengen生成openssh格式的密钥,xshell则可选择所需格式。
-
SSH1格式:公钥格式为所有字段以单个空格符分隔,各字段依次为选项、位数、指数、系数、注释。第一个字段是可选的,表示该条目(行)是否以数字开头,选项字段不会以数字开头。最后一个字段注释,如果在生成密钥时没有给定注释,默认注释为密钥的创建者(一般就是 username@hostname 这种格式),注释仅仅是提供给用户查看密钥时作为一个辨识标记,在 SSH 使用中没有任何作用。
1024 35 127622522440000403693297547695512386039512623330270038753455316326495028304745444916417839627801075110249968608231245340093104912581642154883517309431162302400461903792227044870802907303974666069054112219556551766494201399889464578628657768414291418705994169562594444590440509069669981690177202614753409732391 ting@test.com
-
IETF格式
---- BEGIN SSH2 PUBLIC KEY ----
AAAAB3NzaC1yc2EAAAABIwAAAIEAtb2RtaDk8zTC28y20mHxLV
swAQDl4rCno3t/kfFhW1oRQxF7kQSQ6cg0y9K7stK7Vb6tCZED
LA39jVKHEQpzgQ+sb17691QtaFyBubMn1hpw/1fDq2W2lDL9C/
QmbjO7pDi6mnXTXxBsxF3PgLkck3KZtaafLe/uwTCB3behjyc=
---- END SSH2 PUBLIC KEY ----
-
openssh格式:公钥格式为所有字段以单个空格符分隔,各字段依次为选项、密钥类型(keytype)、base64编码后的密钥、注释。第一个字段是可选的,表示该条目(行)是否以数字开头,选项字段不会以数字开头。最后一个字段注释,如果在生成密钥时没有给定注释,默认注释为密钥的创建者(一般就是 username@hostname 这种格式),注释仅仅是提供给用户查看密钥时作为一个辨识标记,在 SSH 使用中没有任何作用。密钥类型(keytype)可能是 ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521, ssh-ed25519, ssh-dss 或 ssh-rsa。
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAtb2RtaDk8zTC28y20mHxLVswAQDl4rCno3t/kfFhW1oRQxF7kQSQ6cg0y9K7stK7Vb6tCZEDLA39jVKHEQpzgQ+sb17691QtaFyBubMn1hpw/1fDq2W2lDL9C/QmbjO7pDi6mnXTXxBsxF3PgLkck3KZtaafLe/uwTCB3behjyc= ting
参考文章:
-
《图解SSH原理》
https://www.jianshu.com/p/33461b619d53
-
《SSH的发展历程与基本原理》
https://www.cnblogs.com/harrymore/p/8627345.html#_label1_3
-
《[Linux] ssh-key 公钥文件格式》
https://www.cnblogs.com/ifantastic/p/3984544.html
-
《SSH原理与运用(一):远程登录》
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
-
《SSH密钥对登录的原理和实践》
https://www.cnblogs.com/zhouhaibing/p/7679706.html