我已经设置了一些 GNU/Linux(Ubuntu 和 Amazon Linux)服务器,使用google-authenticator
PAM 模块和keyboard-interactive:pam
SSHD 身份验证方法提示基于时间的 OTP。我正在努力让 ansible 提示我输入 OTP。该--ask-pass
标志在建立连接之前要求输入密码,并在建立连接时传递密码。我需要的是让 ansible 将服务器上 SSHD 的 OTP 请求传递给我的 shell。有什么办法可以做到这一点吗?
目前,ansible 无法可靠地将响应传回服务器。
➜ ansible git:(master) ✗ ansible -m ping amazon1 --inventory-file=./ansible_hosts
Verification code: <I QUICKLY ENTER THE OTP HERE>
amazon1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh.",
"unreachable": true
}
amazon1 上的 sshd_config
...snip...
UsePAM yes
PubkeyAuthentication yes
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive:pam
...snip...
amazon1 上的 pam 配置
#%PAM-1.0
auth required pam_sepermit.so
auth required pam_google_authenticator.so
...snip...
通常情况下,SSH 的工作方式如下:
➜ ansible git:(master) ✗ ssh amazon1
Verification code:
Last login: Sun Mar 12 04:32:37 2017 from ip-10-0-1-23.ec2.internal
[admin@amazon1 ~]$
我知道我可以在 sshd_config 中排除特定用户被提示输入 OTP。但是我不想这样做。我希望我没有错过一个明显的 ansible 标志。提前致谢。
答案1
正如已经指出的,Ansible 目前不支持双因素身份验证。
似乎有两个选项可以解决此警告:
- 禁用 Ansible 用户的双因素身份验证
我正在使用 duo auth 解决这个问题,方法是排除 pam_duo.conf 和 login_duo.conf 中的 ansible 用户组,然后在 sshd_config 中设置以下内容:
Match User ansible AuthenticationMethods publickey
因此有效地禁用了 Ansible 用户的双因素身份验证。
- 使用堡垒主机
我最终实现了类似这样的事情:http://blog.scottlowe.org/2015/12/24/running-ansible-through-ssh-bastion-host/
我打开与具有 2FA 的主机的初始连接,然后在另一个窗口中运行如下命令:
ansible-playbook thing.yml --ssh-common-args='-o ControlPath=~/.ssh/connshare'
看看这个讨论github 问题。