Ustaw hasło sudo inaczej niż hasło logowania

30

Jako uprzywilejowany użytkownik próbuję ustawić sudohasło na inne niż hasło używane podczas logowania.

Przeprowadziłem badania, ale nie znalazłem odpowiedzi. Czy sudoobsługuje tego rodzaju konfigurację?

Jeśli kiedykolwiek zgubisz hasło, stracisz wszystko. Ktoś może się zalogować i awansować przy rootużyciu tego samego hasła.

sudoma opcję zapytania o roothasło zamiast wywołania hasła użytkownika ( rootpw), ale udostępnianie roothasła zdecydowanie nie jest opcją, dlatego skonfigurowaliśmy sudo.

Robiłem to config 2FAw przeszłości, działało świetnie, ale także pokonywało cel automatyzacji. Na przykład jeśli chcesz wykonać uprzywilejowane polecenie na kilkunastu serwerach za pomocą expectskryptu, dodanie 2FAnie pozwala na to.

Najbliższym rozwiązaniem, jakie znalazłem, jest zezwolenie tylko na klucz prywatny SSH i ustawienie hasła z kluczem, który różni się od sudohasła (logowania). Mimo to nie jest wygodne, ponieważ w sytuacji awaryjnej nie można zalogować się na komputerze, na którym nie ma tego klucza.

Shâu Shắc
źródło
1
Dlaczego potrzebujesz tego dokładnie? Może problem tkwi gdzieś indziej. Czy nie byłoby lepiej mieć uwierzytelnianie dwuskładnikowe przy logowaniu się do systemu za pomocą konta uprzywilejowanego, a następnie mieć „NOPASSWD”, aby sudo nie pytało o hasło? Następnie powinieneś mieć oczywiście osobne lokalne konto alarmowe z silnym hasłem, aby móc się zalogować, gdy sieć jest wyłączona (brak dostępu ssh).
jirib

Odpowiedzi:

30

Jeśli chcesz poprosić o hasło roota, w przeciwieństwie do hasła użytkownika, masz do wyboru opcje /etc/sudoers. rootpww szczególności sprawi, że poprosi o hasło roota. Jest runaspwi targetpwrównież; zobacz szczegóły na stronie sudoers (5).

Poza tym sudo wykonuje uwierzytelnianie (podobnie jak wszystko inne) za pośrednictwem PAM. PAM obsługuje konfigurację dla poszczególnych aplikacji. Konfiguracja Sudo jest już uruchomiona (przynajmniej w moim systemie Debian) /etc/pam.d/sudoi wygląda następująco:

$ cat sudo 
#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

Innymi słowy, domyślnie uwierzytelnia się jak wszystko inne w systemie. Możesz zmienić tę @include common-authlinię i poprosić PAM (a tym samym sudo) o użycie alternatywnego źródła hasła. Nieskomentowane wiersze we wspólnym auth wyglądają mniej więcej tak (domyślnie będzie inaczej, jeśli używasz np. LDAP):

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

Możesz użyć np. pam_userdb.soZamiast pam_unix.soi przechowywać alternatywne hasła w bazie danych Berkeley DB.

przykład

Utworzyłem katalog /var/local/sudopass, właściciela / grupę root:shadow, tryb 2750. Wewnątrz utworzyłem plik bazy danych haseł, używając db5.1_load(która jest wersją Berkeley DB używaną w Debian Wheezy):

# umask 0027
# db5.1_load -h / var / local / sudopass -t hash -T passwd.db
Anthony
WMaEFvCFEFplI
^D

Ten skrót został wygenerowany przy mkpasswd -m desużyciu hasła „hasło”. Bardzo bardzo bezpieczny! (Niestety pam_userdb wydaje się nie obsługiwać niczego lepszego niż starożytny crypt(3)skrót).

Teraz edytuj /etc/pam.d/sudoi usuń @include common-authlinię, a zamiast tego umieść to w miejscu:

auth    [success=1 default=ignore]      pam_userdb.so crypt=crypt db=/var/local/sudopass/passwd
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

