SSH(安全外壳协议)
SSH为Secure Shell的缩写,是一种网络安全协议,专为远程登录会话和其他网络服务提供安全性的协议。生产中,我们经常使用ssh来登录、免密码登录远程linux机器。
SSH免密登陆流程
在linux主机node1上,安装ssh的客户端,在linux主机node2上,安装ssh的服务端。那么下图可以理解为配置node1到node2的免密码登录的流程。通俗说就是,在node1主机上的命令窗口中,不用输入node2主机的密码,就能登录node2主机。这就是免密码登录。
首先看下面~/.ssh中的四个文件:
id_rsa:保存私钥
id_rsa.pub:保存公钥
authorized_keys:保存已授权的客户端公钥
known_hosts:保存已认证的远程主机ID
[hadoop@hadoop-01 ~]$ ssh-keygen
[hadoop@hadoop-01 .ssh]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[hadoop@hadoop-01 .ssh]$ chmod 600 authorized_keys
这样这三句代码就好理解了。
关于known_hosts
- known_hosts中存储的内容是什么?
known_hosts中存储是已认证的远程主机host key,每个SSH Server都有一个secret, unique ID, called a host key。 - host key何时加入known_hosts的?
当我们第一次通过SSH登录远程主机的时候,Client端会有如下提示:
Host key not found from the list of known hosts.
Are you sure you want to continue connecting (yes/no)?
此时,如果我们选择yes,那么该host key就会被加入到Client的known_hosts中,格式如下:
#domain name+encryption algorithm+host key
example.hostname.com ssh-rsa AAAAB4NzaC1yc2EAAAABIwAAAQEA。。。
- 为什么需要known_hosts?
最后探讨下为什么需要known_hosts,这个文件主要是通过Client和Server的双向认证,从而避免中间人(man-in-the-middle attack)攻击,每次Client向Server发起连接的时候,不仅仅Server要验证Client的合法性,Client同样也需要验证Server的身份,SSH client就是通过known_hosts中的host key来验证Server的身份的。