什么是SSH
SSH是Secure Shell的简称,是由IEFT网络工作组制定,用来为远程登录等网路服务提供一种安全的信息传输协议。最初是用于Unix平台,现在各个平台上都可以使用SSH协议程序进行信息传输。SSH只是一种协议,针对这种协议的实现有很多个版本,有商业化闭源的实现也有开源的实现,OpenSSH就是著名的开源SSH实现。
SSH登录远程主机的过程
假设有客户端要远程登录服务器,使用SSH登录的过程如下:
- 客户端向服务端发起连接请求,服务端收到请求后,返回给客户端一个公钥。
- 客户端使用该公钥加密用户明和登录密码,然后将加密后的数据传递给服务端。
- 服务端收到用户传递过来的加密数据后,使用自己的私钥解密,检查用户是否为合法用户。
- 如果用户合法,则简历连接,否则拒绝连接。
在上述登录过程中,如果用户是第一次登录远程主机,那么在用户收到远程主机的公钥后,本地终端就会提示用户注意远程主机是否为真实的目标主机,提示信息一般如下:
1 | The authenticity of host 'host (12.18.429.21)' can't be established. |
在用户根据IP地址和服务端指纹信息确定之后,SSH程序会将该主机信息保存在本地,当下次再登录该主机时,将会直接体使用户输入密码来登录,将不再会提示用户所登录的主机信息。
###中间人攻击
在用户首次登录的时之所以提示用户登录信息,是因为在逻辑上SSH有个漏洞,假如用户在一个开放网络中,在服务端和客户端之间存在一个第三方的主机(中间人主机),而且用户登录时被中间人主机拦截,并向客户端返回了自己伪造的公钥,但是用户并未检查所登录的主机是否为目标主机,此时使用伪造的公钥将用户数据加密后传给中间人主机,这样中间人主机就可以拿到用户的登录信息,这就会导致严重的安全事故。因此在为了避免中间人攻击,我们需要在首次登录时,检查目标主机的信息是否为我们所要登录的目标主机,确认之后在进行登录操作。
###使用公钥登录
为了更好的避免中间人攻击,并且方便我们使用SSH登录,我们可以使用SSH提供的公钥登录,我们可以在本地使用ssh-keygen
命令生成一组公钥和私钥默认为(id_rsa.pub和id_rsa),然后我们将公钥存储在我们要登录的服务端。当使用公钥登录时,客户端发起连接,服务端会随机发送一串字符串,客户端使用私钥加密后再回传给服务端,服务端收到用户回传的加密数据和,使用先前用户存储在服务端的公钥进行解密,然后检查数据是否正确,如果正确则建立连接,否则拒绝连接,并返回拒绝原因。
使用公钥登录后,用户就不必再去每次都输入用户名和密码,而是直接建立连接,也很好的避免了中间人攻击的问题,是一个比较好的解决办法,只是相比直接用口令登录要麻烦一点,不过一劳永逸,刚开始麻烦后面就简单多了。
##SSH登录使用
使用SSH登录非常简单,命令如下:
1 | //ssh [username]@[server ip/domain] |
指定端口登录:
1 | //ssh -P port [username]@[server ip/domain] |
SSH的默认端口号是22,可以通过-P
参数来指定端口号。
SSH登录时的默认端口是22,如果服务端根据自身需要,要求客户端使用别的端口(例如2222)进行登录时,我们可以在客户端使用-P参数来指定登录端口
##参考
ssh原理以及使用