我有一个Playbook,可以作为Oracle用户对数据库执行一些预检。远程节点是AIX服务器,因此我创建了一个通过playbook运行的shell脚本。
---
- hosts: db
var_files:
- ansible_var.yml
tasks:
- name: "DB Checks"
become: True
become_user: oracle
script: "{ db_prechk }"
在AIX服务器上,我将以下条目添加到sudoers文件
ansible ALL=(oracle) NOPASSWD: /tmp/ansible-tmp-*/db_prechecks.sh
但是剧本失败了,它正在等待特权提升提示。
如果以root身份运行,则运行正常。但是,我们不希望Ansible控制器和远程节点之间有无密码根。所以我们在控制器和远程节点上创建了ansible用户并交换了SSH密钥。
如果sudoers条目只是
,这也会运行ansible ALL=(oracle) NOPASSWD: ALL
我们也不希望通过oracle
用户ID提供对ansible
用户ID的完全访问权限。
我以详细模式运行了剧本,可以看到Ansible正在将脚本复制到remote_tmp
目录,并将其作为oracle
用户ID执行。在那种情况下,sudoers线应该允许它运行?
答案 0 :(得分:1)
如果查看详细模式输出,您将看到实际命令与您在sudoers
文件中指定的命令不同:
< 127.0.0.1> SSH:EXEC ssh -o ForwardAgent = yes -o StrictHostKeyChecking = no -o UserKnownHostsFile = / dev / null -o IdentitiesOnly = yes -o ControlMaster = auto -o ControlPersist = 60s -o StrictHostKeyChecking = no -o Port = 2202 -o' IdentityFile =“/ Users / techraf / devops / testground / debian / .vagrant / machines / debian / virtualbox / private_key”' - o KbdInteractiveAuthentication = no -o PreferredAuthentications = gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication = no -o User = ansible -o ConnectTimeout = 120 -o ControlPath = / Users / techraf / .ansible / cp / ansible-ssh-%h-%p-%r -tt 127.0.0.1'/ bin / sh - c'“''' sudo -H -S -n -u oracle / bin / sh -c'”''''''''''''''''echo BECOME-SUCCESS-xoamupogqwtteubvedoscaghzmfascsr; /tmp/ansible-tmp-1488508771.72-271591203197790/db_prechecks.sh'“'''''''''''''''&&睡0'“''''
所以在sudo -u oracle
实际使用/bin/sh -c
启动后执行的内容。
我设法将工作字符串过滤到:
ansible ALL=(oracle) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; * /tmp/ansible-tmp-*/db_prechecks.sh*
但它基于反复试验。我不确定为什么在*
和;
之间以及最后需要/tmp/...
,但是否则它不起作用。
在这两个地方,Ansible添加了多余的空格字符,这似乎是原因,因为向shell命令添加空格(在sudoers
文件中指定)确实会影响sudo
的能力。 / p>
您可以尝试使用?
代替*
,我稍后会测试
答案 1 :(得分:0)
回复@techraf的答案:sudo似乎会截断多余的空间,您可以使用sudo -l
看到它。我可以按照sudo的手册页中的说明用\
转义空格来解决此问题:
\ x对于任何字符“ x”,求值为“ x”。
答案 2 :(得分:0)
Q:”如果sudoers条目只是
ansible ALL=(oracle) NOPASSWD: ALL
,这也会运行”
A:引用Privilege escalation must be general:
“您不能将特权升级权限限制为某些命令...”