Pamiętaj, że pam_userdb dodaje .dbrozszerzenie do przekazywanej bazy danych, więc musisz ją .dbwyłączyć.

Według dannysauer w komentarzu może być konieczne wykonanie tej samej edycji /etc/pam.d/sudo-i.

Teraz do sudo muszę użyć passwordprawdziwego hasła logowania:

anthony @ sudotest: ~ $ sudo -K
anthony @ sudotest: ~ $ sudo echo -e '\ nit pracował'
[sudo] hasło do Anthony: passwordRETURN

zadziałało
derobert
źródło
Skonfiguruj również „sudo-i”, które nowsze wersje sudo często używają do „sudo -i” (jeśli dostawca niczego nie zmienił).
dannysauer,
Czy potrafisz opracować szczegóły dotyczące konfiguracji PAM?
Shâu Shắc
@ ShâuShắc Dodałem przykład, w tym zmiany konfiguracji PAM.
derobert
Dzięki. Ale nigdzie nie znajduję db51-utils w Redhat / centos lub źródłach, czy jest on dostępny tylko w wariantach Debiana?
Shâu Shắc
3
„Starożytny crypt(3)skrót” w nowoczesnych wersjach glibc ma wsparcie dla sha-512, np. mkpasswd -m sha-512. pam_userdb.so poradzi sobie z nimi dobrze.
Andrew Domaszek,
6

W przypadku Redhat / Centos wymaganie można spełnić, wykonując następujące czynności:

Utwórz niestandardowego użytkownika i przekaż:

# db_load -t hash -T /usr/local/etc/passwd.db
user
pass
^d

Zmodyfikuj plik sudo pam.d, aby wyglądał następująco:

$ cat /etc/pam.d/sudo

auth            required        pam_userdb.so db=/usr/local/etc/passwd
account         required        pam_userdb.so db=/usr/local/etc/passwd
password        include         system-auth

session         optional        pam_keyinit.so revoke
session         required        pam_limits.so

Nadal szukam sposobu konfiguracji, aby tylko określony użytkownik / grupa musiał zostać uwierzytelniony za pomocą tej niestandardowej metody, inni nadal mogą być uwierzytelniani za pomocą normalnej metody uwierzytelniania systemowego. Czy ktoś może mi dać jakieś porady?

Shâu Shắc
źródło
Powinieneś być w stanie to zrobić z pełną składnią akcji w PAM. np. [user_unknown=ignore,success=ok,default=bad]... ale musisz się z tym pograć (i przeczytać dokumenty PAM), aby wszystko było dobrze
derobert
Można to również osiągnąć za pomocą pam_succeed_ifpominięcia jednego modułu, jeśli użytkownik znajduje się na liście grup, lub pominięcia dwóch modułów, jeśli nie.
dannysauer
Więc coś ogólnie takiego: /// auth [sukces = ignoruj ​​domyślnie = 1] użytkownik pam_succeed_if.so w danny: frank /// auth wystarczający danny_frank_module.so /// auth wystarczający not_danny_frank.so
dannysauer
3

Nie sądzę, że sudo obsługuje taką konfigurację. Celem pytania o hasło sudo jest upewnienie się, że osoba wydająca polecenie sudo jest tą samą osobą, która jest zalogowana, a najłatwiejszym sposobem na to jest poproszenie o zalogowanie się aktualnie zalogowanego użytkownika.

Innymi słowy, celem pytania o hasło sudo nie jest ustanowienie autorytetu , lecz ustalenie tożsamości . Na podstawie ustalonej tożsamości i konfiguracji sudo można podjąć decyzję, czy dany użytkownik ma niezbędne uprawnienia lub prawa dostępu.

CVn
źródło
3
Sudo nie (z wyjątkiem przypadku, gdy chcesz zapytać o hasło roota, konkretnego użytkownika lub hasło użytkownika docelowego), ale PAM tak. Sudo używa PAM.
derobert
1

