Maverik

Création et configuration du compte maverik

Le code présenté a été modifié enfin de faciliter la lecture et d’éviter une redondance trop importante entre les différentes phases de la configuration.
Le sens du code n’est nullement changé.

Création de l’utilisateur

Lorsque l’utilisateur maverik est créé, il est directement inclue dans le groupe TOPGUN précédemment créé. On indique ensuite que le terminal de ce compte correspond au binaire bash déjà présent sur la machine. On génère ensuite un clé rsa de 4096 bits. Enfin, on lui donne un mot de passe d’utilisateur par défaut. Ce mot de passe subit un hash de façon à ce qu’il n’apparaisse pas en clair dans les fichiers de configuration de la machine debian.

---
# tasks file for users
    
- name: Creation utilisateurs + generation de clef rsa
  user:
    name: "{{ item.name }}"
    groups: TOPGUN
    append: yes
    shell: /bin/bash
    generate_ssh_key: yes
    ssh_key_bits: 4096
    ssh_key_file: .ssh/id_rsa
    password: "{{ 'tmp' | password_hash('sha512') }}"
  with_items:
    - { name: "maverik" }

Configuration des accès SSH

Afin de personnaliser les moyens d’authentifications au service ssh du serveur, un bloc Match est créé. Celui permet de donner à un ou plusieurs groupes/utilisateurs des règles spécifiques de configuration ssh. Ici, seul le cas des moyens d’authentification est traité.

Grâce au module ansible blockinfile, il est possible d’ajouter dans un fichier (ici sshd_config) un bloc de text, éventuellement indenté, identifié par ses balises de début, et de fin. Ces balises doivent être uniques de façon à ce qu’ansible puisse les reconnaître avant d’ajouter le bloc de texte au fichier. S’il reconnait les balises, il vérifie les différences de texte entre le bloc du fichier, et celui du script. S’ilS sont identiques, aucune modification n’est apportée, sinon le bloc est remplacé. De cette façon, ansible garantit la non-duplication des blocs de texte.

De ce cas précis, on ajoute un bloc dans le fichier sshd_config, qui va permettre de spécifier pour l’utilisateur maverik les moyens d’authentification requis.

La ligne suivante permet de spécifier la configuration du compte maverik:

Match User maverik
    # règles

La ligne suivante permet de contraindre l’authentification de l’utilisateur maverik par ssh aux services PAM (ici, seulement google-authenticator comme vu précédemment):

AuthenticationMethods keyboard-interactive:pam

Une fois la modification du fichier sshd_config effectuée, il est conseillé de s’assurer directement de la validité de la modification apportée avec le paramètre de blockinfile:

validate: "/usr/sbin/sshd -T -f %s"

Enfin, comme des fichiers de configuration sshd on été modifiés, on s’assure de bien redémarrer le service en fin d’exécution du script ansible grâce au handler:

notify:
# On relance le service ssh (sshd)
- Handler_restart_ssh

Voici le code complet détaillé dans cette partie:

---
# tasks file for roles/openssh/

# Définition des règles d'accès ssh au serveur par utilisateur et/ou groupe
- name: Configuration ssh specifique - "{{ item.name }}"
  blockinfile:
    path: /etc/ssh/sshd_config
    marker: "# {mark} ANSIBLE MANAGED BLOCK - {{ item.name }}"
    block: |
      Match {{ item.header }}
              {{ item.config_lines }}      
    backup: yes
    validate: "/usr/sbin/sshd -T -f %s"
  with_items:
    # Configuration spécifique à l'utilisateur maverik
    - { name: "maverik", header: "User maverik", config_lines: "PasswordAuthentication no\n\tPubkeyAuthentication no\n\tAuthenticationMethods keyboard-interactive:pam"}
  notify:
    # On relance le service ssh (sshd)
    - Handler_restart_ssh

Configuration des permissions

L’utilisateur maverik a accès uniquement à 3 commandes en tant que root. Afin qu’il puisse exécuter ces commandes convenablement, il faut l’ajouter aux fichiers des sudoers (ici /etc/sudoers), en précisant à quelles commandes il a accès:

maverik  ALL=NOPASSWD: /sbin/reboot, /usr/bin/apt update, /usr/bin/apt full-upgrade

Pour cela, on a utilisé le module ansible lineinfile qui permet d’ajouter une ligne à la fin d’un fichier si elle n’est pas déjà présente.

Voici le code complet détaillé dans cette partie:

- name: Ajout de permissions sudo
  lineinfile:
    path: /etc/sudoers
    line: "{{ item.line }}"
    backup: yes
    state: present
  with_items:
    # Limiter l'utilisation du sudo pour l'utilisateur maverik à 3 commandes
    - { line: 'maverik  ALL=NOPASSWD: /sbin/reboot, /usr/bin/apt update, /usr/bin/apt full-upgrade' }
    # Permettre à l'utilisateur charlie de sudo n'importe quelle commande.
    - { line: 'charlie ALL=(ALL:ALL) ALL' }

Démonstration de fonctionnement

Lancer la commande:

$ ssh -v maverik@<IP>

La première demande que formule le serveur ssh est l’authentification via google authenticator (ligne 2) dont le code est demandé à la dernière ligne. Il faut saisir le code google authenticator précédemment généré et récupéré via le code QR:

here

L’authentification s’est déroulée avec succès (ligne 2 et ligne 3):

here

Voici la démonstration de la commande:

$ sudo apt update

here

Voici la démonstration de la commande:

$ sudo apt full-upgrade

here