Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
linux:ansible:playbook_example_08 [22.09.2022 12:52. ] – [Script starten] djangolinux:ansible:playbook_example_08 [25.09.2022 11:35. ] (aktuell) – [Lösung] django
Zeile 17: Zeile 17:
  
 ==== Lösung ==== ==== Lösung ====
 +<WRAP center round tip 80%>
 +Der ungeduldigen Leser kann auch direkt zur Tat schreiten und das manuelle Anlegen des Verzeichnisses und des Ansible-Scripts überspringen. Mit Folgendem Befehl erledigt man dies sozusagen auf einem Rutsch:
 +
 +<code> $ mkdir ~/ansible ; wget https://gitlab.nausch.org/django/example_8a/-/archive/main/example_8a-main.tar.gz -O - | tar -xz --strip-components=1 -C ~/ansible</code>
 +
 +Anschliessend kann man direkt **[[#script_starten|zur Ausführung schreiten]]**.
 +</WRAP>
 === Script anlegen === === Script anlegen ===
 Zunächst müssen wir manuell einmal das Verzeichnis **''~/ansible/playbooks''** in dem wir unsere Ansible-Playbooks ablegen werden auf unserer Admin-Workstation bzw. dem **A**nsible-**C**ontroll-**N**ode anlegen. Zunächst müssen wir manuell einmal das Verzeichnis **''~/ansible/playbooks''** in dem wir unsere Ansible-Playbooks ablegen werden auf unserer Admin-Workstation bzw. dem **A**nsible-**C**ontroll-**N**ode anlegen.
Zeile 119: Zeile 126:
         - {directory: "library/"}         - {directory: "library/"}
         - {directory: "module_utils/"}         - {directory: "module_utils/"}
 +        - {directory: "playbooks/"}
         - {directory: "inventories/production/group_vars/"}         - {directory: "inventories/production/group_vars/"}
         - {directory: "inventories/production/host_vars/"}         - {directory: "inventories/production/host_vars/"}
Zeile 220: Zeile 228:
 ok: [localhost] => (item={'directory': 'library/'}) ok: [localhost] => (item={'directory': 'library/'})
 ok: [localhost] => (item={'directory': 'module_utils/'}) ok: [localhost] => (item={'directory': 'module_utils/'})
 +ok: [localhost] => (item={'directory': 'playbooks/'})
 ok: [localhost] => (item={'directory': 'inventories/production/group_vars/'}) ok: [localhost] => (item={'directory': 'inventories/production/group_vars/'})
 ok: [localhost] => (item={'directory': 'inventories/production/host_vars/'}) ok: [localhost] => (item={'directory': 'inventories/production/host_vars/'})
Zeile 275: Zeile 284:
  
 <WRAP center round info 80%> <WRAP center round info 80%>
-Mit Hinblick auf das all umspannende Thema **Sicherheit in der IT** ist eines unserer Hauotaugenmerke, dass schützenswerte Informationen nicht mehr als plain-text in unserer  Ansible-Entwicklungsumgebnung ungeschützt herumliegen. +Mit Hinblick auf das all umspannende Thema **Sicherheit in der IT** ist eines unserer Hauptaugenmerke, dass schützenswerte Informationen nicht mehr als plain-text in unserer  Ansible-Entwicklungsumgebnung ungeschützt herumliegen. 
 Folgende Sicherheitsvorkehrungen wollen wir unseren Admins an die Hand geben: Folgende Sicherheitsvorkehrungen wollen wir unseren Admins an die Hand geben:
-  - Die Anmeldung an remote Hosts erfolgt mit Hilfe der **SSH** ausschließlich mit Schl+üsseln, auf keinen Fall über Passworte. Anmeldung als **root** sind grundsätzlich unterbunden, auch die Anmeldung mit Hilfe eines User-Keys als root ist ebensowenig gestattet! Der Admin muss den SSH-Privat-Key besitzen und von dessen Passphrase Kenntnis haben. Wird ein **Nitrokey Start** USB-Schlüssel verwendet, kann bei Bedarf auch der **[[suse:nitrokey:start#nitrokey_start_und_secure_shell|SSH-Key bei Verwendung der SSH]]** benutzt werden. Die Zusätzliche Eingabe einer Passphrase erübrigt sich dadurch auch hier, wenn der SSH-Key auf dem Kryptostick verwendet wird!+  - Die Anmeldung an remote Hosts erfolgt mit Hilfe der **SSH** ausschliesslich mit Schlüsseln, auf keinen Fall über Passworte. Anmeldung als **root** sind grundsätzlich unterbunden, auch die Anmeldung mit Hilfe eines User-Keys als root ist ebenso wenig gestattet! Der Admin muss den SSH-Privat-Key besitzen und von dessen Passphrase Kenntnis haben. Wird ein **Nitrokey Start** USB-Schlüssel verwendet, kann bei Bedarf auch der **[[suse:nitrokey:start#nitrokey_start_und_secure_shell|SSH-Key bei Verwendung der SSH]]** benutzt werden. Die Zusätzliche Eingabe einer Passphrase erübrigt sich dadurch auch hier, wenn der SSH-Key auf dem Kryptostick verwendet wird!
   - Der Administrator soll beim Aufruf der Playbooks **__nur noch__** den PGP-Schlüssel durch Eingabe der zugehörigen Passphrase entsperren. Das Passwort für die Rechteerweiterung wird von Ansible aus dem Vault gelesen, genau so wie das **''become_password''** zur Rechteerweiterung.    - Der Administrator soll beim Aufruf der Playbooks **__nur noch__** den PGP-Schlüssel durch Eingabe der zugehörigen Passphrase entsperren. Das Passwort für die Rechteerweiterung wird von Ansible aus dem Vault gelesen, genau so wie das **''become_password''** zur Rechteerweiterung. 
  
-Wir wollen vertrauliche Informationen in unseren Playbooks bzw. im Inventory ausschließlich via **Ansible-Vault** vorhalten, da diese als krypted **AES256** Daten abgelegt und somit auch jederzeit in einem verteiltem Versionskontrollsystem wie **[[ https://git-scm.com/|git]]** vorgehalten werden können. Durch Nutzung des Passwort-Manager **''pass''** wird die Handhabung soweit vereinfacht, so dass der Admin auch ohne grosse Not mehrmals hintereinander Ansible-Playbooks ausführen kann, ohne sich durch zigfache Eingabe von Passworten sich selbst das Leben allzu schwer zu machen!+Wir wollen vertrauliche Informationen in unseren Playbooks bzw. im Inventory ausschliesslich via **Ansible-Vault** vorhalten, da diese als krypted **AES256** Daten abgelegt und somit auch jederzeit in einem verteiltem Versionskontrollsystem wie **[[ https://git-scm.com/|git]]** vorgehalten werden können. Durch Nutzung des Passwort-Manager **''pass''** wird die Handhabung soweit vereinfacht, so dass der Admin auch ohne grosse Not mehrmals hintereinander Ansible-Playbooks ausführen kann, ohne sich durch zigfache Eingabe von Passworten sich selbst das Leben allzu schwer zu machen!
  
 Aus Sicht von **IT-Security** haben wir somit einen erheblicher Zugewinn an Sicherheit. Die Akzeptanzschwelle ist durch Minimierung von mehrfachen Eingaben diverser Passworte durchaus niedrig, so dass für den Admin durchaus ein Mehrwert bei der täglichen administrativen Tätigkeit ausgemacht werden kann. Aus Sicht von **IT-Security** haben wir somit einen erheblicher Zugewinn an Sicherheit. Die Akzeptanzschwelle ist durch Minimierung von mehrfachen Eingaben diverser Passworte durchaus niedrig, so dass für den Admin durchaus ein Mehrwert bei der täglichen administrativen Tätigkeit ausgemacht werden kann.
Zeile 295: Zeile 304:
   - Ansible Directory Layout anlegen und mit Dummy-Inhalten versorgen.   - Ansible Directory Layout anlegen und mit Dummy-Inhalten versorgen.
   - Installation und Konfiguration des Passwortmanagers **''pass''**.   - Installation und Konfiguration des Passwortmanagers **''pass''**.
-  - Hinterlegen des Ansible Become Passworetes in einem Ansible-Vault.+  - Hinterlegen des Ansible Become Passwortes in einem Ansible-Vault.
  
 Somit erreichen wir später bequem unser gestecktes Ziel unsere Zeit als Admin effizient zu nutzen und in einer sicheren Umgebung uns zu bewegen.  Somit erreichen wir später bequem unser gestecktes Ziel unsere Zeit als Admin effizient zu nutzen und in einer sicheren Umgebung uns zu bewegen. 
  
 ==== Lösung ==== ==== Lösung ====
 +<WRAP center round tip 90%>
 +Der ungeduldigen Leser kann auch direkt zur Tat schreiten und das manuelle Anlegen des Verzeichnisses und des Ansible-Scripts überspringen. Mit Folgendem Befehl erledigt man dies sozusagen auf einem Rutsch:
 +
 +<code> $ mkdir ~/ansible ; wget https://gitlab.nausch.org/django/example_8b/-/archive/main/example_8b-main.tar.gz -O - | tar -xz --strip-components=1 -C ~/ansible</code>
 +
 +Anschliessend kann man, nachdem man die Variable **''admin_mail''** angepasst hat, dann auch gleich direkt **[[#script_starten1|zur Ausführung schreiten]]**.
 +</WRAP>
 === Script anlegen === === Script anlegen ===
 <WRAP center round important 60%> <WRAP center round important 60%>
Zeile 410: Zeile 426:
         - {directory: "library/"}         - {directory: "library/"}
         - {directory: "module_utils/"}         - {directory: "module_utils/"}
 +        - {directory: "playbooks/"}
         - {directory: "inventories/production/group_vars/"}         - {directory: "inventories/production/group_vars/"}
         - {directory: "inventories/production/host_vars/"}         - {directory: "inventories/production/host_vars/"}
Zeile 494: Zeile 511:
     - name: "Sicherstellen dass das File für das verschlüsselte become-password noch nicht existiert"     - name: "Sicherstellen dass das File für das verschlüsselte become-password noch nicht existiert"
       ansible.builtin.file:       ansible.builtin.file:
-        path: '/home/{{ admin_user }}/ansible/inventories/production/group_vars/all/vault.yml'+        path: '/home/{{ admin_user }}/ansible/inventories/production/group_vars/all/vault'
         state: absent         state: absent
  
     - name: "Ansible Become Password für sudo Rechteerweiterung anlegen"     - name: "Ansible Become Password für sudo Rechteerweiterung anlegen"
       ansible.builtin.copy:       ansible.builtin.copy:
-        dest: '/home/{{ admin_user }}/ansible/inventories/production/group_vars/all/vault.yml'+        dest: '/home/{{ admin_user }}/ansible/inventories/production/group_vars/all/vault'
         content: |         content: |
 +          # Generated by Ansible on {{ ansible_date_time.date }}, do not edit manually!
           ansible_become_pass: {{ become_secret }}           ansible_become_pass: {{ become_secret }}
         owner: '{{ admin_user }}'         owner: '{{ admin_user }}'
Zeile 510: Zeile 528:
       become: true       become: true
       shell: |       shell: |
-        ansible-vault encrypt /home/{{ admin_user }}/ansible/inventories/production/group_vars/all/vault.yml+        ansible-vault encrypt /home/{{ admin_user }}/ansible/inventories/production/group_vars/all/vault
       changed_when: false       changed_when: false
 +
 +    - name: "Sicherstellen dass das File mit der Ansible-Konfiguration nicht existiert"
 +      ansible.builtin.file:
 +        path: '/home/{{ admin_user }}/ansible/inventories/production/group_vars/all/ansible_environment'
 +        state: absent
 +
 +    - name: "Ansible Konfigurationsdatei mit den Definitionen zu privilege_escalation anlegen"
 +      ansible.builtin.copy:
 +        dest: '/home/{{ admin_user }}/ansible/inventories/production/group_vars/all/ansible_environment'
 +        content: |
 +          # Generated by Ansible on {{ ansible_date_time.date }}, do not edit manually!
 +          ansible_become: True
 +          ansible_become_method: sudo
 +          ansible_become_user: root
 +          ansible_become_ask_pass: False
 +        owner: '{{ admin_user }}'
 +        group: '{{ admin_user }}'
 +        mode: '0644'
  
 ... # YML Ende</file> ... # YML Ende</file>
Zeile 538: Zeile 574:
   - Installation des Passwort-Managers **''pass''**   - Installation des Passwort-Managers **''pass''**
   - vault-Wrapperscript im **''bin''** Verzeichnis des Admins ablegen und ggf. das zugehörige Verzeichnis anlegen.   - vault-Wrapperscript im **''bin''** Verzeichnis des Admins ablegen und ggf. das zugehörige Verzeichnis anlegen.
-  - Store-Passwort f+r **''pass''** im zugehörigen Verzeichnis ablegen, dabei ggf. ein bereits existierendes **pass**-Verzeichnis löschen.+  - Store-Passwort für **''pass''** im zugehörigen Verzeichnis ablegen, dabei ggf. ein bereits existierendes **pass**-Verzeichnis löschen.
   - Im Inventory das **''become_password''** unter **''group_vars/all''** ablegen und dabei eine bereits existierende vault-Datei vorher entfernen.   - Im Inventory das **''become_password''** unter **''group_vars/all''** ablegen und dabei eine bereits existierende vault-Datei vorher entfernen.
   - Ansible-Vault Datei, die zuvor angelegt wurde, mit dem Ansible-Vault-Passwort sicher verschlüsseln.    - Ansible-Vault Datei, die zuvor angelegt wurde, mit dem Ansible-Vault-Passwort sicher verschlüsseln. 
 +  - Im Inventory die Definitionen zu privilege_escalation anlegen und auch hier ggf. ein bereits existierende Konfigurationsdatei vorher löschen.
  
 === Script starten === === Script starten ===
Zeile 587: Zeile 624:
 ok: [localhost] => (item={'directory': 'library/'}) ok: [localhost] => (item={'directory': 'library/'})
 ok: [localhost] => (item={'directory': 'module_utils/'}) ok: [localhost] => (item={'directory': 'module_utils/'})
 +ok: [localhost] => (item={'directory': 'playbooks/'})
 ok: [localhost] => (item={'directory': 'inventories/production/group_vars/'}) ok: [localhost] => (item={'directory': 'inventories/production/group_vars/'})
 ok: [localhost] => (item={'directory': 'inventories/production/host_vars/'}) ok: [localhost] => (item={'directory': 'inventories/production/host_vars/'})
Zeile 646: Zeile 684:
 TASK [Ansible Become Password mit ansible-vault verschlüsseln] **************************************************************</font> TASK [Ansible Become Password mit ansible-vault verschlüsseln] **************************************************************</font>
 <font style="color: rgb(25, 100, 5)">ok: [localhost]</font> <font style="color: rgb(25, 100, 5)">ok: [localhost]</font>
 +<font style="color: rgb(0, 0, 0)">
 +TASK [Sicherstellen dass das File mit der Ansible-Konfiguration nicht existiert] ********************************************</font>
 +<font style="color: rgb(25, 100, 5)">ok: [localhost]</font>
 +<font style="color: rgb(0, 0, 0)">
 +TASK [Ansible Konfigurationsdatei mit den Definitionen zu privilege_escalation anlegen] *************************************</font>
 +<font style="color: rgb(196, 160, 0)">changed: [localhost]</font>
 <font style="color: rgb(0, 0, 0)"> <font style="color: rgb(0, 0, 0)">
 PLAY RECAP ********************************************************************************************************************</font> PLAY RECAP ********************************************************************************************************************</font>
-<font style="color: rgb(196, 160, 0)">localhost</font><font style="color: rgb(0, 0, 0)">                  : </font><font style="color: rgb(25, 100, 5)">ok=14    </font><font style="color: rgb(196, 160, 0)">changed=   </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    </font><font style="color: rgb(43, 100, 164)">skipped=3    </font><font style="color: rgb(0, 0, 0)">rescued=0    ignored=0</font>+<font style="color: rgb(196, 160, 0)">localhost</font><font style="color: rgb(0, 0, 0)">                  : </font><font style="color: rgb(25, 100, 5)">ok=16    </font><font style="color: rgb(196, 160, 0)">changed=   </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    </font><font style="color: rgb(43, 100, 164)">skipped=3    </font><font style="color: rgb(0, 0, 0)">rescued=0    ignored=0</font>
  
 </pre> </pre>
Zeile 662: Zeile 706:
 ===== Fazit und Ausblick ===== ===== Fazit und Ausblick =====
 <WRAP center round info 60%> <WRAP center round info 60%>
-Wir haben nun Dank der beiden gezeigten Ansible-Playbooks zur Konfiguration unserer Ansible-Umgebung die Möglichkeit, jederzeit bei Bedarf einen weiteren Adminzu befähigen bzw. eine bestehende Umgebung erenuet auszurollen. Somit können wir nun mit **Ansible-Vault** vertrauliche Informationen in unseren Playbooks bzw. im Inventory ablegen. Diese werden als krypted **AES256** Daten abgelegt und können dadurch auch jederzeit in einem verteiltem Versionskontrollsystem wie **[[ https://git-scm.com/|git]]** vorgehalten werden. Durch Nutzung des Passwort-Manager **''pass''** wird die Handhabung soweit vereinfacht, so dass der Admin auch ohne grosse Not mehrmals hintereinander Ansible-Playbooks ausführen kann, ohne sich durch zigfache Eingabe von Passworten sich selbst das Leben allzu schwer zu machen!+Wir haben nun Dank der beiden gezeigten Ansible-Playbooks zur Konfiguration unserer Ansible-Umgebung die Möglichkeit, jederzeit bei Bedarf einen weiteren Admin zu befähigen bzw. eine bestehende Umgebung erneut auszurollen. Somit können wir nun mit **Ansible-Vault** vertrauliche Informationen in unseren Playbooks bzw. im Inventory ablegen. Diese werden als krypted **AES256** Daten abgelegt und können dadurch auch jederzeit in einem verteiltem Versionskontrollsystem wie **[[ https://git-scm.com/|git]]** vorgehalten werden. Durch Nutzung des Passwort-Manager **''pass''** wird die Handhabung soweit vereinfacht, so dass der Admin auch ohne grosse Not mehrmals hintereinander Ansible-Playbooks ausführen kann, ohne sich durch zigfache Eingabe von Passworten sich selbst das Leben allzu schwer zu machen!
 </WRAP> </WRAP>
  
 ====== Links ====== ====== Links ======
   * **[[detail|zurück zum Kapitel "Ansible - Erweiterte Konfigurationsbeispiele"]] <= **   * **[[detail|zurück zum Kapitel "Ansible - Erweiterte Konfigurationsbeispiele"]] <= **
-  * **=> [[playbook_example_08|weiter zum Kapitel "Ansible - erweitertes Konfigurationsbeispiel: Ansible mit Ansible einrichten]]**+  * **=> [[playbook_example_09|weiter zum Kapitel "Ansible - Erweiterte Konfigurationsbeispiel: Inventory]]**
   * **[[start|Zurück zur "Ansible"-Übersicht]]**   * **[[start|Zurück zur "Ansible"-Übersicht]]**
   * **[[wiki:start|Zurück zu >>Projekte und Themenkapitel<<]]**   * **[[wiki:start|Zurück zu >>Projekte und Themenkapitel<<]]**
   * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**   * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**
  • linux/ansible/playbook_example_08.1663851177.txt.gz
  • Zuletzt geändert: 22.09.2022 12:52.
  • von django