Come posso elencare tutti i super utenti?


87

Voglio un comando per elencare tutti gli utenti che hanno i privilegi di root, ad esempio sudo?

Supponiamo che io sia un utente sudoer. Come potrei conoscere tutti gli altri utenti sudoer?



1
Trovo che questo sia carino unix.stackexchange.com/questions/50785/…
JoKeR

@JoKeR bello e difficile
Maythux

1
Nota che solo le risposte di Joker e Muru sono corrette, l'analisi dei file di configurazione utente / gruppo non ti dà chi ha il sudopermesso e chi no .... se un utente è nel sudogruppo ma il sudoersfile non ha nulla di menzionato per il sudogruppo, poi?
Hememl

Risposte:


81

Se hai solo bisogno di elencare i sudoer elencati nel sudogruppo, penso che il modo migliore per farlo sarebbe quello di eseguire questo comando (che dovrebbe essere computazionalmente più leggero di qualsiasi altro comando in questa risposta):

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

Inoltre, come suggerito nei commenti di Muru, il formato delle voci in /etc/grouppuò essere facilmente gestito da cut:

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

Inoltre, come suggerito nei commenti di Muru, si può usare getental posto di grep:

getent group sudo | cut -d: -f4

Uno di questi comandi stamperà tutti gli utenti elencati nel sudogruppo /etc/group(se presenti).

Ripartizione comando n. 1:

  • grep: Stampa tutte le righe corrispondenti a una regex in un file
  • -P: crea grepregex in stile Perl
  • o: consente di grepstampare solo la stringa corrispondente
  • '^sudo.+:\K.*$': fa grepcorrispondere la regex tra le virgolette

Ripartizione Regex n. 1:

  • Qualsiasi personaggio o gruppo di caratteri non elencati corrisponde al personaggio o al gruppo di caratteri stesso
  • ^: inizio della riga
  • .+: uno o più personaggi
  • \K: scarta la partita precedente
  • .*: zero o più caratteri
  • $: fine linea

Ripartizione comando n. 2:

  • grep: Stampa tutte le righe corrispondenti a una regex in un file
  • '^sudo.+:\K.*$': fa grepcorrispondere la regex tra le virgolette
  • cut: Stampa solo una sezione specificata di ogni riga in un file
  • -d:: fa cutinterpretare :come delimitatore di campo
  • -f4: consente di cutstampare solo il quarto campo

Ripartizione Regex # 2:

  • Qualsiasi personaggio o gruppo di caratteri non elencati corrisponde al personaggio o al gruppo di caratteri stesso
  • ^: inizio della riga
  • .*: zero o più caratteri
  • $: fine linea

5
-1: questo non catturerà altri utenti o gruppi che potrebbero essere stati aggiunti ai sudoer o fonti esterne come LDAP, e ragazzo è un brutto modo per farlo. getent group sudo | cut -d: -f4oppure usa awk, ma ricorda comunque che gruppo e passwd hanno formati fissi, con delimitatori.
muru,

@muru Hai ragione, ho aggiornato la mia risposta
kos

@kos Nota anche che dovresti davvero usare getent group- non hai bisogno del grep. getent group fooè come grep foo /etc/group, ma più capace.
muru,

@muru Non lo sapevo getentaffatto, qualche idea su come grepe getentconfrontare a livello computazionale? Sarebbe più leggero correre getent?
kos

1
Questa risposta presuppone che tutti i sudoer siano membri del sudogruppo. Alcuni unix hanno altri gruppi come wheel. La risposta di @muru includerà tutti i sudoer, indipendentemente dai gruppi in cui si trovano.
Simon Woodside

30

Come indicato qui, considero il modo più semplice di scoprire con -l& -Uoptions insieme, basta digitare usersche elencherà ad esempio John:

Se l'utente ha sudoaccesso, stamperà il livello di sudoaccesso per quel particolare utente:

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

Se l'utente non ha accesso sudo, stamperà che un utente non può essere eseguito sudosu localhost:

   sudo -l -U John
   User John is not allowed to run sudo on localhost.

2
Si potrebbe ciclo tra tutti gli utenti normali e restituire i dettagli su di loro usando qualcosa come : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. hack rapido niente garantito :)
Wilf

Questo funziona anche in una configurazione di directory attiva. Ad esempio, puoi scegliere un utente da un gruppo speciale e controllare l'utente. Se hai aggiunto correttamente il gruppo AD qualcosa del genere, "%domain admins@mycompany.intra" ALL=(ALL) ALLallora funziona. Mi hai risparmiato un sacco di tempo, perché non ero a conoscenza del fatto che funziona anche per utenti non locali.
Adam Kalisz,

