Avertissement: Cette question n'est pas de résoudre le problème du changement de mot de passe root lorsque SELinux est actif car il existe déjà de nombreux guides pour le résoudre. C'est davantage la façon dont SELinux le fait en interne.
Je suis un utilisateur récent de SELinux, mais dernièrement, j'ai été plus en contact avec lui. Il y a eu un moment où quelqu'un m'a demandé comment je pouvais réinitialiser le mot de passe root en cas d'oubli.
J'ai donc démarré mon CentOS, modifié l'entrée grub vers quelque chose comme
linux16 <kernel_location> root=/dev/mapper/centos-root rw init=/bin/bash
J'ai exécuté passwd
, puis j'ai exécuté sync
et j'ai forcé le redémarrage. Après le redémarrage, la connexion avec le nouveau mot de passe a été rejetée ainsi qu'avec l'ancien bien sûr.
Redémarré à nouveau et passé au noyau le paramètre pour désactiver SELinux (selinux=0
). J'ai essayé de me connecter avec le nouveau mot de passe et cela a fonctionné. Ensuite, j'ai forcé un ré-étiquetage automatique fs (via le fichier .autorelabel
) et avec SELinux activé, il était désormais possible de se connecter.
Ma question est: pourquoi cela arrive-t-il? Pourquoi le réétiquetage affecte-t-il la connexion lorsqu'il y a simplement eu un changement de mot de passe et non d'utilisateurs ou d'objets?
Merci pour votre attention.
TL; DR: la réinitialisation habituelle du mot de passe root ne fonctionne pas dans SELinux. Pourquoi?
Edit: Cela a été testé sur une machine virtuelle exécutant CentOS7 avec KVM comme hyperviseur.
J'ai pu dupliquer ce problème dans un système CentOS 7.5 fraîchement installé.
Voici ce qui se passe:
Lorsque vous démarrez avec init=/bin/bash
vous pouvez rencontrer deux problèmes:
Le système de fichiers racine peut être monté en lecture seule. Dans ce cas, passwd
se plaindra d'un Authentication token manipulation error
.
C'est assez évident: si le système de fichiers n'est pas monté en lecture-écriture, il n'est pas possible d'y écrire.
La politique SELinux peut ne pas être chargée. Dans ce cas, passwd
changera avec succès le mot de passe, mais vous aurez le problème décrit dans la question d'origine ci-dessus: personne ne pourra se connecter.
Les hachages de mot de passe sont stockés dans le /etc/shadow
fichier. Ce fichier a normalement le type SELinux shadow_t
. Cependant, la modification du fichier alors qu'aucune stratégie SELinux n'est chargée entraîne la suppression du type SELinux du fichier, le laissant comme unlabeled_t
. Ainsi, les services qui tentent de lire le fichier pour authentifier les connexions ne peuvent plus le lire.
Pour changer le mot de passe root sur RHEL/CentOS 7, vous devez donc suivre ce processus:
init=/bin/bash
à la fin de la ligne de commande du noyau dans grub, comme vous l'avez fait précédemment./usr/sbin/load_policy -i
.mount -o remount,rw /
.passwd root
mount -o remount,ro /
.exec /sbin/init 6
.Vous pouvez maintenant vous connecter avec le mot de passe root modifié.
Un explication plus détaillée de cette procédure est disponible auprès de Red Hat (abonnement requis).