Jak mogę wyświetlić listę wszystkich superużytkowników?

86

Chcę, aby polecenie wyświetlało listę wszystkich użytkowników, którzy mają uprawnienia roota, np. Sudo?

Załóżmy, że jestem użytkownikiem sudoer. Jak mogę poznać wszystkich innych użytkowników sudoer?

Maythux
źródło
1
Uważam, że ten ładny unix.stackexchange.com/questions/50785/…
JoKeR
@JoKeR nice and tricky
Maythux,
1
Zauważ, że tylko odpowiedzi Jokera i muru są poprawne, tylko parsowanie plików conf / user conf nie daje ci tego, kto ma sudouprawnienia, a kto nie .... jeśli użytkownik jest w sudogrupie, ale sudoersplik nie ma nic o sudogrupie, następnie?
heemayl

Odpowiedzi:

81

Jeśli potrzebujesz tylko wymienić sudoerów wymienionych w sudogrupie, myślę, że najlepszym sposobem na to byłoby uruchomienie tego polecenia (które powinno być lżejsze obliczeniowo niż jakiekolwiek inne polecenie w tej odpowiedzi):

grep -Po '^sudo.+:\K.*$' /etc/group

Również zgodnie z sugestiami muru, format wpisów /etc/groupmożna łatwo obsłużyć cut:

grep '^sudo:.*$' /etc/group | cut -d: -f4

Również ponownie, zgodnie z sugestiami Muru, można użyć getentzamiast grep:

getent group sudo | cut -d: -f4

Każde z tych poleceń spowoduje wydrukowanie wszystkich użytkowników wymienionych w sudogrupie w /etc/group(jeśli są).

Podział polecenia nr 1:

  • grep: Drukuje wszystkie wiersze pasujące do wyrażenia regularnego w pliku
  • -P: grepdopasowuje wyrażenia regularne w stylu Perla
  • o: grepdrukuje tylko dopasowany ciąg
  • '^sudo.+:\K.*$': powoduje grepdopasowanie wyrażenia regularnego między cudzysłowami

Podział Regeksu nr 1:

  • Dowolny znak lub grupa znaków niewymieniona na liście pasuje do znaku lub samej grupy znaków
  • ^: początek linii
  • .+: jeden lub więcej znaków
  • \K: odrzuć poprzedni mecz
  • .*: zero lub więcej znaków
  • $: koniec linii

Podział polecenia nr 2:

  • grep: Drukuje wszystkie wiersze pasujące do wyrażenia regularnego w pliku
  • '^sudo.+:\K.*$': powoduje grepdopasowanie wyrażenia regularnego między cudzysłowami
  • cut: Drukuje tylko określoną sekcję każdego wiersza w pliku
  • -d:: cutinterpretuje :jako ogranicznik pola
  • -f4: sprawia, że cutwypisuje tylko czwarte pole

Podział Regex # 2:

  • Dowolny znak lub grupa znaków niewymieniona na liście pasuje do znaku lub samej grupy znaków
  • ^: początek linii
  • .*: zero lub więcej znaków
  • $: koniec linii
kos
źródło
5
-1: nie złapie to innych użytkowników lub grup, którzy mogli zostać dodani do sudoers lub zewnętrznych źródeł takich jak LDAP, a boy jest to brzydki sposób na zrobienie tego. getent group sudo | cut -d: -f4lub użyj awk, ale pamiętaj, że grupa i hasło mają ustalone formaty z ogranicznikami.
muru
@muru Masz rację, zaktualizowałem swoją odpowiedź
Kos
@kos Pamiętaj również, że naprawdę powinieneś użyć getent group- w ogóle nie potrzebujesz grep. getent group foojest jak grep foo /etc/group, ale bardziej zdolny.
mur
@muru W ogóle nie wiedziałem getent, zastanawiałem się, jak grepi getentporównać obliczeniowo? Czy bieganie byłoby lżejsze getent?
Kos
1
Ta odpowiedź zakłada, że ​​wszyscy sudoerowie są członkami sudogrupy. Niektóre unixy mają inne grupy, takie jak wheel. Odpowiedź @muru obejmie wszystkich sudoersów, bez względu na grupy, w których są.
Simon Woodside
30

Jak stwierdzono tutaj, uważam najprostszy sposób na odkrycie razem z opcjami -l& -U, po prostu wpisz, usersże wyświetli się lista np . John:

Jeśli użytkownik ma sudodostęp, wydrukuje poziom sudodostępu dla tego konkretnego użytkownika:

  sudo -l -U John
  User John may run the following commands on this host:
     (ALL : ALL) ALL

Jeśli użytkownik nie ma dostępu sudo, wydrukuje, że użytkownik nie może uruchomić sudona localhost:

   sudo -l -U John
   User John is not allowed to run sudo on localhost.
Żartowniś
źródło
2
Mogłaby pętli wszystkich normalnych użytkowników i przywrócić dane na nich za coś takiego : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. szybki hack nic nie gwarantuje :)
Wilf
Działa to również w konfiguracji Active Directory. Na przykład możesz wybrać użytkownika z jakiejś specjalnej grupy i sprawdzić użytkownika. Jeśli dodałeś grupę AD poprawnie, "%domain [email protected]" ALL=(ALL) ALLto działa. Zaoszczędziłeś mi dużo czasu, ponieważ nie wiedziałem, że działa to również dla nielokalnych użytkowników.
AdamKalisz
14

