{"id":1482,"date":"2016-07-18T08:30:50","date_gmt":"2016-07-18T06:30:50","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=1482"},"modified":"2021-01-25T13:07:33","modified_gmt":"2021-01-25T12:07:33","slug":"linux-benutzerkonten-mit-ansible-verwalten","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/linux-benutzerkonten-mit-ansible-verwalten\/","title":{"rendered":"Linux-Benutzerkonten mit Ansible verwalten"},"content":{"rendered":"<p>Wie bereits in <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/ansible-it-automation-fuer-jedermann\/\">diesem Beitrag<\/a> erw\u00e4hnt, besch\u00e4ftige ich mich aktuell mit der Evaluierung von Ansible.<\/p>\n<p>In diesem Artikel dokumentiere ich ein Beispiel, wie das Modul <code>user<\/code> zur Administration von Linux-Benutzerkonten verwendet werden kann. Der Link zur offiziellen Dokumentation des <code>user<\/code>-Moduls befindet sich am Ende dieses Artikels.[1. <a href=\"https:\/\/docs.ansible.com\/ansible\/2.9\/modules\/user_module.html\" target=\"_blank\" rel=\"noopener noreferrer\">Ansible Module: user &#8211; Manage user accounts<\/a> {en}]<\/p>\n<p><b>Hinweis:<\/b> Die folgende Konfiguration ist nicht zur Nachahmung empfohlen. Es handelt sich dabei um meine ersten Schritte mit Ansible. Es ist daher wahrscheinlich, dass die Konfiguration noch Fehler enth\u00e4lt, nicht optimiert ist und ein gro\u00dfes Verbesserungspotenzial besitzt. Die Nachahmung erfolgt ausdr\u00fccklich auf eigene Gefahr. \u00dcber Hinweise, wie man es besser machen kann, freue ich mich jederzeit.<\/p>\n<h2>Anforderungen<\/h2>\n<ul>\n<li>Es soll ein lokales Benutzerkonto angelegt werden<\/li>\n<li>Der Benutzer soll Mitglied der Gruppe &#8222;wheel&#8220; werden<\/li>\n<li>Es soll ein initiales Passwort f\u00fcr das Benutzerkonto gesetzt werden<\/li>\n<li>Ein \u00f6ffentlicher SSH-Schl\u00fcssel soll in die Datei <code>authorized_keys<\/code> des zu erstellenden Benutzers eingetragen werden<\/li>\n<li>Konfiguration des SSH-Daemons<\/li>\n<\/ul>\n<h2>Vorbereitung<\/h2>\n<p>Abgeleitet aus den &#8222;Best Practices&#8220;[2. <a href=\"https:\/\/docs.ansible.com\/ansible\/2.9\/user_guide\/playbooks_best_practices.html#directory-layout\" target=\"_blank\" rel=\"noopener noreferrer\">Ansible Best Practices &#8211; Directory Layout<\/a>] verwende ich auf meiner Spielwiese folgende Verzeichnisstruktur:<\/p>\n<pre>ansible\/\r\n|-- autoupdate.txt            # ignore\r\n|-- autoupdate.yml            # ignore\r\n|-- check_reboot.             # playbook which sets the repos\r\n|-- group_vars\r\n|   `-- e-stage               # variables for group e-stage\r\n|-- hosts                     # inventory file\r\n|-- host_vars                 # for system specific variables\r\n|-- roles\r\n|   |-- common                # this hierarchy represents a \"role\"\r\n|   |   |-- defaults          \r\n|   |   |-- files\r\n|   |   |-- handlers\r\n|   |   |   `-- main.yml      # handlers file\r\n|   |   |-- meta\r\n|   |   |-- tasks\r\n|   |   |   `-- main.yml      # tasks file can include smaller files if warranted\r\n|   |   `-- vars\r\n|   `-- e-stage\r\n|       |-- defaults\r\n|       |-- files\r\n|       |-- handlers\r\n|       |-- meta\r\n|       |-- templates\r\n|       `-- vars\r\n|-- create_johnd.yml          # playbook which creates user johnd\r\n|-- site.yml                  # master playbook file\r\n`-- staging                   # inventory file for staging environment\r\n\r\n17 directories, 11 files\r\n<\/pre>\n<p>Um das Passwort f\u00fcr den neuen Benutzer erstellen zu k\u00f6nnen, muss zuerst der passende Passwort-Hash generiert werden[3. <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/reference_appendices\/faq.html#how-do-i-generate-encrypted-passwords-for-the-user-module\" target=\"_blank\" rel=\"noopener noreferrer\">How do I generate crypted passwords for the user module?<\/a>]:<\/p>\n<pre>python -c \"from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())\"\r\n<\/pre>\n<p>Der generierte Hash wird auf der Standardausgabe ausgegeben. Dieser wird f\u00fcr das Playbook ben\u00f6tigt.<\/p>\n<h2>Playbook und Tasks<\/h2>\n<p>Das Playbook ist sehr kurz gehalten und gibt im Wesentlichen nur an, welche Hosts auf welche Rolle gemapped werden sollen.<\/p>\n<pre># create_johnd.yml\r\n---\r\n- hosts: all\r\n  roles:\r\n    - common\r\n<\/pre>\n<p>Bei Verwendung dieses Playbooks werden die Tasks aus der Datei <code>roles\/common\/tasks\/main.yml<\/code> ausgef\u00fchrt, welche wie folgt aufgebaut wurde:<\/p>\n<pre>---\r\n# Configure sshd_config on target system\r\n- name: Enable Public-Key-Authentication\r\n  lineinfile:\r\n    dest: \/etc\/ssh\/sshd_config\r\n    regexp: \"^PubkeyAuthentication\"\r\n    line: \"PubkeyAuthentication yes\"\r\n    state: present\r\n  notify:\r\n    - reload sshd\r\n\r\n- name: Set AuthorizedKeyFile\r\n  lineinfile:\r\n    dest: \/etc\/ssh\/sshd_config\r\n    regexp: \"^AuthorizedKeysFile\"\r\n    line: \"AuthorizedKeysFile      .ssh\/authorized_keys\"\r\n    state: present\r\n  notify:\r\n    - reload sshd\r\n\r\n- name: Disable PasswordAuthentication\r\n  lineinfile:\r\n    dest: \/etc\/ssh\/sshd_config\r\n    regexp: \"^PasswordAuthentication\"\r\n    line: \"PasswordAuthentication no\"\r\n    state: present\r\n  notify:\r\n    - reload sshd\r\n\r\n# Add user johnd with specific uid in group 'wheel'\r\n- user: name=johnd comment=\"John Doe\" uid=100 groups=wheel password=\"PASSWORDHASH\" shell=\/bin\/bash append=yes state=present\r\n  notify:\r\n    - deploy ssh-pub-keys\r\n<\/pre>\n<p>Die hier spezifizierten Tasks setzen die folgenden Aufgaben um:<\/p>\n<ul>\n<li>Aktivierung der Public-Key-Authentication<\/li>\n<li>Spezifikation des Standard-AuthorizedKeysFile<\/li>\n<li>Deaktivierung der Password-Authentication<\/li>\n<\/ul>\n<p>Was in dieser Datei noch nicht zu sehen ist, ist die Verteilung eines \u00f6ffentlichen SSH-Schl\u00fcssels. Dies wird von dem Handler[4. <a href=\"https:\/\/docs.ansible.com\/ansible\/2.9\/user_guide\/playbooks_intro.html#handlers-running-operatins-on-change\" target=\"_blank\" rel=\"noopener noreferrer\">Ansible Handlers &#8211; Running Operations On Change<\/a>] <code>deploy ssh-pub-keys<\/code> \u00fcbernommen.<\/p>\n<p>Der Handler ist in der Datei <code>roles\/common\/handlers\/main.yml<\/code> definiert. Es handelt sich dabei um einen Task, welcher nur ausgef\u00fchrt wird, wenn der Benutzer erfolgreich erstellt wurde.<\/p>\n<h2>Fazit<\/h2>\n<p>Soweit zu meinen ersten Gehversuchen mit Ansible Playbooks. Meine Anforderungen k\u00f6nnen mit dem hier dokumentierten Playbook erf\u00fcllt werden.<\/p>\n<p>In dem hier beschriebenen Beispiel habe ich angenommen, dass es sich bei dem zu erstellenden Benutzer um das erste lokale Benutzerkonto neben root handelt. Dieses soll \u00fcber die Berechtigung verf\u00fcgen, Kommandos mit <code>sudo<\/code> auszuf\u00fchren und prim\u00e4r f\u00fcr die Arbeit auf dem System verwendet werden.<\/p>\n<p>Die Verteilung des SSH-Schl\u00fcssels \u00fcber einen Handler anzusto\u00dfen erscheint mir jedoch nicht optimal. Der Handler wird nur dann ausgef\u00fchrt, wenn durch das <code>user<\/code>-Modul \u00c4nderungen am Zielsystem vorgenommen wurden. Weitere SSH-Schl\u00fcssel bzw. \u00c4nderungen an bereits vorhandenen SSH-Schl\u00fcsseln lassen sich auf diesem Weg nicht vornehmen.<\/p>\n<p>Daher erscheint es mir sinnvoll, die Verteilung von SSH-Schl\u00fcsseln \u00fcber das Modul <code>authorized_key<\/code>[5. <a href=\"https:\/\/docs.ansible.com\/ansible\/2.9\/modules\/authorized_key_module.html\" target=\"_blank\" rel=\"noopener noreferrer\">Ansible Module: authorized_key &#8211; Adds or removes an SSH authorized key<\/a>] in ein eigenes Playbook auszulagern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie bereits in diesem Beitrag erw\u00e4hnt, besch\u00e4ftige ich mich aktuell mit der Evaluierung von Ansible. In diesem Artikel dokumentiere ich ein Beispiel, wie das Modul user zur Administration von Linux-Benutzerkonten verwendet werden kann. Der Link zur offiziellen Dokumentation des user-Moduls befindet sich am Ende dieses Artikels.[1. Ansible Module: user &#8211; Manage user accounts {en}] Hinweis:<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/linux-benutzerkonten-mit-ansible-verwalten\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[532,51],"tags":[410,412,305,411],"class_list":["post-1482","post","type-post","status-publish","format-standard","hentry","category-ansible","category-linux","tag-ansible","tag-authorized_key","tag-planet","tag-user"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=1482"}],"version-history":[{"count":20,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1482\/revisions"}],"predecessor-version":[{"id":2751,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1482\/revisions\/2751"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=1482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=1482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=1482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}