Précédemment, nous avions découvert comment créer nos users avec ansible. Mais nous avons quelques lacunes avec cette gestion minimaliste des users. En effet, d’une part la connexion ne se fait que par mot de passe (ce n’est pas pratique et très sécurisé). D’autre part, l’existence du user pi est une vraie faille de sécurité. Toute installation d’un raspbian dispose systématiquement de ce user et bien sûr avec le même mot de passe (pratique mais pas sécurisé tout ça).
Création de nos users
Pour cela nous allons industrialiser tout cela avec Ansible. Pour appel, nous avions nos mots de passe stockés sous les varaiables de group_vars/all/all.yml avec ceci :
users_password_xavki: "{{ vault_users_password_xavki }}" users_password_xavier: "{{ vault_users_password_xavier }}"
Et ces variables faisaient appel à un fichier vault situé au même endroit dans group_vars/all/vault.yml mais chiffré par un mot de passe :
$ANSIBLE_VAULT;1.1;AES256 613362633865666266653364373533323263663137623536316431313933653331336239623437613232343965386434353761386436333663303533653862350a333939363463653663656563643966653035353666623165323434613434616334313163616663643763396635313636323666356437393665366339636561650a623032376634633634353132343539613962306132373230343232306234346664336231343866326532363930303566313262376264383231306664386462303461646432646433386535333432643337613138653365396132386261373362366463646564373830656265613239366334636361336462313039323064666432646161326463666635366663313539303136313965623430386435303466386634663161393438363134376138393137373033323565353065383465356638
Maintenant créons un répertoire dédié au stockage de nos clefs publiques (PUBLIQUES j’insiste) : files. Il s’agit des clefs que nous allons diffuser et installer dans la home de nos users. S’agissant de clefs publiques, un chiffrement n’est pas nécessaire, seule la clef privée est d’une importance capitale.
Maintenant modifions notre playbook de création des users :
- name: deploy users hosts: all become: yes vars: users_admin: - { name: "xavki", password: "{{ vault_users_password_xavki }}" } users_no_admin: - { name: "xavier", password: "{{ vault_users_password_xavier }}" } tasks: - name: create group admin group: name: "admin" state: present - name: create admin user accounts user: name: "{{ item.name }}" password: "{{ item.password | password_hash('sha512')}}" groups: "admin" with_items: - "{{ users_admin }}" no_log: true - name: create standard user accounts user: name: "{{ item.name }}" password: "{{ item.password | password_hash('sha512')}}" with_items: - "{{ users_no_admin }}" no_log: true - name: add authorized keys authorized_key: user: "{{ item.name }}" key: "{{ lookup('file', 'files/'+ item.name + '.key.pub') }}" with_items: - "{{ users_admin }}" - "{{ users_no_admin }}" - name: "Allow admin users to sudo without a password" lineinfile: dest: "/etc/sudoers" state: "present" regexp: "^%sudo" line: "%admin ALL=(ALL) NOPASSWD: ALL"
La tâche “add authorized keys” nous permet donc de récupérer ces clefs et de les placer par défaut dans la hoem de chaque users et selon la bonne pratique avec un répertoire “.ssh”.
Voici donc pour le déploiement de nos clefs correspondantes pour chaque utilisateurs.
Retrouvez les fichiers ici.
Suppression du user PI
Pour supprimer un utilisateur, la démarche est très simple, il suffit d’ajouter la tâches suivante :
- name: remove pi user user: name: "pi" state: absent
Profitons-en pour faire un peu d’organisation et de bonnes pratiques ansible. Pour cela nous allons utliser le principe de rôle. Un rôle est une sorte de module/librairie/fonction qui peut être appelé autant que nécessaire.
Pour cela nous allon créer un répertoire “roles” à la racine de notre ansible et taper la commande :
mkdir roles && cd roles ansible-galaxy init users
Cette commande créée toute la structure nécessaire pour créer le contenu d’un rôle. A l’heure actuelle ce qui nous intéresse c’est uniquement le répertoire task et son fichier main.yml. C’ets la première chose qui est appelé quand on lance un rôle. Donc dans ce fichier nous recopions le conteneur de notre users.yml.
Ensuite il nous faut modifier notre playbook pour appeler le rôle et non plus les tâches une à une :
- name: deploy users become: yes hosts: all roles: - users
Et voilà le tour est joué. il ne reste plus qu’à jouer le playbook :
ansible-playbook -i list_servers.yml -u xavki users.yml
Retrouvez les fichiers ici.