【问题标题】:Ansible - Do we need to configure sudo with root access on all hosts?Ansible - 我们是否需要在所有主机上配置具有 root 访问权限的 sudo?
【发布时间】:2021-04-02 22:01:18
【问题描述】:

我有一个简单的 ansible 测试手册可以在 locahost 和一个远程主机上运行。
该剧本运行需要以 root 身份运行的 linux 命令“pvs”。
我在 ansible.cfg 中变成了=true。
在 localhost 上,用户 test1 在 /etc/sudoers 中配置为“ugly” ALL=(ALL:ALL) NOPASSWD: ALL - 因为显然没有其他解决方案可以在不提供密码的情况下以批处理模式以 root 身份启动命令,正如 Vladimir 所证实的那样:Restrict Ansible script module using sudoers on the remote node
(我可以做 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

谢谢

【问题讨论】:

  • 如果您希望ansible 执行需要root 访问权限的任务,那么ansible 需要root 权限,通过sudo 或通过ssh 帐户的适当ssh 凭据.您不能将 Ansible 限制为特定命令,因为 Ansible 没有运行特定命令;它正在运行(通常)python。如果您需要更精细的访问控制,则需要查看其他工具(或者限制自己使用 ansible 的 raw 模块,我猜)。
  • 感谢 larsks,但是很抱歉,我向您展示了即使原始模块也不起作用。我相信这个问题是 RedHat Ansible 应该改进的,因为他们吹嘘 Ansible 是自动化的瑞士刀......但可能很危险。当然,在管理一大群服务器时,我们需要 root 才能传递一些命令,但我认为 Ansible 会提供更多的安全性......无论如何,谢谢。

标签: linux ansible


【解决方案1】:

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

  • 使用 pam_ssh [1] 使用 ssh 代理(由 Ansible 从控制器传递到目标主机)来获得无密码 sudo。它不会保护您的主机免受控制器的影响,但至少,随机用户的本地进程不能自我升级。
  • 在没有其他人可以运行任何东西的地方(基本上,代理到 root)使用 ansible 的特殊帐户,或者只是将服务器配置为 root。这很简单:通过 ssh 密钥(无密码)创建一个仅具有 ssh 访问权限的用户,并允许该用户使用无密码 sudo。 sudoers.d sn-p 看起来像这样:specialuser ALL=(ALL) NOPASSWD: ALL。这里的弱保护是主机上的任何人都不能成为specialuser而不是root,并且只有ansible控制器才能访问该specialuser的私钥。这一切都不是无懈可击,但至少您的qemu 用户不再可以通过简单的 sudo 调用成为 root。
  • 您可能会尝试为 ansible(也称为连接插件)寻找替代传输方式,但您所担心的主要是汽化软件,因为问题是 ansible 可以为所欲为。

所以,对于 sudo,要么是 pam_ssh,要么是 ansible 的专用用户。

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

【讨论】:

  • 嗨,乔治,谢谢。是的,pam_ssh 对我来说似乎是一个很好的解决方案/解决方法。我更感兴趣的是“在没有其他人可以运行任何东西的地方使用特殊帐户(基本上,代理到根),或者只是将服务器配置为根。” - 但我不明白你的意思;实际上,这就是我试图实现的目标;只针对ansible的特殊用户;我不知道你是否有几分钟时间来解释你的建议。我没有得到的是“没有人可以运行任何东西..”;非常感谢
【解决方案2】:

不幸的是,我认为没有 sudoers 文件执行需要 root 权限的命令的选项。

作为answered here,您只能允许您要执行的一个特定命令。这可能类似于以下行:

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

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

【讨论】:

  • 嗨 lugoll,感谢您抽出宝贵时间回答,但您的回答不是一个 :( 它首先要求输入密码;然后这正是我想要避免的,有 / bin/sh 或 sudoers 中的任何“*”。此外,您应该在发布之前先测试您的答案;)
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2016-09-16
相关资源
最近更新 更多