基于 SSH 密钥的身份验证在首次登录时要求输入密码

基于 SSH 密钥的身份验证在首次登录时要求输入密码

我有一个新的 Ubuntu 16.04.1 LTS 系统,并且注意到基于密钥的 SSH 身份验证在我第一次登录机器时要求输入帐户的密码,并且后续的 SSH 尝试无需提示输入密码即可工作。

到目前为止,可以通过重新启动机器来重现此行为。也可能会出现超时,但我正在设置机器,还没有遇到过这种情况。

总的来说,这很不错,因为它可以缓解受损的 SSH 密钥,但它对于自动化流程来说有一个缺点;在我的例子中,使用 Ansible 进行配置管理。

SSH 服务器行为在哪里配置?具体来说,即使基于密钥的身份验证成功,也要求进行密码身份验证,但仅限于第一次使用密钥打开会话时。

我想在交互式会话中保留这种“双因素”行为,但对某些帐户(例如专用用户ansible)禁用它(即不提示输入密码)。

谢谢!

答案1

我在另一个 stack exchange 上找到了答案。出现此行为的原因是主目录已加密!

为什么使用公钥认证的 ssh 时仍会提示输入密码?

您的主目录是否已加密?如果是,则在第一次 ssh 会话中,您必须提供密码。与同一台服务器的第二次 ssh 会话使用身份验证密钥。如果是这种情况,您可以将 authorized_keys 移动到未加密的目录并更改 中的路径~/.ssh/config

我通过查看来追踪这一点/var/log/auth.log,特别是这一行:

pam_ecryptfs: Passphrase file wrapped

搜索该信息使我找到了其他堆栈交换答案。

答案2

如果您从私钥中删除密码,SSH 代理将不会要求输入密码。假设机器专用帐户的调用方式ansible与问题中一样,您可以使用以下命令实现:

sudo -u ansible ssh-keygen -f ~ansible/.ssh/id_<TYPE> -N ''

或者

sudo ssh-keygen -f ~ansible/.ssh/id_<TYPE> -N ''

取决于您的访问权限管理配置(<TYPE>用相关的密钥类型替换,例如rsaecdsa等等ed25519)。


无密码机器密钥是一种常见的做法,只要有一个

  • 使用密钥为服务使用唯一的专用密钥(与服务开发者使用的密钥不同!)并且

  • 一旦出现潜在泄露迹象,就更换密钥并将其从所有authorized_keys文件中删除(这通过上一个要点中描述的措施来实现)。

当然,密钥文件应该具有访问模式,0500以限制仅对机器帐户进行访问。这是使用创建的密钥的默认访问模式ssh-keygen

相关内容