如果sudo用户无法运行任意脚本,Ansible能否使用"sudo su -"?

5
我正在尝试使用Ansible自动化在多台远程机器上安装和设置软件。我的个人用户账户在机器上被锁定,但是当我手动登录后,我可以使用sudo su -变成root用户,然后我可以运行像yum install git这样的命令。
当我尝试通过Ansible执行此操作时,我尝试使用Ansible的yum模块:
- name: install Git
  yum:
    name: git
    state: present
  become: yes
  become_method: sudo
  become_user: root
  become_exe: "sudo su -"

当我运行此命令时,出现错误提示,指出我的用户不被允许运行该命令。
sudo su - root /tmp/foobarbazblablabla

发生的情况是Ansible将所有的Yum命令放入一个临时脚本文件中,然后尝试使用become方法/exe运行该脚本。

结果我的用户有权限运行sudo su -,但不能使用sudosudo su -运行任意脚本,因此Ansible无法运行上述命令。

最终我使用了一个丑陋的解决方法,如下:

- name: install Git
  shell:
    cmd: |
      sudo su - <<EOF
      yum install -y git
      EOF

这个方法可以工作,但很丑陋,而且没有使用Ansible的幂等性检查机制。在Ansible中有更好的方法来执行sudo su -,然后在打开的子shell中执行其一系列命令吗?或者我对此不太了解?我怀疑安全团队会授予我的用户权限以使用sudo运行任意脚本。(另一方面,询问一下也许不会有害。)这是一个类似问题的描述,但是建议的解决方案与我上面使用的丑陋hack相同: https://gist.github.com/nanobeep/3b3d614a709086ff832a还有一个非常相似的错误实例,我遇到了一个非常相似的错误: https://www.reddit.com/r/devops/comments/53hukf/ansible_centrify_become_root/
fatal: [hostname]: FAILED! => {"changed": false, "failed": true, "module_stderr": "", 
"module_stdout": "Sorry, user username is not allowed to execute 
'/bin/sh -c echo BECOME-SUCCESS-msylkobbkasuuxlawgqppdpjxmeqirgd; LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
/usr/bin/python /home/username/.ansible/tmp/ansible-tmp-1474243234.94-154392424015843/lineinfile; rm -rf \"/home/username/.ansible/tmp/ansible-tmp-1474243234.94-154392424015843/\" > /dev/null 2>&1' 
as root on hostname.\r\n", "msg": "MODULE FAILURE", "parsed": false}

更新 如果运行 sudo -l, 将显示以下内容:

User foo may run the following commands on this host:
    (root) /bin/kill
    (root) /bin/su - bar
    (root) su -

如果您发出 sudo -l 命令,它会显示什么? - Paul Hodges
我已经将 sudo -l 的输出添加到问题中。 - nwinkler
这篇文章说ANSIBLE_BECOME_EXE='sudo su -'有助于使用sudo su进行特权升级 https://www.coveros.com/ansible-privledge-escalation-using-sudo-su/ - Kohei Nozaki
4个回答

5

我曾经遇到与teamviewer passwd类似的问题,它也不会允许我在 become: true下运行。这是我的任务定义,用于使用ansible设置teamviewer密码:

  - name: set teamviewer login to password only
    become: true
    become_method: sudo
    become_flags: 'su - root /bin/bash -c'
    command: 'teamviewer passwd {{ teamviewer_password }}'

这将会运行:
sudo su - root /bin/bash -c 'teamviewer passwd Th3Passw0r8'

作为旁注:如果您选择使用shell-task而不是command,则可以跳过become_*的内容。但是这样会带来ansible警告和更糟糕的问题:使用密码时需要进行转义处理。不要尝试这么做。

4

只需将其添加到playbook中:

become: yes
become_method: su

在运行playbook之前,请在主机服务器上导出以下环境变量:
ANSIBLE_BECOME_EXE=’sudo su -‘

这里是参考链接


1

认为这将与

工作。
- name: install Git
  yum:
    name: git
    state: present
  become: yes
  become_method: sudo
  become_exe: "sudo su - /bin/bash -c"

我已经尝试过了,结果发现我的用户没有权限运行 sudo su - /bin/bash。我可以运行普通的 sudo su -,但不能带任何额外的命令。或许值得向我们的安全团队询问是否可以授予我运行 sudo su - /bin/bash 的权限来解决这个问题... - nwinkler
2
@nwinkler 如果他们已经将您锁定,那么允许 sudo su - 可能是一个意外。出于审计原因,sudo 总是比 su 更好,因此如果他们阻止 sudo 的使用,则允许 sudo su 似乎是无意的。 - MillerGeek
@MillerGeek 当你的playbook被ansible运行时,会执行什么样的最终命令? - ConstantFun

0

也许你过于复杂化了?试试这种方式 -

- name: install Git
  become: yes
  become_user: root
  yum:
    name: git
    state: present

或者最坏的情况下,

- name: install Git
  become: yes
  become_user: root
  shell: yum install -y git

这有帮助吗?


那实际上是我尝试的第一件事,但它失败了并出现了上述错误。你的第二个建议类似于我现在正在使用的方法,即将对yum的调用包装到一个显式的sudo su -调用中,这可以工作,但缺点是没有使用Ansible yum模块及其所有好处... - nwinkler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接