为什么要使用 ssh 免密登录

中间人攻击

我们知道,不通过免密登录的流程是:
1. 服务端接收到登录请求,返回公钥
2. 本地主机将密码使用公钥加密后,发送给服务端
3. 服务端使用私钥解密,获取密码明文后进行密码验证

试想

  1. 本地主机DNS被劫持 或者 本地局域网遭受arp攻击
  2. 攻击者通过伪造远程服务器的方式,截取登录请求,返回伪造的公钥
  3. 本地主机并不知道返回的公钥是伪造的,还会将密码与公钥进行加密,返回给伪造的服务端
  4. 服务端攻击者获取到密码密文,自行解密得到密码明文

免密登录流程

  1. 本地主机生成秘钥和公钥
  2. 本地主机将公钥上传至服务端并配置好
  3. 本地主机ssh连接服务端,给服务端发送数据包,包括计算机名和IP等
  4. 服务端接收到服务器名,查找是否允许该主机免密连接,如果允许,则生成一个随机字符串
  5. 服务端使用公钥,将随机字符串进行加密,并将加密结果发回给本地主机
  6. 本地主机将加密字符串使用私钥解密,将解密好的字符串又发回给服务端
  7. 服务端接收到解密字符串,将其与生成的字符串进行比对,如果匹配,则允许免密登录

密码经过了双向验证,可以保证安全性

设置

  1. 本地控制台生成ssh公钥(id_rsa.pub)和私钥(id_rsa)
ssh-keygen -t rsa
  1. 将生成的公钥(id_rsa.pub)追加至服务端的~/.ssh/authorized_keys文件内
  2. 设置authorized_keys文件的权限为600(所有者可读可写)
chmod 600 ~/.ssh/authorized_keys

配置文件问题

配置完之后可能不能顺利连接,此时需要找到:

/etc/ssh/sshd_config

sshd配置文件下的这三行

#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile	.ssh/authorized_keys

把注释去掉,重启sshd服务,既可以顺利连接

本地曾经生成过id_rsa和id_rsa.pub

因为本地ssh默认是使用id_rsa作为私钥文件进行解密的。因此,此时直接将id_rsa.pub的内容追加到服务器端即可

再说中间人

事实上,如果真的有“中间人”拦截住了所有的请求,本地主机和远程服务端的请求往来还是会被截取用于分析。
虽说数据是被加密了的,但是还是免不了会有安全风险在。
因此,没有绝对安全的系统,也没有绝对安全的手法。只能通过不断提高自己的安全意识来做好防范,避免因为安全意识太过薄弱而造成很大的风险。

****

Thanks for Reading

Jiahao.Zhang
NetEase Inc. Hangzhou 
        Front-End Developer