如何使用ansible进行双因素身份验证?

Har*_*hur 9 ssh two-factor-authentication ansible ansible-playbook

我已经使用duosecurity为ssh启用了双因素身份验证(使用此playbook https://github.com/CoffeeAndCode/ansible-duo).

如何使用ansible立即管理服务器.由于这个原因,SSH调用在收集事实时失败.我希望运行剧本的人在播放剧本之前输入两个因子代码.

为部署用户禁用两个因素是一种可能的解决方案,但会产生一个安全问题,我希望避免这种问题.

Jul*_*tré 8

我可以利用 sshControlMaster和 ansible 的功能将 ansible 与 ssh 和 2FA 结合使用。

我的本地 ssh 客户端配置为转储ControlPath用于多路复用连接的套接字。Ansible 配置为使用相同的套接字。

本地 ssh 客户端

此配置为所有连接启用多路复用。我个人将此配置存储在`~/.ssh/config中:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p.socket
    ControlPersist 1m
Run Code Online (Sandbox Code Playgroud)

建立连接后,$HOME/.ssh目录中会出现一个套接字。该套接字在断开连接后持续一分钟。

配置ansible

Ansible 配置为重用本地套接字。

将其添加到您的ansible 配置文件中(例如,~/.ansible.cfg):

Host *
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p.socket
    ControlPersist 1m
Run Code Online (Sandbox Code Playgroud)

%注意变量替换的双精度。

用法

  1. 使用 ssh 常规命令 ( ) 连接到您的服务器ssh user@server,并执行 2FA;
  2. 像平常一样启动 ansible 命令。

步骤 2 必须在ControlPersist配置中执行,或者当您在另一个终端中启动 ansible 命令时,在终端中保持 ssh 连接。

您还可以在不需要时强制关闭连接,使用:ssh -O exit user@server

请注意,如果您打开第三个终端并运行ssh user@server,则不会要求您提供凭据:将重新使用 1 中建立的连接。

缺点

如果网络状况不好

有时,当您断开连接时,套接字仍然存在。每个进一步的连接都会挂起。您必须使用 手动断开此连接ssh -O exit user@server。这是该方法唯一已知的缺点。

参考:


duv*_*duv 7

这是一个黑客,但您可以通过支持2fac的SSH连接隧道传输非2fac Ansible SSH连接.

概观

我们将设置两个用户:ansible将是Ansible将使用的用户.它应该以Ansible支持的方式进行身份验证(即,不是2fac).此用户将受到限制,因此无法从任何地方进行连接127.0.0.1,因此无法从机器外部访问.

第二个用户ansible_tunnel将对外开放,但将通过两个因素进行身份验证,并且只允许将SSH连接隧道连接到本地计算机.

您必须只能为某些用户(并非所有用户)配置双因素身份验证.

有关SSH隧道的一些信息.

在目标机器上:

  1. 创建两个用户:ansibleansible_tunnel
  2. 将您的公钥放入~/.ssh/authorized_keys两个用户
  3. 设置的外壳ansible_tunnel/bin/false,或锁定用户-这将用于隧道专用,不运行命令
  4. 将以下内容添加到/etc/ssh/sshd_config:

    AllowTcpForwarding no
    
    AllowUsers ansible@127.0.0.1 ansible_tunnel
    
    Match User ansible_tunnel
      AllowTcpForwarding yes
      PermitOpen 127.0.0.1:22
      ForceCommand echo 'This account can only be used for tunneling SSH sessions'
    
    Run Code Online (Sandbox Code Playgroud)
  5. 设置双因素认证针对ansible_tunnel
  6. 重启sshd

在运行Ansible的机器上:

  1. 在运行Ansible之前,运行以下命令(在Ansible机器上,而不是目标):

    ssh -N -L 8022:127.0.0.1:22 ansible_tunnel@<host>
    
    Run Code Online (Sandbox Code Playgroud)

    您将使用两个因素进行身份验证.

  2. 一旦隧道启动(检查netstat),运行Ansible with ansible_ssh_user=ansible,ansible_ssh_port=8022ansible_ssh_host=localhost.

概括

  • 只能ansible_tunnel从外部连接,并且将使用两个因素进行身份验证
  • 设置隧道后,连接到8022本地计算机上的端口与连接到远程计算机上的sshd相同
  • 我们ansible只允许通过本地主机通过SSH进行连接,因此只允许通过隧道连接

规模

由于需要为每台机器打开一个单独的隧道,这需要手动操作,因此多个服务器无法很好地扩展.但是,如果您为服务器选择了双因素身份验证,那么您已经愿意采取一些手动操作来连接到每个服务器,而这个解决方案只会增加一些脚本包装的开销.

[已加入]

奖金

为方便起见,我们可能希望直接登录维护帐户进行一些手动操作,而无需完成设置隧道的过程.在这种情况下,我们可以将SSH配置为需要2fac身份验证,同时保持无需2fac通过隧道连接的能力:

# All users must authenticate using two factors
AuthenticationMethods publickey,keyboard-interactive

# Allow both maintenance user and tunnel user with no restrictions
AllowUsers ansible ansible_tunnel

# The maintenance user is allowed to authenticate using a single factor only
# when connecting from a local address - it should be impossible to connect to
# this user using a single factor from the outside (the only way to do that is
# having an existing access to the machine, or use the two-factor tunnel)
Match User ansible Address 127.0.0.1
  AuthenticationMethods publickey
Run Code Online (Sandbox Code Playgroud)