@gy-ban
2016-11-20T11:51:04.000000Z
字数 2005
阅读 639
技术
SSH是一种网络协议,用语计算机之间的加密登录。
早期的互联网之间的通讯都是明文的,如果中间有人截获信息,内容都暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。
但SSH只是一种协议,存在多种实现,目前使用最广泛的是OpenSSH,它是一个开源软件。
openssh是系统自带的软件,主要openssh-server和openssh-clients两个软件包。主要使用的命令是ssh。
[root@gy-vm02 ~]# ssh root@gy-vm03
root表示你要用来远程登录的用户,gy-vm03表示远程主机host。
如果你本地当前用户和你想要远程登录的用户一致,那么你可以使用下面的方式进行登录
[root@gy-vm02 ~]# ssh gy-vm03
实际上使用ssh登录使用的端口是默认的22号端口,如果远程服务端的端口不是使用的22号默认端口,那么我们在进行ssh登录的时候,需要使用-p参数来指定端口登录:
[root@gy-vm02 ~]# ssh root@gy-vm03 -p 9999
SSH之所以能够保证安全,原因在于它采用了公钥加密。
整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
整个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。
那么,SSH协议是如何应对的了?
我们在第一次登录远程主机,系统会提示一下信息:
[root@gy-vm03 ~]# ssh root@gy-vm04The authenticity of host 'gy-vm04 (192.168.121.182)' can't be established.RSA key fingerprint is 16:d4:ce:a1:13:49:83:8c:f0:f2:2e:9f:87:6e:27:d2.Are you sure you want to continue connecting (yes/no)?
这段话的意思是说,无法确认对方主机的真实性,只知道它的公钥指纹,问你是不是继续连接。这个公钥指纹,其实就是远程主机的公钥进行了MD5计算等到的128位的指纹。为什么不直接用公钥比对?我们生成密钥的算法一般是RSA算法,公钥长达1024位,很难比对。
那有人可能会有疑问,我怎么知道这个指纹是不是对的了?目前来说,除非对方事先告诉你他的公钥指纹,不然你也没办法进行确认。
如果我们确认了这次连接没有问题:
Are you sure you want to continue connecting (yes/no)? yes
回车之后吗,系统会出现一句提示:
Warning: Permanently added 'gy-vm04' (RSA) to the list of known hosts.
表示主机等到确认,并将此IP添加到$HOME/.ssh/known_hosts之中,下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。
所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:
[root@gy-vm04 .ssh]# ssh-keygen
一路回车就可以了,只是其中有一个地方需要主要的是要不要对私钥设置口令:
Enter passphrase (empty for no passphrase):
如果当心私钥安全,可以设置一个密码,不过以后每次使用密钥登录都会需要验证一次,也是比较麻烦。
运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
然后使用下面的命令,将公钥传送到远程主机host上面:
[root@gy-vm04 .ssh]# ssh-copy-id root@gy-vm03
这样以后就不要输入密码登录了。
上面的命令其实是将本地的公钥写入到远程机器上的$HOME/.ssh/authorized_keys文件中。