2017-03-02 2 views
0

Ich habe eine Playbook, die einige Prechecks auf der Datenbank als Oracle-Benutzer ausführt. Der Remote-Knoten ist ein AIX-Server und deshalb habe ich ein Shell-Skript erstellt, das über das Playbook ausgeführt wird.Beschränken Anssible-Skript-Modul mit sudoers auf dem Remote-Knoten

--- 
- hosts: db 
    var_files: 
    - ansible_var.yml 

    tasks: 
    - name: "DB Checks" 
    become: True 
    become_user: oracle 
    script: "{ db_prechk }" 

Auf der AIX-Server, habe ich die folgenden Eintrag in die sudoers

Datei
ansible ALL=(oracle) NOPASSWD: /tmp/ansible-tmp-*/db_prechecks.sh 

Aber das Textbuch nicht mit dem Fehler, dass sie für das Privileg Eskalation Prompt wartet.

Dies läuft gut, wenn es als root ausgeführt wird. Wir wollen jedoch keine passwortlose Wurzel zwischen dem Ansible-Controller und den entfernten Knoten. Also haben wir einen Benutzer auf dem Controller und den entfernten Knoten erstellt und die SSH-Schlüssel ausgetauscht.

Dies läuft auch, wenn der sudoers Eintrag ist nur

ansible ALL=(oracle) NOPASSWD: ALL 

Wir wollen nicht zu vollem Zugriff auf den oracle Benutzer-ID über die ansible Benutzer-ID zur Verfügung zu stellen.

Ich habe das Playbook im ausführlichen Modus ausgeführt und kann sehen, dass Ansible das Skript in das Verzeichnis remote_tmp kopiert und es als oracle userid ausführt. In diesem Fall hätte die sudoers-Zeile das Ausführen zulassen sollen?

+1

testen/tmp mit noexec montiert ist. Sehen Sie sich/etc/fstab an – bodo

+0

@bodo Das würde nicht erklären, warum es mit 'NOPASSWD: ALL' funktioniert hat. – techraf

Antwort

1

Wenn Sie sich die ausführlichen Modus Ausgabe betrachten, sehen Sie, dass der tatsächliche Befehl von dem unterscheidet man in der sudoers-Datei angegeben:

< 127.0.0.1> SSH: EXEC ssh -o = Forward ja -o StrictHostKeyChecking = Nein -o UserKnownHostsFile =/dev/Null -o IdentitiesOnly = Ja -o ControlMaster = Auto -o ControlPersist = 60s -o StrictHostKeyChecking = Nein -o Port = 2202 -o 'IdentityFile = "/ Benutzer/techraf/devops/testground/debian/.vagrant/maschinen/debian/virtualbox/private_key "'-o KbdInteractiveAuthentication = keine -o PreferredAuthentications = gssapi-mit-mic, gssapi-keyex, hostbasiert, publickey -o PasswordAuthentication = no -o Benutzer = ansible -o ConnectTimeout = 120 -o ControlPath =/Verwenden rs/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 WERDEN-ERFOLG-xoamupogqwtteubvedoscaghzmfascsr;     /tmp/ansible-tmp-1488508771.72-271591203197790/db_prechecks.sh '"' "'" '"' "'" '"' "‘ & & Schlaf 0' " ' " ''

Was also nach sudo -u oracle ausgeführt wird, startet eigentlich mit /bin/sh -c.

ich es geschafft, eine Arbeits Zeichenfolge zu filtern:

ansible ALL=(oracle) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; * /tmp/ansible-tmp-*/db_prechecks.sh* 

Aber es basiert auf Trial-and-error. Ich bin mir noch nicht sicher, warum * zwischen ; und /tmp/... und am Ende erforderlich ist, aber sonst funktioniert es nicht.

In beiden Fällen hinzugefügt Ansible überflüssige Leerzeichen und es scheint der Grund zu sein, wie das Hinzufügen eines Speicherplatzes zu einem Shell-Befehl (in der sudoers Datei angegeben) wirkt sich auf die Fähigkeit sudo.

Sie könnten statt * mit ? versuchen, werde ich manchmal später

+0

Ich versuchte mit '?' Und '[a-z]', aber es funktioniert nicht. Ich kehrte zum '*' zurück und werde es weiter prüfen – kottapar

Verwandte Themen