1 votes

Authentification à deux facteurs SSH en utilisant oathtool : comment définir une liste blanche d'IP (règles d'accès) ?

Sur mon propre serveur VPS Debian 9, j'ai activé "l'authentification à deux facteurs SSH en utilisant oathtool" et PUBLICKEY (mot de passe désactivé) en suivant la procédure suivante:

  1. Installer via apt "liboath0 et libpam-oath oathtool"

  2. export HEX_SECRET=$(head -15 /dev/urandom | sha1sum | cut -b 1-30)

  3. oathtool --verbose --totp $HEX_SECRET --digits=8

  4. Sécuriser "users-oath": "users.oath":

    touch /etc/users.oath
    chmod 0600 /etc/users.oath
  5. Modifier /etc/users.oath:

    /*Option User Prefix Seed*/
    HOTP/T30/6      myuser    -       12345668048373737372828
  6. Supprimer la variable "HEX_SECRET":

    unset HEX_SECRET
  7. Configurer les règles d'accès, en éditant /etc/security/login_token.conf

    # Ne requiert pas l'authentification à deux facteurs à partir de cet emplacement :
    + : dennis : 1.1.1.0/24
    + : myuser : 1.123.123.44/32
    
    # Pas besoin d'authentification à deux facteurs du tout
    + : lolnope : ALL
    
    # Exiger l'authentification à deux facteurs de partout sauf des exceptions ci-dessus
    - : ALL : ALL
  8. Modifier /etc/ssh/sshd_config:

    UsePAM yes
    AuthenticationMethods publickey,keyboard-interactive
    PasswordAuthentication no
    ChallengeResponseAuthentication yes
  9. Recharger sshd. (Fin de la procédure)

Maintenant, je veux exclure de l'authentification à deux facteurs un utilisateur spécifique à partir d'une adresse IP spécifique, j'ai donc modifié "/etc/security/login_token.conf" et ajouté:

+ : myuser : 1.123.123.44/32

Et j'ai rechargé SSH.

Voici "/etc/pam.d/sshd" :

# Configuration PAM pour le service de shell sécurisé

# Authentification Un*x standard.
# @include common-auth

# Exceptions de l'authentification à deux facteurs
auth    [success=1 default=ignore]      pam_access.so accessfile=/etc/security/login_token.conf

# Authentification à deux facteurs
auth requisite pam_oath.so usersfile=/etc/users.oath

# Exceptions de l'authentification à deux facteurs et de la méthode de clé publique
auth required pam_sepermit.so

# Interdire les connexions non root lorsque /etc/nologin existe.
account    required     pam_nologin.so

# Décommentez et éditez /etc/security/access.conf si vous devez définir des limites d'accès complexes qui sont difficiles à exprimer dans sshd_config.
# account  required     pam_access.so

# Autorisation Un*x standard.
@include common-account

# SELinux doit être la première règle de session. Cela garantit que tout
# contexte dormant a été effacé. Sans cela, un
# module pourrait exécuter du code dans le mauvais domaine.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so close

# Définir l'attribut du processus loginuid.
session    required     pam_loginuid.so

# Créer un nouveau trousseau de session.
session    optional     pam_keyinit.so force revoke

# Configuration standard de session Un*x et libération.
@include common-session

# Afficher le message du jour lors de la connexion réussie.
# Cela inclut une partie générée de manière dynamique à partir de /run/motd.dynamic
# et une partie statique (modifiable par l'administrateur) de /etc/motd.
session    optional     pam_motd.so  motd=/run/motd.dynamic
session    optional     pam_motd.so noupdate

# Afficher l'état de la boîte aux lettres de l'utilisateur après la connexion réussie.
session    optional     pam_mail.so standard noenv # [1]

# Définir des limites utilisateur à partir de /etc/security/limits.conf.
session    required     pam_limits.so

# Lire les variables d'environnement à partir de /etc/environment et
# /etc/security/pam_env.conf.
session    required     pam_env.so # [1]
# Dans Debian 4.0 (etch), les variables d'environnement liées à la localisation ont été déplacées vers
# /etc/default/locale, donc lisez aussi cela.
session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale

# SELinux doit intervenir au moment de la connexion pour garantir que le processus démarre
# dans le contexte de sécurité par défaut approprié. Seules les sessions censées
# s'exécuter dans le contexte de l'utilisateur doivent être exécutées après cela.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

# Mise à jour du mot de passe standard Un*x.
@include common-password

Résultat : cet utilisateur ne peut pas se connecter au serveur SSH de destination en utilisant "myuser" depuis "myip", voici le journal d'erreurs local :

