web-dev-qa-db-fra.com

SELinux réinitialiser le mot de passe root

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.

12
Jorge Heleno

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:

  1. Ajouter init=/bin/bash à la fin de la ligne de commande du noyau dans grub, comme vous l'avez fait précédemment.
  2. À l'invite bash, chargez la politique SELinux avec /usr/sbin/load_policy -i.
  3. Montez le système de fichiers racine en lecture-écriture avec mount -o remount,rw /.
  4. Modifiez maintenant le mot de passe et cela réussira. passwd root
  5. Remontez le système de fichiers en lecture seule pour valider les modifications et avoir un système de fichiers propre au prochain démarrage avec mount -o remount,ro /.
  6. Quittez le shell ou redémarrez le système avec 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).

17
Michael Hampton