Ändern Sie die Sudoers-Datei mit einer ansiblen Playbook-Vorlage


8

Ich versuche, eine Sudoers-Datei mit einer ansiblen Vorlage zu erstellen. Die sudoers-Datei sollte wie folgt aussehen:

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

Was ich bisher geschafft habe, ist unten:

Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

Die Vorlage sieht wie folgt aus:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = {{ item }}
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}

vars

commands:
  - ls
  - less
  - du

Soweit ich weiß, verfügt das Ansible-Vorlagenmodul über nichts, was den Befehl auf dem Remote-Server ausführt und die Ausgabe druckt. Andernfalls habe ich daran gedacht, die Vorlagendatei so zu ändern, dass sie wie folgt aussieht:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = `which {{ item }}`
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}    
{% endfor %}

und die Ausgabe wird so sein, wie ich es wollte.

Gibt es eine andere Methode, die es einfach machen kann?

Übrigens habe ich diesen Beitrag bereits überprüft


Ich würde nur den vollständigen Pfad des Befehls in Ihre vars
jdog

Für Änderungen am System bevorzuge ich das Einfügen von Skripten in Bash, um besser zu laufen.
Lord

Antworten:


5

TL; DR: KISS. Verwenden Sie nicht weniger.

Menschen machen oft einen Fehler mit Ansible, indem sie versuchen, variable Dinge zu machen, die nicht sein müssen. Sofern Sie nicht an mehreren Stellen die Liste der Befehle definieren, auf die der Support zugreifen kann, ist es durchaus akzeptabel, sie einfach in die Erstellungsdatei der Vorlage einzufügen:

templates / etc / sudoers.d / support1

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /bin/cat
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

oder sogar explizit, da Sie die Cmnd_Alias ​​nirgendwo wiederverwenden

%support1 ALL=(ALL) NOPASSWD: /bin/ls
%support1 ALL=(ALL) NOPASSWD: /bin/cat
%support1 ALL=(ALL) NOPASSWD: /usr/bin/du

Und fügen Sie eine Aufgabe hinzu wie:

- name: add templates
  template:
    src: {{ item }}
    dest: /{{ item }}
    owner: root
    group: root
    mode: 0640
  with_items:
    - etc/sudoers.d/support1

Sie würden nur Vorlagen anstelle von Dateien verwenden, da zu einem späteren Zeitpunkt möglicherweise eine Variable hinzugefügt werden muss oder der Gruppenname von einer Variablen stammt, wenn Sie eine andere Rolle erhalten, die die Gruppen erstellt.

Wenn Sie eine Variable verwenden müssen, können Sie eine Liste von Hashes wie folgt verwenden:

sudoers.support1.commands:
- { alias: "LS", path: "/bin/ls" }
- { alias: "DU", path: "/usr/bin/du" }

Dann in der Vorlage:

{% for item in sudoers.{{ group }}.commands %}
Cmnd_Alias {{ item.alias }} = {{ item.path }}
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {{ sudoers.{{ group }}.commands | map(attribute='alias') | join(', ') }}

Es ist nicht sicher, / usr / bin / less zu verwenden

Bei alledem haben Sie nicht viel Wichtiges bemerkt und das ist die Verwendung von weniger als Betrachter. Leider ist das eine Sicherheitslücke. Sie können '! Bash' eingeben, um bash aufzurufen. Durch Drücken von 'v' gelangen Sie in den Editor, der auf den Variablen VISUAL, EDITOR oder LESSEDIT basiert. Sie können ihnen also '/ bin / cat' geben und sie können den Inhalt immer in weniger selbst weiterleiten. Beachten Sie, dass dies immer noch eine Sicherheitslücke ist, da einige Dateien unter Unix absichtlich eingeschränkt sind, zum Beispiel:

/etc/shadow
/etc/sudoers
/etc/ssh/ssh_host_rsa_key
$HOME/.ssh/id_rsa

1
Ich mag den zweiten Teil. Wir sollten es unterlassen, weniger als sudo-Befehl zu verwenden.
Err0rr

1
Es gibt keinen Unterschied zwischen dem Ändern der Variablen und dem Ändern der Vorlage, wenn die Änderung an einer Stelle erfolgt. Die Verwendung der Variablen macht sie nur weniger lesbar. Wenn Sie die Variable wirklich verwenden müssen, benennen Sie sie besser und Liste der Hashes,
Jiri Klouda

1

zuerst

Sie sollten sich auf Jinja Umgang mit Leerzeichen / Zeilenumbrüchen beziehen. Ihre aktuelle Vorlage würde neue Zeilen erstellen. Und ich denke, dies wird die sudoSyntaxvalidierung verwirren und fehlschlagen (IIRC, die richtige Syntax besteht darin, Folgendes hinzuzufügen -: -%}an der for-Schleife, aber Sie sollten "spielen" und sehen, was passiert). Um eine Vorlage zu rendern, können Sie dies auf Ihrer Workstation tun, ohne sie auf dem tatsächlichen Zielcomputer auszuführen.

Ich denke auch, dass das Erstellen der Vorlage mit 1 Befehl in der Befehlszeile besser lesbar ist:

{% for command in commands %}
%{{group}} ALL=(ALL) NOPASSWD: {{command}}
{% endfor %}

Zweitens

Ich empfehle nicht, vorhandene globale Dateien mit ansible zu bearbeiten. Erstellen Sie stattdessen Ihre benutzerdefinierte Vorlage unter /etc/sudoers.d/(wie Sie bereits erwähnt haben).

Dies ist der richtige Weg, weil:

  • Das System hat alle Standardeinstellungen wie sie sind.
  • Ihre Vorlage wird viel kürzer sein.
  • Wenn Sie Fehler machen, sind Sie sicher, wo Sie suchen müssen - in Ihrer Vorlage.

Drittens

Ich denke, die Ausführung im whichInneren sudoersist eine originelle Idee, sollte aber nicht funktionieren.


1
in der Tat habe ich eine Syntaxfehlermeldung erhalten. Ich werde in die Syntax schauen. Und dafür habe ich natürlich eine eigene Datei erstellt.
Err0rr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.