Zabezpieczenie konta root przy pomocy pam-usb

Spis treści

Jakiś czas temu natknąłem się na moduł pam-usb , który to w dość ciekawy sposób zabezpiecza dostęp do konta użytkownika root. Cały mechanizm opiera się o pendrive, którego to unikalne cechy są brane pod uwagę przy uwierzytelnianiu podczas logowania się na konto super użytkownika, czyli min. gdy wydajemy polecenie su albo sudo . Jest to o tyle ciekawa rzecz, że konto użytkownika root możne stać się niewrażliwe na próby złamania hasła w przypadku połączenia sieciowego. Jak by nie patrzeć, atakujący, który łączy się zdalnie, nie jest w stanie podłączyć do naszego komputera żadnego fizycznego urządzenia, w wyniku czego nigdy nie uzyska dostępu do konta administratora.

Pakiet libpam-usb wyleciał z debiana jakiś czas temu. Powodem były zależności, które wskazywały na przestarzały już pakiet udisks . Poza tym, nikt nie zajmował się tym pakietem. Obecnie jest on dostępny jedynie w starszych wydaniach debiana.

Aktywowanie modułu pam-usb

Moduł pam-usb daje nam dwie możliwości, z których pierwsza zakłada wykorzystanie pendrive'a jako dodatkowego zabezpieczenia, czyli potrzebne będzie hasło do konta root oraz wymagana będzie obecność pendrive'a w porcie usb. Drugą opcją jest zrezygnowanie z hasła na rzecz obecności pendrive'a w porcie usb komputera. Ten drugi sposób może ułatwić trochę życie ale trzeba wziąć pod uwagę, że w przypadku braku pendirve'a, zalogowanie na konto root będzie możliwe po podaniu hasła, czyli tak jak w przypadku standardowego logowania się na konto administratora systemu.

By aktywować to zabezpieczenie, musimy mieć w systemie te dwa pakiety libpam-usb oraz pamusb-tool . Po ich instalacji, odpalamy pam-auth-update i zaznaczamy pozycję USB authentication :

┌──────────────────┤ PAM configuration ├───────────────────┐
│ PAM profiles to enable:                                  │
│                                                          │
│    [*] USB authentication                                │
│    [ ] encfs encrypted home directories                  │
│    [*] Unix authentication                               │
│    [ ] Mount volumes for user                            │
│    [*] GNOME Keyring Daemon - Login keyring management   │
│    [*] ConsoleKit Session Management                     │
│    [*] Inheritable Capabilities Management               │
│              <Ok>                  <Cancel>              │
│                                                          │
└──────────────────────────────────────────────────────────┘

Konfiguracja modułu pam-usb

Moduł pam-usb konfigurujemy przy pomocy narzędzia pamusb-conf . Wkładamy zatem pendrive do portu usb i wydajemy poniższe polecenie:

# pamusb-conf --add-device=pendrak
Please select the device you wish to add.
* Using "Kingston DT 101 G2 (001CB0EC34A2BC318709104B)" (only option)

Which volume would you like to use for storing data ?
0) /dev/sdb5 (UUID: 9365d879-1715-4346-8fc0-7674684765e7)
1) /dev/sdb6 (UUID: <UNDEFINED>)
2) /dev/sdb4 (UUID: <UNDEFINED>)
3) /dev/sdb1 (UUID: 6bf4d915-2b62-444e-a2c8-16307769b5c2)
4) /dev/sdb2 (UUID: 90ec6f73-8fdb-4c8d-aebd-cadd0f51b412)
5) /dev/sdb3 (UUID: 0dd5e51c-c133-492a-a6ca-d14e0c7d1e39)

[0-5]: 5

Name            : pendrak
Vendor          : Kingston
Model           : DT 101 G2
Serial          : 001CB0EC34A2BC318709104B
UUID            : 0dd5e51c-c133-492a-a6ca-d14e0c7d1e39

Save to /etc/pamusb.conf ?
[Y/n] y
Done.

Można oczywiście ręcznie edytować plik /etc/pamusb.conf ale lepiej jest korzystać z przeznaczonych do tego celu narzędzi, bo uchroni nas to przez popełnieniem literówek i innych drobnych błędów.

Definiujemy teraz użytkownika, który będzie podlegał pod moduł pam-usb . W tym przypadku jest to root :

# pamusb-conf --add-user=root
Which device would you like to use for authentication ?
0) bohun
1) pendrak

[0-1]: 1

User            : root
Device          : pendrak

Save to /etc/pamusb.conf ?
[Y/n] y
Done.

Plik konfiguracyjny powinien zostać uzupełniony o odpowiednie wpisy, zawsze można go podejrzeć i sprawdzić czy aby wszystko jest tak jak być powinno.

Próba logowania na konto root

Jeśli w tej chwili spróbowalibyśmy się zalogować na konto użytkownika root, powinniśmy zobaczyć poniższy log:

$ su
* pam_usb v0.5.0
* Authentication request for user "root" (su)
* Device "pendrak" is connected (good).
* Performing one time pad verification...
* Regenerating new pads...
* Access granted.
root:~#

Jak widzimy wyżej, dostęp został przyznany bez proszenia o hasło, bo pendrive jest podpięty. Jeśli odłączymy pendrive i ponownie spróbujemy się zalogować, powinniśmy zostać poproszeni o hasło:

morfik:~$ su
* pam_usb v0.5.0
* Authentication request for user "root" (su)
* Device "pendrak" is not connected.
* Access denied.
Password:
root:~#

Dwuskładnikowe uwierzytelnianie

Jeśli chcemy z modułu pam-usb uczynić dodatkowe zabezpieczenie działające na zasadzie dwuskładnikowego uwierzytelniania, musimy wyedytować plik /etc/pam.d/common-auth i zmienić w nim linijkę z:

auth   sufficient      pam_usb.so

na:

auth   required        pam_usb.so

Po zapisaniu zmian, nie da rady zalogować się już na konto root bez uprzedniego podpięcia pendrive'a do portu usb i to nawet po poprawnym podaniu hasła:

morfik:~$ su
* pam_usb v0.5.0
* Authentication request for user "root" (su)
* Device "pendrak" is not connected.
* Access denied.
Password:
su: Authentication failure

Opcja dwuskładnikowego uwierzytelniania skutecznie może nas ochronić przed wszystkimi atakami zdalnymi zakładającymi wykorzystanie hasła podczas uzyskiwania dostępu do konta root. Trzeba jednak uważać na jedną rzecz. Jednym z parametrów pendrive branym pod uwagę w procesie uwierzytelniania jest UUID wskazanej partycji. Jeśli ten numerek ulegnie zmianie, np. wskutek tworzenia nowego systemu plików, stracimy dostęp do konta root i trzeba będzie ratować się systemem live.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.