使用堡垒主机的解决方案
即使使用 ssh 堡垒主机,我也花了很长时间才能让它工作。如果它对其他人有帮助,这就是我想出的。它使用ControlMaster
ssh 配置选项,并且由于 ansible 使用常规 ssh,因此可以将其配置为使用相同的 ssh 功能并重新使用与堡垒主机的连接,而不管它与远程主机打开多少连接。我已经看到一般推荐的这些控制选项(如果您有很多主机,可能是出于性能原因),但不是在 2FA 到堡垒主机的上下文中。
使用这种方法,您不需要任何 sshd 配置更改,因此您需要AuthenticationMethods publickey,keyboard-interactive
作为堡垒服务器上唯一的身份验证方法设置,并且publickey
仅适用于您通过堡垒代理的所有其他服务器。由于堡垒主机是唯一接受来自 Internet 的外部连接的主机,因此它是唯一需要 2FA 的主机,而内部主机依靠代理转发进行公钥身份验证,但不使用 2FA。
在客户端上,我在顶层目录中为我的 ansible 环境创建了一个新的 ssh 配置文件,我从该目录运行 ansible(因此是 ansible.cfg 的兄弟),名为ssh.config
. 它包含:
Host bastion-persistent-connection
HostName <bastion host>
ForwardAgent yes
IdentityFile ~/.ssh/my-key
ControlMaster auto
ControlPath ~/.ssh/ansible-%r@%h:%p
ControlPersist 10m
Host 10.0.*.*
ProxyCommand ssh -W %h:%p bastion-persistent-connection -F ./ssh.config
IdentityFile ~/.ssh/my-key
然后在 ansible.cfg 我有:
[ssh_connection]
ssh_args = -F ./ssh.config
需要注意的几点:
在这种情况下,我的私有子网是 10.0.0.0/16,它映射到上面的主机通配符选项。堡垒代理到该子网上的服务器的所有 ssh 连接。
这有点脆弱,因为我只能在这个目录中运行我的 ssh 或 ansible 命令,因为ProxyCommand
将本地路径传递给了这个配置文件。不幸的是,我认为没有 ssh 变量映射到当前正在使用的配置文件,因此我可以自动将相同的配置文件传递给 ProxyCommand。根据您的环境,最好为此使用绝对路径。
一个问题是它使运行 ansible 变得更加复杂。不幸的是,据我所知,ansible 不支持 2FA。因此,如果您没有与堡垒的现有 ssh 连接,ansible 将为Verification code:
它连接到的每个私有服务器打印一次,但它实际上并没有监听输入,所以无论您做什么连接都会失败。
所以我首先运行:ssh -F ssh.config bastion-persistent-connection
这会在 中创建套接字文件~/.ssh/ansible-*
,并且本地 ssh 代理将在可配置的时间(我设置为 10m)之后关闭并删除该套接字。
一旦套接字打开,我就可以像正常一样运行 ansible 命令,例如ansible all -m ping
,它们会成功。