SSH 的原理和实践
最近自己在学习使用SSH,现将自己理解的SSH原理和实践SSH的操作写成一篇博客,以供日后查看。
一、SSH是什么?为什么会出现SSH?
SSH英文全称是Secure Shell,即安全外壳。首先SSH是一个网络协议,用来在远程登录等远程操作管理中进行安全的数据传输的协议。我们早期使用的远程管理协议,包括ftp、telnet等都是使用明文在网络上传输数据,这样是很危险的,使用一些抓包工具就能截获这些数据。同时还可能会受到“中间人”攻击,中间人可以模仿服务器,接受客户端发来的数据,经过“中间人”的处理后再模拟客户端将数据发给真正的服务器。所有为了解决这个安全问题,提出了SSH协议,SSH协议本质上就是发送加密后的数据,提高安全性。SSH需要解决明文数据不安全和中间人攻击的问题。
SSH是一个协议,有很多实现,由于SSH不开源,我们一般使用OpenSSH。SSH也有几个版本,一般是SSH1和SSH2。
二、SSH的原理和具体过程
为了理解SSH,我们先要了解加密。加密一般分为对称加密和非对称加密。顾名思义,对称加密是指加密和解密所使用的方法是一样的;非对称加密中加密和解密的方法不一致。在非对称加密中,存在两组密钥,一个是公钥,一个是私钥。公钥用于加密,私钥用于解密。一般来说公钥是对外公布的,只有拥有私钥的用户才能获取真正的数据。
下面根据一个具体的SSH连接分析SSH的原理。
一般地,SSH用于客户端远程登录到远程主机。常见的SSH过程是服务端生成一对公钥和私钥,当客户端请求服务端时,服务端返回公钥给客户端,客户端之后使用公钥加密数据,然后传送给服务端,服务端使用自己的私钥解密数据,从而得到真正的数据,这样就算中间数据被截获,别人也不能破解数据。但是这个过程存在一个问题,如何保证客户端得到的公钥是真的服务端发送过来的?有可能是中间人发送的伪装的公钥,这样就会导致,中间人能够截获到用他的公钥加密的数据,从而能够破解。用于SSH的公钥和密钥都是由自己生成,并没有一个CA验证,只能通过客户端自己确认。为了解决这个问题,提出了两种解决方案:
1. 基于口令的验证
第一次使用SSH连接远程主机时,会提示你如下信息:
可以看到远程主机给我们提供了fingerprint,即服务端的公钥指纹,一般是生成公钥的MD5码,可能会放在某个网站上进行公示,表明这个某某主机的fingerprint,从而客户端据此确定连接的是不是目标远程主机,如果是则输入yes,然后在输入密码,之后这个远程主机就会加入到客户端的 .ssh/known_host 文件中。下次连接时,客户端就会跳过验证host阶段,只要要你输入密码,即可连接到远程主机上。
2. 基于公钥的验证
基于公钥的验证是指客户端将客户端的公钥文件发送到服务端的 .ssh/authorized_keys 文件中。之后客户端请求服务端,客户端会发送一个随机字符给服务端,服务端使用authorized_keys 即 客户端的公钥加密后,发送给客户端,客户端使用自己的私钥解密,再比较之前发送的字符串和解密后的字符串是否一致,如果一致,代表与之连接的服务端是真的服务端。之后连接就不需要输入密码,就可以和服务端建立连接了。
三、SSH实践
实现免密登录,即使用公钥验证。
首先服务端已经安装了ssh服务或者使用github等其他的现成服务。
1. 首先在客户端生成密钥,包含公钥和私钥
ssh-keygen –r rsa
-r 后面制定的是加密方式,我们使用的是rsa。执行完后会生成两个文件:.id_rsa 和 .id_rsa.pub
2. 将客户端的公钥 .id_rsa.pub 添加到服务端的 .ssh/authorized_keys 文件中
3. 之后重启服务端的ssh服务,既可以使用免密登录服务端或其他使用ssh的服务
ssh xxx@0.0.0.0