Mot de passe expiré et connexion basée sur la clé SSH avec UsePAM oui


12

Il y a une machine SLES 11. Les utilisateurs se connectent via SSH et pubkey (mixte, certains utilisateurs utilisent un mot de passe, certains utilisent la clé ssh)

Le sshd_config a:

UsePAM yes
PasswordAuthentication yes
PubkeyAuthentication yes

Le problème: si le mot de passe expire pour un utilisateur qui utilise la connexion pubkey, l'utilisateur sera invité à modifier le mot de passe.

La question: Comment pouvons-nous définir la configuration PAM ou sshd pour permettre aux utilisateurs de se connecter s'ils ont une clé SSH valide et que leur mot de passe a expiré? - Sans faire apparaître "changer votre mot de passe".

MISE À JOUR # 1: La solution ne peut pas être: "UsePAM no"

SERVER:~ # cat /etc/pam.d/sshd 
#%PAM-1.0
auth        requisite   pam_nologin.so
auth        include     common-auth
account     requisite   pam_nologin.so
account     include     common-account
password    include     common-password
session     required    pam_loginuid.so
session     include     common-session
SERVER:~ # 

MISE À JOUR # 2: La solution ne peut pas être: définissez le mot de passe des utilisateurs pour qu'il n'expire jamais

MISE À JOUR # 3:

SERVER:/etc/pam.d # cat common-account
#%PAM-1.0
...
account required    pam_unix2.so    
account required    pam_tally.so
SERVER:/etc/pam.d # 

Vous pourriez être en mesure d'accomplir cela en supprimant pam_unix.sode la sessionsection de /etc/pam.d/sshd(et en le remplaçant pam_lastlog.sos'il n'est pas là. Je ne sais pas si pam_unix.so/sessionc'est celui qui fait cela ou non, mais cela semble être le bon endroit.
Patrick

1
définissez le compte utilisateur pour qu'il ne soit jamais expiré :)
Raza

@Raza: Merci :) excellente idée, mais ne peut pas être une solution :(
thequestionthequestion

essayez ForcedPasswdChange Noceci est pour SSH1
Raza

1
J'ai réalisé que ForcedPasswdChange Nocela ne fonctionnera pas après l'expiration. vous cherchez une solution qui permettra à l'utilisateur expiré de se connecter
Raza

Réponses:


10

L'ordre des opérations qui provoque l'invite de mot de passe expiré est le suivant:

  • SSH exécute l' accountétape PAM , qui vérifie que le compte existe et est valide. L' accountétape remarque que le mot de passe a expiré et informe SSH.
  • SSH effectue une authentification basée sur les clés. Il n'a pas besoin de PAM pour cela, donc il ne dirige pas la authscène. Il configure ensuite la session de connexion SSH et exécute l' sessionétape PAM .
  • Ensuite, SSH se souvient que PAM lui a dit que le mot de passe avait expiré, imprime un message d'avertissement et demande à PAM de demander à l'utilisateur de changer le mot de passe. SSH se déconnecte ensuite.

Tout cela est fait par SSH, et je ne vois aucune option SSH pour configurer ce comportement. Donc, sauf si vous souhaitez créer une version personnalisée de SSH et / ou PAM, la seule option que je vois est d'empêcher PAM de signaler le mot de passe expiré à SSH. Si vous faites cela, cela désactivera entièrement les vérifications de mot de passe expirés via SSH , même si l'utilisateur se connecte via SSH avec un mot de passe. D'autres méthodes de connexion (non SSH) vérifieront toujours l'expiration du mot de passe.

Votre pam.d/sshdfichier actuel a une account include common-accountentrée. Je suppose qu'il y a un common-accountfichier qui contient une référence à pam_unix.so. Il s'agit de la ligne qui recherche un mot de passe expiré.

Vous ne voulez probablement pas toucher le common-accountfichier lui-même, car il est utilisé pour d'autres méthodes de connexion. Au lieu de cela, vous souhaitez supprimer le includede votre pam.d/sshdfichier. S'il y a d'autres fonctions en common-accountplus pam_unix.so, vous voudrez probablement les mettre directement dans pam.d/sshd.

Enfin, rappelez-vous qu'il s'agit d'une modification de la sécurité de votre système et que vous ne devriez pas simplement me faire aveuglément confiance pour vous donner de bons conseils. Lisez comment PAM fonctionne si vous ne le connaissez pas. Certains endroits de départ pourraient être man 7 PAM, man 5 pam.confet man 8 pam_unix.


Belle explication de l'ordre des opérations, merci.
M_dk

3

Une option a été ajoutée à pam_unix.so (vers février-2016) appelée no_pass_expiry ( changement de code source ici ou page de manuel ici ). Fondamentalement, il indique à pam_unix d'ignorer un mot de passe expiré si autre chose que pam_unix a été utilisé pour l'auth, par exemple si sshd a effectué l'auth.

Par conséquent, si vous avez une version de pam_unix.so qui contient cette option, vous devriez pouvoir configurer PAM pour:

  1. Toujours avertir mais ne nécessite pas de modification d'un mot de passe expiré si une clé SSH a été utilisée pour s'authentifier via ssh
  2. Exiger un changement de mot de passe d'un mot de passe expiré si un login / mot de passe via pam_unix.so a été utilisé pour s'authentifier via ssh
  3. N'impacte aucune autre séquence d'authentification (par exemple via le service de connexion).

Par exemple, j'ai configuré un serveur RHEL 7 pour faire ce qui précède en mettant simplement à jour /etc/pam.d/sshd et en ajoutant pam_unix.so no_pass_expiry aux types de compte et de mot de passe, par exemple

account    required    pam_nologin.so
account    sufficient  pam_unix.so no_pass_expiry
account    include     password-auth
password   sufficient  pam_unix.so no_pass_expiry
password   include     password-auth

1
Je viens d'essayer cela et cela fonctionne. Vous pouvez vérifier si votre PAM prend en charge cette option ou non en recherchant "no_pass_expiry" existe ou non dans la page de manuel "man 8 pam_unix".
Tomofumi

Le changement de code de 2016 n'est toujours pas présent dans Ubuntu 18.04 ... :(
ColinM

0
  • Vous ne souhaiterez peut-être pas modifier votre PAM ou sshd_config pour des raisons de conformité.
  • Vous utilisez peut-être PasswordAuthentication no dans sshd_config
  • Vous pourriez avoir des mots de passe aléatoires.
  • Vous pourriez même avoir mis en œuvre la conformité CIS.
  • Vos utilisateurs reçoivent toujours l'invite

Ensuite, root peut modifier la date de modification du mot de passe:

for user in `grep ":x:[0-9]\{4\}" /etc/passwd|cut -d: -f1`; do chage -d today $user; done
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.