SELinux resetuje hasło roota


12

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, passwda potem pobiegłem synci 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.


1
Jesteś pewien, że to nie działa? Spróbuj ponownie. Prawdopodobnie będzie działać dobrze. Podejrzewam, że po prostu miałeś niewłaściwe konteksty plików w niektórych plikach, co spowodowało niepowodzenie logowania. Tak więc autorelabel był tym, co naprawdę naprawiło problem.
— Michael Hampton

@MichaelHampton Właśnie odtworzyłem wszystkie moje kroki, robiąc to ponownie, i nie mogłem się ponownie zalogować przy aktywnym SELinux. Po wyłączeniu mogłem zalogować się bez problemu. Popraw mnie, jeśli się mylę, ale zmiana hasła nie powinna zmieniać kontekstów plików, prawda?
— Jorge Heleno

1
Nie, nie powinno. Wydaje się, że odkryłeś coś dziwnego i nieoczekiwanego.
— Michael Hampton

Odpowiedzi:


17

Udało mi się zduplikować ten problem w świeżo zainstalowanym systemie CentOS 7.5.

Oto co się dzieje:

Podczas uruchamiania init=/bin/bashwystępują dwa problemy, które mogą wystąpić:

  • Główny system plików może być montowany tylko do odczytu. W takim przypadku passwdreklamuje 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 passwdz 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/shadowpliku. Ten plik zwykle ma typ SELinux shadow_t. Jednak zmiana pliku, gdy nie są załadowane żadne zasady SELinux, powoduje usunięcie typu SELinux z pliku, pozostawiając go jako unlabeled_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:

  1. Dodaj init=/bin/bashna końcu wiersza poleceń jądra w grub, tak jak poprzednio.
  2. Po znaku zachęty załaduj politykę SELinux za pomocą /usr/sbin/load_policy -i.
  3. Zamontuj główny system plików w trybie do odczytu i zapisu mount -o remount,rw /.
  4. Teraz zmień hasło, a się powiedzie. passwd root
  5. Zamontuj system plików tylko do odczytu, aby zatwierdzić zmiany i mieć czysty system plików przy następnym uruchomieniu mount -o remount,ro /.
  6. Wyjdź z powłoki lub zrestartuj system za pomocą 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).


Problem dotyczył zasad, które nie zostały załadowane. Dlaczego się nie ładują? SELinux powinien działać na poziomie jądra, więc system init nie powinien być wymagany.
— Jorge Heleno

4
@JorgeHeleno SELinux jest rzeczywiście domyślnie włączony lub wyłączony podczas uruchamiania jądra, ale to użytkownik jest odpowiedzialny za decyzję, które polityki są ładowane. Jądro nie mogło o tym zadecydować, ponieważ niektóre instalacje mogą wymagać różnych zasad (np. Ukierunkowane, ścisłe, mls). Dzieje się tak na początku procesu rozruchu, ale można go obejść podczas uruchamiania init=/bin/bash.
— Michael Hampton

1
jeśli polityka nie jest załadowana, dlaczego passwd„wydaje się, że się powiodło”?
— Andrew Savinykh,

a jeśli się nie udało, dlaczego logowanie przy użyciu starego hasła nadal nie powiodło się?
— Wyścigi lekkości na orbicie

2
@Jorge Helen: Twoje wyjaśnienie jest prawie kompletne. Chodzi o pliki zmienione passwdmianowicie /etc/passwdi /etc/shadow. Jeśli działa passwdbez 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 powodu wrong passwordbłędu. Zmuszenie selinux do odtwarzania tekstowych plików tekstowych poprzez dotknięcie /.autorelabelmoże również rozwiązać ten problem przy zmianie haseł bez załadowanej polityki.
— hargut
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.