Ansible 是否必须在节点和 Ansible playbook 服务器之间共享根密钥?

Ansible 是否必须在节点和 Ansible playbook 服务器之间共享根密钥?

正如标题所示,以 root 身份运行所有东西似乎并不安全,尤其是当 playbook 服务器被黑客入侵并且它可以 ssh 进入 Ansible 主机列表中的任何机器时,这个安全问题的解决方案是什么?

答案1

我专门为 ansible 的使用创建了一个用户,该用户可以使用无密码 sudo,但没有定义密码,需要 ssh 密钥才能登录。这样,该帐户具有特权,但如果没有 ssh 密钥,则无法远程访问。

或者,您可以创建带有密码的 ansible 帐户,并每次运行 ansible 时都需要输入 sudo 密码。

您可以像这样创建这样的用户:

# Create user
adduser ansible

# Lock password preventing password login (optional)
passwd -l ansible

# Expire any existing password, preventing password login (optional)
chage -E 0 ansible

# Ensure ansible can sudo without a password (optional)
echo "ansible ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible

# Create ansible's .ssh directory
mkdir -m 700 /home/ansible/.ssh

# Insert your desired SSH keys here
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB7/BSV84tCEQ8SSwygqjEVPFcH+G2JSFEdyuJI7A2iG [email protected]" > /home/ansible/.ssh/authorized_keys

# Correct ownership of newly created files and directories
chown -R ansible.ansible /home/ansible/.ssh

根据需要对其进行调整,以适应您用于启动新服务器实例的任何过程(kickstart、preseed、cloud-init 等等)。

然后我设置ansible.cfg无密码 sudo:

[defaults]
remote_user = ansible

[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False

如果您希望需要 sudo 密码来运行剧本,您可以简单地设置become_ask_pass = Trueansible.cfg而不要/etc/sudoers.d/ansible像上面显示的那样创建。

答案2

[ ] 当 playbook 服务器遭到黑客攻击并且它可以 ssh 进入 Ansible 主机列表上的任何机器时,这个安全问题的解决方案是什么?

没有解决方案解决这个安全问题

如果执行剧本的机器受到威胁,则该机器管理的服务器也应被视为受到威胁。

换句话说:执行 Ansible 剧本的机器必须满足服务器本身的安全要求。


这适用于用于管理服务器的任何机器。

如果用于管理目的的工作站受到威胁,在该工作站上执行的任何程序,只要使用合法凭据连接到服务器,都可以被恶意程序替换。

并且恶意代码可以使用“善意”提供的凭据对受管理的服务器进行任何操作。

此外,使用 Ansible 还会带来额外的风险:

  1. Ansible 代码本身通常在用户空间中维护(例如pip install ansible使用常规帐户或虚拟环境) - 对于攻击者来说,甚至不需要在工作站上获得提升的权限就可以更改 Ansible 代码以隐秘的方式执行任意代码(因为没有管理员在每次执行 Ansible 时都会验证 Ansible Python 的代码)。

  2. Ansible 执行的需要提升权限的命令无法在sudoers受管理的服务器上明确指定(即 Ansible 要求ALL启用命令)。


由服务器和管理工作站组成的系统的安全性仅取决于最薄弱环节的安全级别。

相关内容