我有一个简单的 ansible 测试手册,可以在 locahost 和一台远程主机上运行。
该剧本运行 linux 命令“pvs”,该命令需要以 root 身份运行。
我在
become=true
中有 ansible.cfg
。/etc/sudoers
中配置为“丑陋”ALL=(ALL:ALL) NOPASSWD: ALL
- 因为显然没有其他解决方案可以在不提供密码的情况下以批处理模式以 root 身份启动命令,正如 Vladimir 所证实的那样:
在远程节点上使用 sudoers 限制 Ansible 脚本模块
(我可以执行 Cmnd_Alias,但最终,ansible 需要 /bin/sh .. 所以没有必要用其他命令来限制它)
并且,当我运行下面的剧本时,我还必须在远程计算机中配置相同的 sudoers 配置。
这是否意味着,在我们管理的所有计算机上,我们需要让这个“ansible”用户通过 sudo 获得 root 访问权限?我希望不会,否则这是一个非常大的安全问题。
您有什么建议、解决方法或想法可以与我分享以限制 root 访问吗?
[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
谢谢你
如果你真的害怕使用 nopasswd sudo 拥有用户帐户,有几个选择:
specialuser ALL=(ALL) NOPASSWD: ALL
。这里的弱保护是主机上的任何人都不能在没有 root 的情况下成为 specialuser
,并且只有 ansible 控制器才能访问该 specialuser
的私钥。这一切并非难以理解,但至少你的 qemu
用户不再可以通过简单的 sudo 调用成为 root。因此,无论是用于 sudo 的 pam_ssh,还是用于 ansible 的专用用户。
不幸的是,我认为没有一个选项可以在没有 sudoers 文件的情况下执行需要 root 权限的命令。
正如在这里回答,您只能允许您要执行的一个特定命令。这可能类似于以下行:
ansible ALL=(ALL:ALL) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; * pvs
提高安全性的另一个选项(如果您还没有这样做)是在每台主机上创建特定的 ansible 用户,并仅通过特定主机允许的 SSH 私钥/公钥进行身份验证。