ssh -v myuser@server2.mydomain -p 12345
OpenSSH_7.4p1 Debian-10+deb9u6, OpenSSL 1.0.2u  20 Dec 2019
debug1: Lecture des données de configuration /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config ligne 19: Application des options pour *
debug1: Connexion à server2.mydomain [78.6.82.99] port 12345.
debug1: Connexion établie.
debug1: fichier d'identité /home/myuser/.ssh/id_rsa de type 1
debug1: key_load_public: Aucun fichier ou dossier de ce type
debug1: fichier d'identité /home/myuser/.ssh/id_rsa-cert de type -1
debug1: key_load_public: Aucun fichier ou dossier de ce type
debug1: fichier d'identité /home/myuser/.ssh/id_dsa de type -1
debug1: key_load_public: Aucun fichier ou dossier de ce type
debug1: fichier d'identité /home/myuser/.ssh/id_dsa-cert de type -1
debug1: key_load_public: Aucun fichier ou dossier de ce type
debug1: fichier d'identité /home/myuser/.ssh/id_ecdsa de type -1
debug1: key_load_public: Aucun fichier ou dossier de ce type
debug1: fichier d'identité /home/myuser/.ssh/id_ecdsa-cert de type -1
debug1: key_load_public: Aucun fichier ou dossier de ce type
debug1: fichier d'identité /home/myuser/.ssh/id_ed25519 de type -1
debug1: key_load_public: Aucun fichier ou dossier de ce type
debug1: fichier d'identité /home/myuser/.ssh/id_ed25519-cert de type -1
debug1: Activation du mode de compatibilité pour le protocole 2.0
debug1: Chaîne de version locale SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u6
debug1: Version du protocole distant 2.0, version du logiciel distant OpenSSH_8.2p1 Ubuntu-4ubuntu0.1
debug1: match: OpenSSH_8.2p1 Ubuntu-4ubuntu0.1 pat OpenSSH* compat 0x04000000
debug1: Authentification sur server2.mydomain:12345 en tant que 'myuser'
debug1: SSH2_MSG_KEXINIT envoyé
debug1: SSH2_MSG_KEXINIT reçu
debug1: kex: algorithme: curve25519-sha256
debug1: kex: algorithme de clé hôte: ecdsa-sha2-nistp256
debug1: kex: chiffrement serveur->client : chacha20-poly1305@openssh.com MAC:  compression: aucune
debug1: kex: chiffrement client->serveur : chacha20-poly1305@openssh.com MAC:  compression: aucune
debug1: en attente de SSH2_MSG_KEX_ECDH_REPLY
debug1: Clé hôte du serveur : ecdsa-sha2-nistp256 SHA256:hgw8r3487y9ty2c405utv04uy0356uv0c08t4
debug1: Hôte '[server2.mydomain]:12345' est connu et correspond à la clé hôte ECDSA.
debug1: Clé trouvée dans /home/myuser/.ssh/known_hosts:1
debug1: rekey après 134217728 blocs
debug1: SSH2_MSG_NEWKEYS envoyé
debug1: en attente de SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS reçu
debug1: rekey après 134217728 blocs
debug1: SSH2_MSG_EXT_INFO reçu
debug1: kex_input_ext_info: server-sig-algs=
debug1: SSH2_MSG_SERVICE_ACCEPT reçu
debug1: Authentifications pouvant continuer : publickey
debug1: Méthode d'authentification suivante : publickey
debug1: Offrir la clé publique RSA : /home/myuser/.ssh/id_rsa
debug1: Serveur accepte la clé : pkalg rsa-sha2-512 blen 279
Authentifié avec un succès partiel.
debug1: Authentifications pouvant continuer : keyboard-interactive
debug1: Méthode d'authentification suivante : keyboard-interactive
debug1: Authentifications pouvant continuer : keyboard-interactive
debug1: Aucune autre méthode d'authentification à essayer.
Accès refusé (keyboard-interactive).

0voto

Davide Marchi Points 11

Problème trouvé.

En relisant la syntaxe du fichier Linux PAM, j'ai réalisé que la valeur "1":

[success=1 default=ignore]

sur "/etc/pam.d/sshd" semble être incorrecte, et la syntaxe correcte doit plutôt être "done":

[success=done default=ignore]

Maintenant il est possible d'ajouter le couple utilisateur/IP à "/etc/security/login_token.conf" pour exclure des utilisateurs spécifiques des adresses IP spécifiques de la 2FA

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X