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:
-
Installer via apt "liboath0 et libpam-oath oathtool"
-
export HEX_SECRET=$(head -15 /dev/urandom | sha1sum | cut -b 1-30)
-
oathtool --verbose --totp $HEX_SECRET --digits=8
-
Sécuriser "users-oath": "users.oath":
touch /etc/users.oath chmod 0600 /etc/users.oath
-
Modifier /etc/users.oath:
/*Option User Prefix Seed*/ HOTP/T30/6 myuser - 12345668048373737372828
-
Supprimer la variable "HEX_SECRET":
unset HEX_SECRET
-
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
-
Modifier /etc/ssh/sshd_config:
UsePAM yes AuthenticationMethods publickey,keyboard-interactive PasswordAuthentication no ChallengeResponseAuthentication yes
-
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).