SSH 的自动登录有以下三种方式:

1 IP 信任

第一,如果发出登录命令的本地主机已经列在远程主机的 /etc/hosts.equiv/etc/ssh/shosts.equiv 文件中,并且两端用户名相同,则立即允许该用户登录。第二,如果远程主机的用户根目录($HOME 目录) 下存在 .rhosts.shosts 并且其中有一行包含了客户机的名字和客户机上的用户名,则允许该用户登录。一般来说,服务器不允许单独使用这种认证方式,因为它不安全。

2 主机认证

第二种认证方法是 rhostshosts.equiv 文件结合基于 RSA 的主机认证。如果 $HOME/.rhosts$HOME/.shosts/etc/hosts.equiv/etc/ssh/shosts.equiv 允许登录,并且如果服务器能够验证客户的主机密钥(host key),主机才允许客户登录。这个认证方法关闭了因 IP 欺骗、DNS 欺骗和路由欺骗造成的安全漏洞。但是,这些协议的本质是不可靠的,要安全就应该关掉它们。

3 基于 RSA 公开密钥算法的认证

作为第三种认证方式,SSH 支持基于 RSA 的认证。这种方案依托于公开密钥算法:密码系统的加密和解密通过不同的密钥完成,无法通过加密密钥推导出解密密钥。RSA 就是这种密码系统。每个用户创建一对公开/私密钥匙用于认证。服务器知道用户的公钥,只有用户知道他自己的私钥。$HOME/.ssh/authorized_keys 文件列出允许登录的(用户的)公钥。当用户开始登录,程序告诉服务器它准备使用哪对钥匙(公钥)做认证。服务器检查这只密钥(公钥)是否获得许可,如果许可,服务器向用户(实际上是用户面前运行的程序)发出测试,用用户的公钥加密一个随机数。这个随机数只能用正确的私钥解密。随后用户的客户程序用私钥解出测试数字,即可证明他/她她掌握私钥,而又无需把私钥暴露给服务器。

为了能够自动执行 RSA 认证协议,用户通过运行 ssh-keygen -t rsa 创建 RSA 密钥对。私钥存在 $HOME/.ssh/identity 中,公钥存在 $HOME/.ssh/identity.pub 中。随后,把 identity.pub 复制到远程服务器中,作为 $HOME/.ssh/authorized_keys 存放到用户主目录下,每一行只有一只密钥,尽管一行可以很长。做完这些步骤后,用户无须密码就可以直接登录。RSA 认证远比 rhosts 认证安全。

RSA 认证最便捷的用法大概就是使用认证代理(authentication agent)了。详见 ssh-agent 手册页。

如果这些认证方式都失败了,就提示用户输入口令(password),然后把口令送到服务器做验证。由于整个通信过程是加密的,因此别人不可能通过侦听网络获得这个口令。