SSH密码登录和免密登录

SSH 简介

SSH 为 Secure Shell 的缩写。由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

SSH 之所以能够保证安全,原因在于它采用了公钥加密。

SSH 密码登录流程 (基于口令的安全验证)

整个ssh密码登录过程是这样的:

  • 用户向远程主机发登录请求:ssh user@远程主机
  • 远程主机收到用户的登录请求,把自己的公钥发给用户。
  • 用户使用这个公钥,将登录密码加密后,发送回远程主机。
  • 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

当接收到远程主机的公钥以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

这种加密的方式的主要问题是用户不能保证你连接的服务器就是你想连接的(可能有别的服务器冒充你想连接的服务器),这就有可能受到“中间人”攻击。

SSH 免密登录流程 (基于密匙的安全验证)

所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求输入密码,这和之前的ssh账号密码也没有直接关系。

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen命令生成一个。

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

reference