使用密码和私钥的Ansible SSH身份验证

使用密码和私钥的Ansible SSH身份验证,ssh,ansible,Ssh,Ansible,出于安全原因和法规遵从性,我们需要在主机上设置2FA。我们通过使用sshd\u config中的AuthenticationMethods设置强制使用密码和公钥进行身份验证来实现它。私钥还需要有密码 因此,为了在这些主机上运行Playbook,我们需要能够输入登录密码和私钥密码。我在hosts文件中使用了-k标志和ansible\u ssh\u private\u key\u file选项(或使用--private key标志)。它要求输入SSH登录密码,但它只是挂起,从不要求我输入私钥密码短语

出于安全原因和法规遵从性,我们需要在主机上设置2FA。我们通过使用sshd\u config中的
AuthenticationMethods
设置强制使用密码和公钥进行身份验证来实现它。私钥还需要有密码

因此,为了在这些主机上运行Playbook,我们需要能够输入登录密码和私钥密码。我在hosts文件中使用了
-k
标志和
ansible\u ssh\u private\u key\u file
选项(或使用
--private key
标志)。它要求输入SSH登录密码,但它只是挂起,从不要求我输入私钥密码短语。当我设置
-vvv
平面时,我看到密钥传递正确,但SSH登录密码没有随命令一起传递:

<10.1.2.2> SSH: EXEC sshpass -d10 ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o Port=22022 -o 'IdentityFile="/home/me/.ssh/id_ed25519"' -o 'User="me"' -o ConnectTimeout=10 -o ControlPath=/home/me/.ansible/cp/db574551ae 10.1.2.2 '/bin/sh -c '"'"'echo ~me && sleep 0'"'"''
SSH:EXEC sshpass-d10 SSH-vvv-C-o ControlMaster=auto-o ControlPersist=60s-o Port=22022-o'IdentityFile=“/home/me/.SSH/id_ed25519””-o'User=“me”-o ConnectTimeout=10-o ControlPath=/home/me/.ansible/cp/db574551ae 10.1.2.2'/bin/sh-C''echo~me&&sleep 0''
如何使Ansible同时使用密码和公钥?

如中所述:

Ansible不公开允许用户和服务器之间通信的通道 ssh进程,在使用ssh时手动接受密码以解密ssh密钥 连接插件(默认设置)。强烈建议使用ssh代理

这就是为什么不会提示您输入私钥密码。如评论中所述,当系统提示您输入ssh代理时,请设置一个ssh代理:

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
然后,在playbook执行后,下次需要询问密码:

# Deletes all identities from the agent:
ssh-add -D
# or, instead of adding identities, removes identities (selectively) from the agent:
ssh-add -d <file>
#从代理中删除所有标识:
ssh添加-D
#或者,不是添加标识,而是(有选择地)从代理中删除标识:
ssh添加-d

您可以将密钥添加、playbook执行和清理打包到一个包装外壳脚本中。

当您加密私钥时,您已经有了2FA:您拥有(1)密钥,并且知道(2)密码。@ceving True,但是为了符合PCI DSS,我们应该使用bothIt。听起来您需要在ssh代理下运行ansible playbook,此时,您将向代理添加私钥(当时提供密钥密码),然后
sshpass
应按预期运行,因为不会提示输入私钥密码