秘密特工侠

作者:Kyle Rankin

过去,只有我们当中多疑的人才会关注严格的安全措施,但如今,似乎人们都在加强他们在加密、密码策略以及他们总体上处理计算机的方式方面的措施。虽然我一直认为自己更多的是属于多疑阵营而不是局外人,但最近我甚至发现自己也在加强措施。安全通常与便利性相悖,但每当我需要一个比替代方案方便的更好安全实践的例子时,我就会转向 SSH 密钥。

使用 SSH 密钥,您可以使用 ssh-keygen 命令生成私钥和公钥对,并将公钥分发到您想要连接的服务器。SSH 密钥使用您的私钥进行身份验证,而不是远程服务器上的密码,因此如果您是那些担心 SSH 暴力破解的人之一,如果您使用 SSH 密钥,您可以完全禁用密码 SSH 身份验证,而不用担心您在日志中看到的那些 SSH 暴力破解尝试。当我过去设置 SSH 密钥对时,我不会提供解锁密钥的密码短语。如果没有密码短语,我可以只 ssh 进入机器而无需输入任何类型的密码——在这种情况下,您可以在增强防御暴力破解 SSH 攻击的安全性的同时提高便利性。

当然,在生成 SSH 密钥时跳过密码短语的问题在于,您的所有安全性都依赖于保持您的私钥(通常位于 ~/.ssh/id_rsa 或 ~/.ssh/id_dsa)的秘密。如果其他人能够获得该文件的副本,他们就可以登录到您分发了公钥的任何机器。最近我决定我不喜欢这种风险,所以当我生成 SSH 密钥时,我现在使用密码短语。这意味着如果其他人获得了我的私钥,他们无法立即使用它,但这也意味着我现在必须输入密码短语才能使用我的 SSH 密钥。这不太方便,但我发现通过使用 SSH agent,我可以恢复到类似的便利程度,并且还有一些我在本专栏中讨论的额外好处。

SSH 代理

在大多数使用 sudo 的系统中,在您输入 sudo 密码后,它会在一段时间内被缓存,因此如果您连续运行几个 sudo 命令,您不必一直输入密码。SSH 代理以类似的方式处理 SSH 密码短语,将您解锁的密钥缓存在内存中一段定义的时间。如果您像我一样,经常将 Git 与 SSH 一起使用,这将特别有用——每次执行 git push 或 git pull 时都必须输入密码短语将是一件痛苦的事情。因此,例如,如果我想将我的密码短语缓存 15 分钟,我可以输入


$ ssh-add -t 15m

然后,在我单次提供密码后,它将在我在该 15 分钟内运行的剩余 SSH 命令中被缓存,之后它将过期。

SSH 闹钟

由于在您设置的超时时间到期后会提示您输入密码,因此我对 ssh-add 命令想到的第一个用途之一就是某种闹钟。有时当您沉浸在工作中时,您可能会忘记做午餐之类的。我每天开始工作时喜欢做的是计算一下我想要休息吃午饭的时间,并将 ssh-add 设置为该时间。例如,如果我早上 9 点开始工作,并且我想在中午休息吃午饭,我只需输入


$ ssh-add -t 3h

然后当中午来临时,我会注意到,因为我的下一个 git push 或 pull,或者我的下一个 SSH 会话,都会提示我输入密码。目前我乘坐渡轮上班,渡轮有固定的出发时间。我知道我需要在下午 5:30 左右离开办公室才能赶上那班渡轮,所以一旦我吃完午饭回来,我会计算到那时还有多少小时(或者如果我想更精细,则计算分钟),然后运行新的 ssh-add 命令。这个闹钟甚至有一种小睡功能,如果我想在离开之前完成一些事情,我可以运行另一个 ssh-add 命令来增加额外的九分钟。

SSH 代理转发

当然,SSH 代理为您提供的传统优势是能够将您的凭据转发到您已登录的服务器。当您是系统管理员时,您经常会遇到一个问题,您想要在服务器之间 scp 文件,但如果您禁用了 SSH 的密码身份验证(并且您应该这样做),这可能意味着将您的私钥放在您的服务器上,您可能不想冒险这样做。通过 SSH 代理转发,您本地机器上私钥的 SSH 凭据被转发到您 ssh 进入的机器的 RAM 中,如果您从那里 ssh 到另一台机器,它将使用这些凭据。

代理转发存在潜在风险。我认为 ssh_config 手册页说得最好

应谨慎启用代理转发。有能力绕过远程主机上的文件权限(对于代理的 Unix 域套接字)的用户可以通过转发的连接访问本地代理。攻击者无法从代理获取密钥材料,但是他们可以对密钥执行操作,使其能够使用加载到代理中的身份进行身份验证。

综上所述,要使用代理转发,只需将 -A 添加到您通常运行的任何 SSH 命令中即可


$ ssh -A user@remotehost

或者,您也可以在本地 SSH 配置文件中设置 ForwardAgent 设置,这样您就可以控制哪些主机自动获得代理转发,哪些主机不获得。

我喜欢在增加安全性的同时也能增加便利性。虽然为我的 SSH 密钥添加密码短语可能会以安全的名义增加很大的不便,但我认为闹钟的好处,以及 ssh-agent 允许我将凭据转发到远程服务器而无需冒着泄露我的私钥的风险的总体能力,远远超过了管理密码短语或 SSH 密钥总体上的任何不便之处。

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。他是 Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的贡献者。Rankin 经常就安全和开源软件发表演讲,包括在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 上。您可以在 @kylerankin 上关注他。

加载 Disqus 评论