Oświadczenie: To pytanie nie ma na celu rozwiązania problemu zmiany hasła roota, gdy SELinux jest aktywny, ponieważ istnieje wiele przewodników, aby to rozwiązać. Jest to bardziej sposób, w jaki SELinux robi to wewnętrznie.
Jestem niedawnym użytkownikiem SELinuksa, ale ostatnio miałem z nim więcej kontaktu. Był moment, kiedy ktoś zapytał mnie, jak mogę zresetować hasło roota w przypadku jego zapomnienia.
Uruchomiłem więc CentOS, zredagowałem wpis gruba do czegoś takiego
linux16 <kernel_location> root=/dev/mapper/centos-root rw init=/bin/bash
Pobiegłem, passwd
a potem pobiegłem sync
i wymusiłem ponowne uruchomienie. Po ponownym uruchomieniu logowanie przy użyciu nowego hasła zostało odrzucone, a także przy użyciu starego, oczywiście.
Zrestartowano ponownie i przekazano jądro parametr do wyłączenia SELinux ( selinux=0
). Próbowałem zalogować się przy użyciu nowego hasła i zadziałało. Następnie wymusiłem automatyczne ponowne etykietowanie fs (przez plik .autorelabel
), a przy aktywnym SELinux można było się zalogować.
Moje pytanie brzmi: dlaczego tak się dzieje? Dlaczego ponowne etykietowanie wpływa na logowanie, gdy nastąpiła jedynie zmiana hasła, a nie użytkowników lub obiektów?
Dziękuję za uwagę.
TL; DR: Zwykłe resetowanie hasła roota nie działa w SELinux. Dlaczego?
Edycja: Zostało to przetestowane na maszynie wirtualnej z systemem CentOS7 z KVM jako hypervisor.
Odpowiedzi:
Udało mi się zduplikować ten problem w świeżo zainstalowanym systemie CentOS 7.5.
Oto co się dzieje:
Podczas uruchamiania
init=/bin/bash
występują dwa problemy, które mogą wystąpić:Główny system plików może być montowany tylko do odczytu. W takim przypadku
passwd
reklamuje sięAuthentication token manipulation error
.Jest to dość oczywiste: jeśli system plików nie jest zamontowany do odczytu i zapisu, nie można do niego pisać.
Polityka SELinux może nie zostać załadowana. W takim przypadku
passwd
z powodzeniem zmienisz hasło, ale będziesz miał problem opisany w pierwotnym pytaniu powyżej: nikt nie będzie mógł się zalogować.Skróty hasła są przechowywane w
/etc/shadow
pliku. Ten plik zwykle ma typ SELinuxshadow_t
. Jednak zmiana pliku, gdy nie są załadowane żadne zasady SELinux, powoduje usunięcie typu SELinux z pliku, pozostawiając go jakounlabeled_t
. Dlatego usługi, które próbują odczytać plik w celu uwierzytelnienia logowania, nie są już w stanie go odczytać.Aby zmienić hasło roota w RHEL / CentOS 7, musisz wykonać ten proces:
init=/bin/bash
na końcu wiersza poleceń jądra w grub, tak jak poprzednio./usr/sbin/load_policy -i
.mount -o remount,rw /
.passwd root
mount -o remount,ro /
.exec /sbin/init 6
.Teraz możesz zalogować się przy użyciu zmienionego hasła roota.
Dłuższe wyjaśnienie tej procedury jest dostępny z Red Hat (wymagana subskrypcja).
źródło
init=/bin/bash
.passwd
„wydaje się, że się powiodło”?passwd
mianowicie/etc/passwd
i/etc/shadow
. Jeśli działapasswd
bez załadowanej polityki, nie działa we właściwym kontekście selinux, a zmienione pliki mają inny kontekst selinux. Podczas uruchamiania z włączonym selinux i aktywnymi zasadami sprawdzanie hasła kończy się niepowodzeniem z powodu niewłaściwego kontekstu pliku, a nie z powoduwrong password
błędu. Zmuszenie selinux do odtwarzania tekstowych plików tekstowych poprzez dotknięcie/.autorelabel
może również rozwiązać ten problem przy zmianie haseł bez załadowanej polityki.