14

Come è già stato affermato, la risposta può essere trovata su Unix & Linux Stack Exchange :

Ciò dimostra che l'utente "saml" è un membro del gruppo ruote.

$ getent group wheel
wheel:x:10:saml

L'unica differenza è che il gruppo in Ubuntu non lo è wheel, ma sudo(o adminnelle versioni precedenti di Ubuntu). Quindi il comando diventa:

getent group sudo

Cosa significano questi numeri? L'ho fatto geten groupe vedo molti numeri diversi. La mia domanda originale è: come scoprire se un utente è un utente di sistema (creato con useradd -r)
Shayan,

9

Espandendo il sudo -l -Utest, è possibile utilizzare getent passwdper determinare gli utenti che possono utilizzare sudo. L' getentutilizzo ci consente di accedere agli utenti che potrebbero non essere presenti nel passwdfile, come gli utenti LDAP:

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

sudo -U non restituisce un valore di uscita diverso da zero che potremmo trarre vantaggio, quindi siamo ridotti a grepping dell'output.


Questa è la risposta migliore perché non assume che esista un gruppo chiamato sudo.
Simon Woodside,

3

Sulla maggior parte dei sistemi simili a Unix, che hanno il comando sudo e hanno un file di configurazione sudo; eseguendo visudo come root:

:~$ sudo bash

o

:~$ su

:~# visudo

consentirà a un amministratore di ispezionare e modificare i privilegi dei gruppi che possono usare il comando sudo.

Su sistemi simili a Unix basati su Debian, come Ubuntu, i gruppi 4 e 27 hanno generalmente diritti di accesso ai privilegi di sudo.

Il gruppo 4 è il gruppo di amministratori (adm) e il gruppo 27 è il sudo gid.

Per vedere quali utenti sono attualmente assegnati a questi gruppi cat il file / etc / group come mostrato di seguito:

:~$ cat /etc/group

Un output di esempio, su Ubuntu (ma non basato su Redhat, basato su Oracle Solaris / Solaris o su sistemi basati su BSD) produrrebbe questo:

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

Come possiamo dire, il tuo utente è l'amministratore del sistema e membro del gruppo 4 (adm). Ma il tuo utente e mio fratello sono entrambi membri del gruppo 27, che è il numero gid (identificazione del gruppo) del gruppo sudo. Quindi mybrother può anche ottenere i privilegi di root (super user).

Molti sistemi Linux come Fedora e Slackware, incorporano il gruppo di ruote gid = 10. Che consente i privilegi di amministratore quando viene applicato il comando sudo. Su sistemi basati su BSD (ad es. FreeBSD), l'utente root è un membro del gruppo di ruote che è gid 0.

Inoltre, utilizzando il comando id, qualsiasi utente può trovare nel sistema le informazioni di gruppo di un altro utente noto.

Per esempio:

:~$ id mybrother

Uscita campione

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)

Ho effettuato il login per votarti. Spiegazione perfetta :)
Vidor Vistrom

1

Questo comando restituisce un elenco di utenti con diritti sudo:

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

L'output è (ad es.):

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

Se viene visualizzato solo il nome utente, questo comando:

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

1
mostra più utenti rispetto ai sudoers. Ha bisogno di alcune modifiche
Maythux,

@NewUSer È meglio?
AB

Molto meglio. Do lavoro
Maythux,

1

Comando:

cat /etc/group | grep sudo

Produzione:

sudo:x:27:Tom,Stacy

Tom, Stacy sono gli utenti con privilegi di sudo.


1
Benvenuto in Ask Ubuntu! Solo per farti sapere, questo è un uso inutile dicat .
David Foerster, l'

0

Ero sconcertato su come l' vagrantutente può usare sudoanche senza essere menzionato /etc/sudoersné in /etc/groupné trovato con getent.

Risulta sudoinoltre legge voci da tutti i file in/etc/sudoers.d/ . Quindi, se non hai guardato attraverso quella directory, potresti non capire quanti utenti hanno effettivamente sudoaccesso.

Questo tipo di sudoaccesso può essere rilevato dalla risposta di JoKeR usando sudo -l -U vagrantma non viene rilevato da nessuna delle altre risposte qui che fanno affidamento su getento /etc/group.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.