Jak już wspomniano, odpowiedź można znaleźć na Unix & Linux Stack Exchange :

To pokazuje, że użytkownik „saml” jest członkiem grupy kół.

$ getent group wheel
wheel:x:10:saml

Jedyną różnicą jest to, że grupa w Ubuntu nie jest wheel, ale sudo(lub adminw starszych wersjach Ubuntu). Zatem polecenie staje się:

getent group sudo
Andrea Corbellini
źródło
Co oznaczają te liczby. Zrobiłem geten groupi widzę wiele różnych liczb. Moje oryginalne pytanie brzmi: jak dowiedzieć się, czy użytkownik jest użytkownikiem systemu (utworzonym za pomocą useradd -r)
Shayan
9

Rozwijając sudo -l -Utest, można użyć getent passwddo określenia użytkowników, którzy mogą korzystać sudo. Użycie getentpozwala nam uzyskać dostęp do użytkowników, którzy mogą nie być obecni w passwdpliku, takich jak użytkownicy LDAP:

getent passwd | cut -f1 -d: | sudo xargs -L1 sudo -l -U | grep -v 'not allowed'

sudo -U nie zwraca niezerowej wartości wyjściowej, z której moglibyśmy skorzystać, więc jesteśmy zredukowani do grepowania wyjścia.

muru
źródło
To najlepsza odpowiedź, ponieważ nie zakłada, że ​​istnieje grupa o nazwie sudo.
Simon Woodside
3

W większości systemów uniksowych, które mają polecenie sudo i mają plik konfiguracyjny sudo; uruchamianie visudo jako root:

:~$ sudo bash

lub

:~$ su

:~# visudo

pozwoli administratorowi na sprawdzenie i zmianę uprawnień grup, które mogą korzystać z polecenia sudo.

W systemach uniksopodobnych opartych na Debianie, takich jak Ubuntu, grupy 4 i 27 zazwyczaj mają prawa dostępu do uprawnień sudo.

Grupa 4 to grupa administratorów (adm), a grupa 27 to sudo gid.

Aby zobaczyć, którzy użytkownicy są obecnie przypisani do tych grup, cat / etc / group plik, jak pokazano poniżej:

:~$ cat /etc/group

Przykładowe dane wyjściowe w systemie Ubuntu (ale nie w systemach Redhat, Oracle Solaris / Solaris lub BSD):

adm:x:4:youruser
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9: 
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:youruser,mybrother
floppy:x:25:
tape:x:26:
sudo:x:27:youruser,mybrother

Jak możemy stwierdzić, użytkownik jest administratorem systemu i członkiem grupy 4 (adm). Ale twój użytkownik i mój brat są członkami grupy 27, która jest numerem gid (identyfikacja grupy) sudo grupy. Więc mój brat może również uzyskać uprawnienia roota (superużytkownik).

Wiele systemów Linux, takich jak Fedora i Slackware, zawiera grupę kół gid = 10. Który zezwala na uprawnienia administratora po zastosowaniu polecenia sudo. W systemach opartych na BSD (np. FreeBSD) użytkownik root jest członkiem grupy kół, która ma wartość gid 0.

Również za pomocą komendy id każdy użytkownik może znaleźć w systemie informacje o grupie innego znanego użytkownika.

Na przykład:

:~$ id mybrother

Próbka wyjściowa

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
oOpSgEo
źródło
Specjalnie zalogowałem się, aby cię głosować. Idealne wyjaśnienie :)
Vidor Vistrom
1

To polecenie zwraca listę użytkowników z uprawnieniami sudo:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' /etc/passwd

Dane wyjściowe to (np.):

<username> : <username> adm cdrom sudo dip plugdev lpadmin sambashare docker

Jeśli wyświetlana jest tylko nazwa użytkownika, to polecenie:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
AB
źródło
1
pokazuje więcej użytkowników niż sudoers. Potrzebuje pewnych modyfikacji
Maythux,
@NewUSer Czy to lepiej?
AB
Dużo lepiej. Praca Gd
Maythux,
1

Komenda:

cat /etc/group | grep sudo

Wynik:

sudo:x:27:Tom,Stacy

Tom, Stacy to użytkownicy z uprawnieniami sudo.

XYZ
źródło
1
Witamy w Ask Ubuntu! Informuję, że jest to bezużyteczne użyciecat .
David Foerster,
0

Byłem zaskoczony tym, w jaki sposób vagrantużytkownik może korzystać sudonawet bez wzmianki w, /etc/sudoersani w, /etc/groupani w znalezieniu getent.

Okazuje się, że sudoczyta również wpisy ze wszystkich plików pod/etc/sudoers.d/ . Jeśli więc nie przejrzałeś tego katalogu, możesz nie zdawać sobie sprawy, ilu użytkowników faktycznie ma sudodostęp.

Ten rodzaj sudodostępu można wykryć za pomocą odpowiedzi JoKeR, sudo -l -U vagrantale nie jest on wykrywany przez żadną z innych odpowiedzi tutaj, które opierają się na którymkolwiek getentlub /etc/group.

krubo
źródło