Obawiasz się, że hasło do konta może zostać ujawnione. Rozwiązaniem jest nieużywanie hasła logowania w sposób umożliwiający jego ujawnienie. W przypadku ssh hasło jest szyfrowane na kablu, więc jest w porządku. Ludzie wyłączają uwierzytelnianie hasła za pomocą ssh, aby zapobiec atakom polegającym na odgadywaniu hasła, a nie chronić poufność hasła. Jeśli używasz tego samego hasła do konta do innych celów, upewnij się, że używasz bezpiecznego, szyfrowanego kanału, aby podać hasło. Jeśli martwisz się o keylogger lub cokolwiek innego, przestań używać niezaufanych maszyn do logowania.

Jeśli ktoś może dostać twoje hasło ssh, prawdopodobnie może również otrzymać alternatywne hasło sudo, więc lepiej zainwestować czas w zwiększenie bezpieczeństwa połączeń niż spędzanie czasu tylko na komplikowaniu rzeczy z powodu iluzji większego bezpieczeństwa.

dannysauer
źródło
0

Nie mam natychmiastowego dostępu do systemu, w którym mogę to przetestować i ustalić szczegóły, ale mam pomysł:

  • (Załóżmy, że twoje normalne konto logowania to shau.)
  • Utworzyć drugie konto: shau2. (Nie jestem pewien, czy chcesz mieć taki sam identyfikator UID jak shau.)
  • Skonfiguruj, shau2aby mieć uprawnienia sudo z NOPASSWD.
  • Skonfiguruj alias lub skrypt powłoki su shau2 -c sudo "$@". To powinno poprosić o shau2hasło. Jeśli zostanie to wprowadzone poprawnie, będzie działać sudojako shau2 (co nie powinno wymagać podania hasła).
  • Usuń shauuprawnienia sudo.

Niestety musisz to powtórzyć dla każdego użytkownika, który ma uprawnienia sudo.

Scott
źródło
0

Dziękuję @ Shâu Shắc za odpowiedź ! To rozwiązanie działa również dla LinuxMint 17.1 Cinnamon 32bit (zainstalowałem tylko db-utilpakiet, aby uruchomić db_load).

Ale jestem bardzo mylony z wynikowym passwd.dbplikiem. Zrobiłem to samo, co w twojej odpowiedzi (ale użyłem Davida i Jonesa , wyglądają bardziej przyciągająco):

# db_load -t hash -T /usr/local/etc/passwd.db
david
jones
^d

Ale wprowadzone poświadczenia są przechowywane w pliku skrótu jako zwykły tekst:

# grep 'jones.*david'  /usr/local/etc/passwd.db
Binary file /usr/local/etc/passwd.db matches

Możesz także zobaczyć Davida i Jonesa za pośrednictwem mcedit :

wprowadź opis zdjęcia tutaj

Tak, można ograniczyć uprawnienia /usr/local/etc/passwd.db. Ale w każdym razie nazwa użytkownika i hasło przechowywane jako zwykły tekst są złe.


Nawet z osobnym hasłem sudo istnieją pewne potencjalne luki w zabezpieczeniach (domyślnie konfiguracja dystrybucji). W związku z tym osobne hasło nie ma zastosowania do su (więc możliwe jest rozpoczęcie sesji roota przy użyciu sui hasła logowania). Również Policy Kit nie przestrzega oddzielnego hasła (możliwe jest uruchomienie Synaptic przy użyciu synaptic-pkexeci hasło logowania. Następnie usuń pakiety ...). Problemy te można wyeliminować przez dodatkowe dostrojenie plików konfiguracyjnych.

Zasadniczo wydaje się, że bezpieczne oddzielne hasło sudo można osiągnąć tylko przy pomocy niestandardowego modułu PAM (być może taki moduł porówna hasło i skrót SHA-512 odczytany z pliku) lub funkcji SELinux.

PS: przepraszam, powinien to być komentarz. Ale idzie to jako odpowiedź ze względu na format tekstu. Dzięki za zrozumienie.

flaz14
źródło