Ansible - 我们需要在所有主机上配置 sudo 并具有 root 访问权限吗?

问题描述 投票:0回答:2

我有一个简单的 ansible 测试手册,可以在 locahost 和一台远程主机上运行。
该剧本运行 linux 命令“pvs”,该命令需要以 root 身份运行。
我在

become=true
中有
ansible.cfg

在本地主机上,用户 test1 在
/etc/sudoers
中配置为“丑陋”
ALL=(ALL:ALL) NOPASSWD: ALL
- 因为显然没有其他解决方案可以在不提供密码的情况下以批处理模式以 root 身份启动命令,正如 Vladimir 所证实的那样:

在远程节点上使用 sudoers 限制 Ansible 脚本模块

(我可以执行 Cmnd_Alias,但最终,ansible 需要 /bin/sh .. 所以没有必要用其他命令来限制它)

并且,当我运行下面的剧本时,我还必须在远程计算机中配置相同的 sudoers 配置。
这是否意味着,在我们管理的所有计算机上,我们需要让这个“ansible”用户通过 sudo 获得 root 访问权限?我希望不会,否则这是一个非常大的安全问题。 您有什么建议、解决方法或想法可以与我分享以限制 root 访问吗?

我的ansible.cfg:

[privilege_escalation]
become                  = true # (this I need otherwise command  "pvs" will not run)
become_method           = sudo
become_user             = root
become_ask_pass         = false # (this also I need, do not want any manuel providing)
default_become          = true

剧本:

 1 ---
  2 - name: test remote machine connection
  3   #hosts: localhost
  4   hosts: all
  5   gather_facts: no
  6
  7   tasks:
  8     - name: get physical volumes
  9       #shell: pvs # OK for localhost, but NOT for remote host, as sudo is not configured
 10       #command:   # Same as above for remote host : "Missing sudo password"
 11         #cmd: pvs
 12       raw: pvs    # Same as above for remote host : "Missing sudo password"
 13       register: output
 14
 15     - name: Show output
 16       debug:
 17         msg: "{{ output.stdout }}"
 18

结果:

PLAY [test remote machine connection] *************************************************************************************

TASK [get physical volumes] *******************************************************************************************************
fatal: [sh2]: FAILED! => {"msg": "Missing sudo password"}
changed: [localhost]

TASK [Show output] ********************************************************************************************************
ok: [localhost] => {
    "msg": "  PV         VG             Fmt  Attr PSize   PFree  \n  /dev/xvdc  prdvvg         lvm2 a--  <10.00g  <2.00g\n  /dev/xvde  prdvvg         lvm2 a--  <10.00g <10.00g\n  /dev/xvdf  clone_prdtm1vg lvm2 a--  <10.00g  <2.00g\n  /dev/xvdg  clone_prdtm1vg lvm2 a--  <10.00g <10.00g\n"
}

PLAY RECAP ****************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
sh2                        : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

谢谢你

linux ansible
2个回答
3
投票

如果你真的害怕使用 nopasswd sudo 拥有用户帐户,有几个选择:

  • 使用 pam_ssh [1] 使用 ssh 代理(由 Ansible 从控制器传递到目标主机)以获得无密码 sudo。它不会保护您的主机免受控制器的影响,但至少,来自随机用户的本地进程无法自行升级。
  • 为ansible使用特殊帐户,其他人无法运行任何东西(基本上,代理到root),或者只是将服务器配置为root。这非常简单:创建一个通过 ssh 密钥(无密码)只能进行 ssh 访问的用户,并允许该用户拥有无密码 sudo。 sudoers.d 片段如下所示:
    specialuser ALL=(ALL) NOPASSWD: ALL
    。这里的弱保护是主机上的任何人都不能在没有 root 的情况下成为
    specialuser
    ,并且只有 ansible 控制器才能访问该
    specialuser
    的私钥。这一切并非难以理解,但至少你的
    qemu
    用户不再可以通过简单的 sudo 调用成为 root。
  • 您可能会尝试寻找 ansible 的替代传输(又名连接插件),但对于您而言,它主要是蒸气软件,因为问题是 ansible 可以做任何它想做的事。

因此,无论是用于 sudo 的 pam_ssh,还是用于 ansible 的专用用户。

[1] https://wiki.gentoo.org/wiki/Pam_ssh_agent_auth


0
投票

不幸的是,我认为没有一个选项可以在没有 sudoers 文件的情况下执行需要 root 权限的命令。

正如在这里回答,您只能允许您要执行的一个特定命令。这可能类似于以下行:

ansible ALL=(ALL:ALL) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; * pvs

提高安全性的另一个选项(如果您还没有这样做)是在每台主机上创建特定的 ansible 用户,并仅通过特定主机允许的 SSH 私钥/公钥进行身份验证。

© www.soinside.com 2019 - 2024. All rights reserved.