我有一个新的 Ubuntu 16.04.1 LTS 系统,并且注意到基于密钥的 SSH 身份验证在我第一次登录机器时要求输入帐户的密码,并且后续的 SSH 尝试无需提示输入密码即可工作。
到目前为止,可以通过重新启动机器来重现此行为。也可能会出现超时,但我正在设置机器,还没有遇到过这种情况。
总的来说,这很不错,因为它可以缓解受损的 SSH 密钥,但它对于自动化流程来说有一个缺点;在我的例子中,使用 Ansible 进行配置管理。
SSH 服务器行为在哪里配置?具体来说,即使基于密钥的身份验证成功,也要求进行密码身份验证,但仅限于第一次使用密钥打开会话时。
我想在交互式会话中保留这种“双因素”行为,但对某些帐户(例如专用用户ansible
)禁用它(即不提示输入密码)。
谢谢!
答案1
我在另一个 stack exchange 上找到了答案。出现此行为的原因是主目录已加密!
您的主目录是否已加密?如果是,则在第一次 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>
用相关的密钥类型替换,例如rsa
,ecdsa
等等ed25519
)。
无密码机器密钥是一种常见的做法,只要有一个
使用密钥为服务使用唯一的专用密钥(与服务开发者使用的密钥不同!)并且
一旦出现潜在泄露迹象,就更换密钥并将其从所有
authorized_keys
文件中删除(这通过上一个要点中描述的措施来实现)。
当然,密钥文件应该具有访问模式,0500
以限制仅对机器帐户进行访问。这是使用创建的密钥的默认访问模式ssh-keygen
。