更安全的免密码访问

作者:Johan Thelin

如何确保密码安全? 您可以增加密码长度,添加特殊字符来使其复杂化,确保您使用的每个用户帐户都使用不同的密码。 或者,您可以直接跳过所有密码。

安全Shell,ssh,是任何Linux用户工具箱中的关键工具。 只要您有多个机器需要交互,ssh 就是显而易见的选择。

通过 ssh 登录到远程机器时,通常会提示输入远程用户的密码。 另一种选择是使用非对称密钥对。

非对称密钥对由私钥和公钥组成。 这些密钥由算法生成 - RSA 或 DSA。 RSA 已经存在很长时间,并得到广泛支持,甚至被旧的遗留实现所支持。 DSA 更安全,但需要 ssh 协议的 v2 版本。 这在开源世界中不是什么大问题 - 保持 ssh 守护进程实现的最新状态不是问题,而是一种要求。 因此,除非您有任何特殊理由选择 RSA,否则建议选择 DSA。

生成的密钥比普通用户密码大。 RSA 密钥至少为 768 位,默认值为 2048 位。 DSA 密钥为 1024 位,如标准所指定。

要生成 DSA 密钥,请使用以下命令

$ ssh-keygen -t dsa

这会生成文件 ~/.ssh/id_dsa 和 ~/.ssh/id_dsa.pub。 您可以在密钥生成过程中指定密码短语。 这意味着密钥只能与密码短语结合使用,从而提高了安全性。

以 pub 结尾的生成文件是密钥对的公共部分。 可以与您要 ssh 连接的远程主机共享。 另一个文件 id_dsa 是密钥对的私有部分。 必须像保护密码一样保护它。 即不要邮寄它,不要将其存储在不受信任的机器上等等。

拥有 1024 位长的密钥可以被认为拥有 128 个字符长的密码。 这意味着密钥对方法比您能记住的大多数密码都安全。 密钥也是完全随机的,因此无法使用字典攻击破解它们。 这意味着您可以通过禁用使用密码的登录来提高远程主机的安全性,从而强制所有用户使用密钥对。

生成密钥对后,剩下的就是将密钥的公共部分复制到远程计算机。 您可以使用 ssh-copy-id 命令来执行此操作。

$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@remote

这会将您的密钥添加到远程计算机的授权密钥列表中。 为了安全起见,最好确保 ~/.ssh 和 ~/.ssh/authorized_keys 不能被您之外的任何其他用户写入。 您可能需要使用 chmod 来修复此问题。

将密钥添加到远程计算机后,您现在应该能够在不使用密码的情况下 ssh 连接到它。

$ ssh user@remote

这适用于所有基于 sshd 的机制。 因此您可以自由地 scp,以及使用 sshfs 挂载远程文件系统的一部分。

这里一个潜在的棘手问题是,如果远程机器不允许基于密码的登录。 那么 ssh-copy-id 命令将无法工作。 相反,您必须获取公钥部分的内容,并手动将其作为新行添加到远程机器上的 ~/.ssh/authorized_keys 文件中。 这就是 ssh-copy-id 命令为您所做的事情。

这也告诉您,如果密钥被泄露或只是不再使用,该怎么办。 只需从远程计算机的授权密钥列表中删除相应的行即可。 您通常可以从行的末尾识别出有问题的密钥,其中显示 username@hostname

所以,下次再见,不再需要密码了!

加载 Disqus 评论