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 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 couru passwd
et ensuite couru sync
et 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é le 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 actif, il était maintenant 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.
Réponses:
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'unAuthentication 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
, le mot de passe sera modifié avec succès, 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 SELinuxshadow_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 ainsiunlabeled_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é.
Une explication plus longue de cette procédure est disponible auprès de Red Hat (abonnement requis).
la source
init=/bin/bash
.passwd
"semble réussir"?passwd
savoir/etc/passwd
et/etc/shadow
. S'il s'exécutepasswd
sans stratégie chargée, il ne s'exécute pas dans le contexte selinux approprié et les fichiers modifiés se retrouvent avec un contexte selinux différent. Lors du démarrage avec selinux activé et les stratégies actives, la vérification du mot de passe échoue en raison d'un contexte de fichier inapproprié et non en raison d'unewrong password
erreur. Forcer selinux à utiliser des contextes de fichiers fiables en touchant/.autorelabel
peut également résoudre ce problème lors du changement de mots de passe sans politique chargée.