SSH技术介绍和Xshell公钥远程登陆
SSH简介
传统的⽹络服务程序,⽐如,,,本质上都是不安全的,因为它们在⽹络上⽤明⽂传送数据、⽤户账号和⽤户⼝令,很容易受到攻击⽅式的攻击,攻击者会冒充真正的服务器接
收⽤户传给服务器的数据,然后再冒充⽤户把数据传给真正的服务器。
为了满⾜安全性的需求,的⽹络⼯作⼩组制定了Secure Shell(缩写为SSH),这是⼀项创建在和基础上的安全协议,为计算机上的提供安全的传输和使⽤环境。
SSH是⽬前较可靠,专为远程登录会话和其他⽹络服务提供安全性的协议。利⽤SSH协议可以有效防⽌远程管理过程中的信息泄漏问题。通过SSH可以对所有传输的数据进⾏加
密,也能够防⽌DNS欺骗和IP欺骗。
本⽂将会重点讨论SSH中⽤到的加密算法和建⽴安全连接的过程。
(为了把题⽬中的Xshell写出来,具体ssh介绍放在最后⾯了)
使⽤密钥登录分为3步:
1、⽣成密钥(公钥与私钥);
2、放置公钥(Public Key)到服务器~/.ssh/authorized_key⽂件中;
3、配置ssh客户端使⽤密钥登录。
xshell7产品激活密钥1.1 ⽣成密钥(公钥与私钥)
打开Xshell,在菜单栏点击“⼯具”,在弹出的菜单中选择“(新建⽤户密钥⽣成向导)”,弹出“新建⽤户秘钥⽣成向导”对话框,在“秘钥类型”项选择“RSA”公钥加密算法,“秘钥长度”选
择任意密钥长度,长度越长,安全性越⾼,点击“下⼀步”,等待密钥⽣成
继续下⼀步,在“秘钥名称”中输⼊Key的⽂件名称,我这⾥为“id_rsa_2048(2)”;在“加密密码”处输⼊⼀个密码⽐如12345678⽤于加密私钥,并再次输⼊密码确认,点击“下⼀步”,
密钥⽣成完毕(Public key Format选择SSH2-OpenSSH格式),这⾥显⽰的是公钥,我们可以复制公钥然后再保存,也可以直接保存公钥到⽂件,如下图。
点击“保存为⽂件”按钮,将公钥(Public key)保存到磁盘,⽂件名为“xxxxxxx”,备⽤。最后点击“完成”即可。
公钥保存完后,接下来为私钥⽂件。点击“导出”,导出为私钥⽂件,⽤来打开刚才的公钥。请妥善保管。
点击“保存”后,会弹出⼀个框,输⼊刚才设置的密码12345678.在点击“确定”即可。
1.2 放置公钥(Public Key)到服务器~/.ssh/authorized_key⽂件中
上⾯的步骤只是⽣成了公钥和私钥的过程,接下来就是要将刚才⽣成的公钥放到要管理的服务器上。
使⽤到Xshell登录到服务器,进⼊到“/root/.ssh/”⽬录,使⽤Xfile将公钥传到服务器上。
然后运⾏如下命令,将公钥(Public Key)导⼊到“authorized_keys”⽂件:
[root@mysql-db01 ~]# cd .ssh/
[root@mysql-db01 .ssh]# ls
authorized_keys known_hosts
[root@mysql-db01 .ssh]# rz -E
rz waiting to receive.
[root@mysql-db01 .ssh]# ls
authorized_keys known_hosts laomao.pub
[root@mysql-db01 .ssh]# cp authorized_keys authorized_keys.bak
[root@mysql-db01 .ssh]# cat laomao.pub >authorized_keys
[root@mysql-db01 .ssh]# cat authorized_keys
ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAYEAybjy7/DVWxXm4lcXFA+x0bgBMi+aQ6zIzyBfFSKJEMhAhs/MxbKHOl1c1GwzPSAKLAHoR8UZSQO7QQcYKqeb8cNWR8f9NGNBCJs+e6Fpl7BvNPKfNrixnq+ db01 .ssh]#
[root@m01 .ssh]# chmod 600 authorized_keys
[root@m01 .ssh]#
1.3 配置ssh客户端使⽤密钥登录
打开Xshell,点击“新建”按钮,弹出“New Session Properties”对话框,在“连接”栏⽬中,输⼊刚刚配置好公钥(Public Key)的IP地址和端⼝,如下图所⽰:
在⽤户⾝份认证的窗⼝输⼊认证⽅法为“public key”
从⽤户秘钥出选择刚⽣成的私钥⽂件,并在下⾯的密码框中输⼊刚才设置的密码123456(可以和系统登陆密码不⼀样)
现在就可以使⽤公钥登陆了,浏览选择⽤户秘钥位置,然后输⼊上⾯刚刚设置的密码“123456”,点击“确定”,即可登陆。经过了上⾯的ssh秘钥配置后,我们就可以通过在
Publish over SSH插件中使⽤秘钥来管理服务器了。注意,服务器上存放的是上⾯⽣成的公钥,Jenkins上存放的是⽣成的私钥⽂件。
使⽤到的技术
为了保证信息传输的安全性,SSH使⽤了对称加密、⾮对称加密和散列等技术。
对称加密
对称密钥加密⼜称为对称加密、私钥加密、共享密钥加密,是密码学中⼀类加密算法。这类算法在加密和解密时使⽤相同的密钥,或是使⽤两个可以简单地相互推算的密钥。
SSH使⽤对称密钥加密整个连接过程中传输的信息。值得注意的是,⽤户⾃⼰创建的public/private密钥对仅仅⽤于验证,不会⽤在加密连接上。对称加密允许对密码进⾏⾝份验
证,以防⽌第三⽅窥探。
共享密钥通过密钥交换算法⽣成,它可以让双⽅在完全没有对⽅任何预先信息的条件下通过不安全信道创建起⼀个密钥。客户端和服务端都参与了这个过程,过程的细节将在后
⾯阐述。
⽣成的密钥将⽤来加密这次会话过程中客户端和服务端传输的数据。这个过程会在验证客户⾝份之前完成。
SSH⽀持多种对称密钥算法,包括AES,Blowfish,3DES,CAST128和Arcfour。客户端和服务端可以配置采⽤算法的列表。客户端列表中第⼀个能被服务端⽀持的算法将被采
⽤。
⽐如在Ubuntu 14.04上,客户端和服务端默认的配置如下:aes128 也就是说,如果两台Ubuntu 14.04采⽤默认配置,它们总是会采⽤aes128-ctr算法来加密连接。
⾮对称加密
在⾮对称加密⽅法中,需要⼀对密钥,⼀个是私钥,⼀个是公钥。这两个密钥数学相关。⽤公钥加密后所得的信息,只能⽤私钥才能解密。如果知道了其中⼀个,并不能计算另外⼀个。因此,如果公开了⼀对密钥中的⼀个,并不会危害到另外⼀个的秘密性质。
SSH在⼀些地⽅使⽤了⾮对称加密。
在密钥交换过程中使⽤到了⾮对称加密。在这个阶段,客户端和服务端⽣成临时密钥对,并且交换公钥来⽣成共享密钥。
在⾝份验证的过程中也使⽤了⾮对称加密。SSH密钥对⽤来向服务端验证客户端⾝份。客户端创建⼀对密钥,然后将公钥上传到远程服务器上,写⼊⽂件
~/.ssh/authorized_keys。
在创建共享密钥后,客户端必须向服务端证明⾝份。服务端会使⽤⽂件中的公钥加密⼀段信息,并将加
密后的信息发送给客户端。如果客户端可以能够破解这段信息,那么就能够证明⾃⼰拥有相关的私钥。之后服务端会为客户端设置shell环境。
散列
散列是电脑科学中⼀种对资料的处理⽅法,它通过某种特定的算法将要检索的项与涌来检索的索引关联起来,⽣成⼀种便于搜索的数据结构(散列表)。它也常⽤做⼀种资讯安全的⽅法,由⼀串资料中经过散列算法计算出来的资料指纹,来识别档案和资料是否有被篡改。
SSH主要使⽤了散列消息认证码(Keyed-hash message authentication code,缩写为HMAC),来确认消息没有被篡改。
上⾯提到的对称加密协商过程中,会使⽤消息认证码(MAC)算法。这个算法会从客户端⽀持的算法中选出。
在密钥协商完成后,所有的消息都必须携带MAC,⽤于通信双⽅验证消息的⼀致性。MAC值由共享密钥,消息的分组序列和实际消息内容计算得到。
在对称加密区域之外,MAC本⾝作为分组的最后部分被发送。研究者通常建议先机密数据,然后计算MAC
SSH⼯作流程
SSH协议采⽤客户端-服务端模型对两⽅进⾏⾝份验证,并对它们之间的数据进⾏加密。
服务端在指定端⼝监听连接请求。它负责协商安全连接,认证连接⽅,并为客户端⽣成正确的shell环境。
客户端负责协商安全连接,验证服务器的⾝份是否与以前记录的信息相匹配,并提供凭证进⾏⾝份验证。
SSH会话分为两个阶段。第⼀个是同意和建⽴加密来保护未来的沟通。第⼆个阶段是对⽤户进⾏⾝份验证,并发现是否应该授予对服务器的访问权限。
会话加密协商
当客户端发起请求后,服务端返回⽀持的协议版本。如果客户端可以匹配其中⼀个协议版本,则连接继续。服务端会提供它的公共主机密钥,客户端可以⽤这个密钥来验证服务端是否合法。
此时,通信双⽅采⽤迪菲-赫尔曼算法来协商会话密钥。
该算法的⼤致过程如下:
1. 双⽅协定共享⼀个⼤素数。
2. 双⽅协定⼀个加密算法。
3. 双⽅各⾃⽣成⼀个素数,并保密。这个素数将作为私钥。
4. 双⽅使⽤协定的算法,由各⾃的私钥和共享的素数计算得到公钥。
5. 双⽅交换⽣成的公钥。
6. 双⽅使⽤各⾃的私钥,另外⼀⽅的公钥和共享的素数,计算得到⼀个共享密钥。双⽅计算得到的共享密钥应该是⼀样的。
7. 使⽤共享密钥加密后⾯的会话。
⽤于其余连接的共享密钥加密被称为⼆进制数据包协议。上述过程允许双⽅平等地参与⽣成共享密钥。
⽣成的密钥是对称密钥,这意味着⽤于加密消息的密钥也可以⽤于解密。其⽬的是将后⾯的通信包装在不能被外部⼈员解密的加密隧道中。
在⽣成会话密钥后,就开始进⾏⽤户⾝份验证。
验证⽤户⾝份
根据服务器接受的⽅式,有⼏种不同的⽅法可⽤于⾝份验证。
最简单的⽅法是密码验证,其中服务器要求客户端输⼊尝试登陆账号的密码。密码是通过协商加密发送的。
虽然密码被加密,但由于密码的复杂性受到限制,因此通常不建议使⽤此⽅法。与其他⾝份验证的⽅法相⽐,⾃动脚本相对容易攻破正常长度的密码。
最为推荐的选择是使⽤SSH密钥对。SSH密钥对是⾮对称密钥。
公钥⽤于加密只能⽤私钥解密的数据。公钥可以⾃由共享,因为没有从公钥中导出私钥的⽅法。
验证流程如下:
1. 客户端⾸先向服务端发送密钥对的ID。
2. 服务端检查⽂件authorized_keys寻该ID的公钥。
3. 如果到,服务端⽣成⼀个随机数,并使⽤公钥加密这个数。
4. 服务端将加密后的信息发送给客户端。
5. 如果客户端拥有对应的私钥,那么就能使⽤私钥解密消息,得到服务端⽣成的随机数。
6. 客户端使⽤解密后的数和会话使⽤的共享密钥得到⼀个值,然后计算这个值的MD5散列值。
7. 客户端将这个MD5散列值发送回服务端。
8. 服务端⽤会话共享密钥和⽣成的随机值计算得到⾃⼰的MD5散列值。然后⽐较客户端传回的值和⾃⾝⽣成的值。如果匹配,则证明客户端拥有私钥,客户端验证通过。
可以看到,密钥的不对称性允许服务端使⽤公钥加密消息给客户端。然后,客户端可以通过正确解密消息来证明它拥有私钥。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论