SSH(Secure Shell)可以通过RSA公钥加密算法,进行安全的远程登陆和远程操作。使用SSH,登陆的账号/密码以及命令都是经过加密的传输的,从而保证在传输过程中不会被hacker或者eavesdropper窃取信息。
理解SSH的加密原理要对公钥和私钥有一定的了解,在SSH信息传递过程中公钥为加密秘钥,私钥为解密秘钥。
例子:Client用SSH登陆Server,命令"ssh root@10.204.176.2" (假设Server的IP为10.204.176.2),过程如下,
(1)Client连接Server
(2)Server返回一个公钥(Public Key)给Client
(3)Client用Server返回的公钥对用户的账号和密码进行加密,并发送给Server
(4)Server接收到Client发送的加密后的账号和密码信息,用私钥(Privacy Key)进行解密,验证成功
有兴趣的同学可以再研究下数字签名技术,其使用加密秘钥作为私钥,解密秘钥作为公钥。
known_hosts文件用来记录连接过的Server所发送的公钥信息,为什么要将Server发送过来的公钥记录保留在文件中呢?
这种做法可以尽量的避免中间人攻击(Man-in-the-middle attack)。中间人攻击:如果存在一个hacker获取到Client发送的SSH登陆请求后,伪造一个包含公钥的数据包发送给Client,Client将用hacker发送的公钥对账号/密码进行加密后,发送给Hacker所用的主机,由此Hacker变获得了Client欲登陆的Server的账号和密码。
known_hosts文件记录了原先Client登陆Server时,Server发送给Client的公钥信息,在下一次登陆Server的时候,会将Server这次返回的公钥和known_hosts里面记录的公钥进行比对,如果不同,则会给出如下图提示信息,给用户给出警告:
注意上图中显示的"ff:cc....9e:70"并不是公钥,而是公钥的md5值。因为公钥比较长,通过known_hosts中Server的公钥的md5值与Server刚返回的公钥的Md5进行比较,则可以确定两个公钥是否一致。
当然如果你确定Server没有问题,可以删除掉known_hosts文件(一般在~/.ssh/目录下)里Server ip对应的那一行信息,则可以成功SSH登陆到Server。
SSH也提供了基于秘钥的安全验证,该方法不需要Client输入登陆的账号和密码。其原理如下:
(1)Client使用命令"ssh-keygen -t rsa"产生一对公钥和私钥(Key Pair),公钥:~/.ssh/id_rsa.pub, 私钥:~/.ssh/id_rsa。
(2)将id_rsa.pub里面的公钥添加进Server:~/.ssh/authorized_keys 文件中
(3)Client SSH登陆Server,连接Server
(4)Server产生一个随机数并且用原先Client给予的公钥进行加密,发送给Client
(5)Client接收到Server的反馈的加密后的随机数信息,用私钥解密,并将解密后的结果发送给Server
(6)Server将Client解密的信息与原先产生的随机数进行比对,如果相同,则验证成功
项目中一台物理机中安装多了多台Linux系统,并且每一个Linux系统配置了相同的静态IP,并且Server要免密码的登陆每一个Client。
解决方法,只需要将相同的公钥和私钥对拷贝到每一个Client:~/.ssh/ 目录下,并且将公钥添加进Sever:~/.ssh/authorized_keys文件中即可。