Wie könnte ich alle Superuser auflisten?


86

Ich möchte, dass mit einem Befehl alle Benutzer aufgelistet werden, die über Root-Berechtigungen verfügen, z. B. sudo?

Angenommen, ich bin ein Sudoer-Benutzer. Wie kann ich alle anderen Sudoer-Benutzer kennenlernen?




@JoKeR schön und knifflig
Maythux

1
Beachten Sie, dass nur Joker und muru ‚s Antworten richtig sind, Benutzer / Gruppe conf Dateien nur Parsen Sie nicht geben, die hat die sudoErlaubnis und wer nicht .... wenn ein Benutzer in ist sudoGruppe , aber die sudoersDatei hat nichts erwähnt sudoGruppe, dann?
Heemayl

Antworten:


81

Wenn Sie nur die sudoers in der aufgeführten Liste müssen sudoGruppe, denke ich , dass der beste Weg , es zu tun wäre, um diesen Befehl auszuführen (was sollte als alle anderen Befehle in dieser Antwort rechen leichter sein):

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

Auch wie in den Kommentaren von muru vorgeschlagen, kann das Format der Einträge in /etc/groupleicht gehandhabt werden von cut:

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

Auch hier kann man, wie in den Kommentaren von muru vorgeschlagen, getentanstelle von grep:

getent group sudo | cut -d: -f4

Mit jedem dieser Befehle werden alle in der sudoGruppe aufgelisteten Benutzer in /etc/group(falls vorhanden) gedruckt .

Aufschlüsselung von Befehl 1:

  • grep: Druckt alle Zeilen, die zu einem regulären Ausdruck in einer Datei passen
  • -P: grepStimmt mit regulären Ausdrücken im Perl-Stil überein
  • o: grepLässt nur die übereinstimmende Zeichenfolge drucken
  • '^sudo.+:\K.*$': Stimmt grepmit dem regulären Ausdruck zwischen den Anführungszeichen überein

Regex # 1 Aufschlüsselung:

  • Alle Zeichen oder Zeichengruppen, die nicht aufgelistet sind, stimmen mit dem Zeichen oder der Zeichengruppe selbst überein
  • ^: Beginn der Linie
  • .+: ein oder mehrere Zeichen
  • \K: Das vorherige Spiel verwerfen
  • .*: null oder mehr Zeichen
  • $: Ende der Linie

Aufschlüsselung von Befehl Nr. 2:

  • grep: Druckt alle Zeilen, die zu einem regulären Ausdruck in einer Datei passen
  • '^sudo.+:\K.*$': Stimmt grepmit dem regulären Ausdruck zwischen den Anführungszeichen überein
  • cut: Druckt nur einen bestimmten Abschnitt jeder Zeile in einer Datei
  • -d:: Lässt cutinterpretieren :als Feldbegrenzer
  • -f4: cutLässt nur das vierte Feld drucken

Regex # 2 Aufschlüsselung:

  • Alle Zeichen oder Zeichengruppen, die nicht aufgelistet sind, stimmen mit dem Zeichen oder der Zeichengruppe selbst überein
  • ^: Beginn der Linie
  • .*: null oder mehr Zeichen
  • $: Ende der Linie

5
-1: Dies erfasst keine anderen Benutzer oder Gruppen, die Sudoern oder externen Quellen wie LDAP hinzugefügt wurden, und es ist ein hässlicher Weg, dies zu tun. getent group sudo | cut -d: -f4, oder benutze awk, aber denk daran, dass group und passwd feste Formate mit Begrenzern haben.
muru

@muru Du hast recht, ich habe meine Antwort aktualisiert
kos

@kos Beachten Sie auch, dass Sie wirklich verwenden sollten getent group- Sie brauchen das grep überhaupt nicht. getent group fooist wie grep foo /etc/group, aber fähiger.
muru

@muru Ich wusste überhaupt nicht, was ich darüber getentgelernt grepund getentrechnerisch verglichen habe? Wäre es leichter zu rennen getent?
Kos

1
Diese Antwort setzt voraus, dass alle Sudoer Mitglieder der sudoGruppe sind. Einige Unixe haben andere Gruppen wie wheel. Die Antwort von @muru wird alle Sudoer einschließen, egal in welcher Gruppe sie sich befinden.
Simon Woodside

30

Wie hier angegeben , halte ich es für den einfachsten Weg, mit -l& -Uoptions zusammen zu entdecken. Geben Sie einfach Folgendes ein, um userseine Liste zu erstellen : Johnthen:

Wenn der Benutzer sudoZugriff hat, wird die sudoZugriffsebene für diesen bestimmten Benutzer gedruckt :

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

Wenn der Benutzer nicht sudo Zugang hat, wird es drucken , dass ein Benutzer nicht erlaubt läuft sudoauf localhost:

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

2
Sie könnten alle normalen Benutzer durchlaufen und die Details zu ihnen mit etwas wie : zurückgeben for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. schnelle Hack nichts garantiert :)
Wilf

Dies funktioniert auch in einem Active Directory-Setup. Sie können beispielsweise einen Benutzer aus einer bestimmten Gruppe auswählen und den Benutzer überprüfen. Wenn Sie die AD-Gruppe korrekt hinzugefügt "%domain admins@mycompany.intra" ALL=(ALL) ALLhaben, funktioniert es. Sie haben mir viel Zeit gespart, da ich nicht wusste, dass dies auch für nicht lokale Benutzer funktioniert.
AdamKalisz

14

Wie bereits erwähnt, kann die Antwort auf Unix & Linux Stack Exchange gefunden werden :

Dies zeigt, dass der Benutzer "saml" Mitglied der Radgruppe ist.

$ getent group wheel
wheel:x:10:saml

Der einzige Unterschied ist, dass die Gruppe in Ubuntu nicht wheelaber sudo(oder adminin älteren Versionen von Ubuntu) ist. So wird der Befehl:

getent group sudo

Was bedeuten diese Zahlen? Ich habe es getan geten groupund sehe viele verschiedene Zahlen. Meine ursprüngliche Frage ist, wie man herausfindet, ob ein Benutzer ein Systembenutzer ist (erstellt mit useradd -r)
Shayan

9

Wenn Sie den sudo -l -UTest erweitern, können Sie getent passwddie Benutzer bestimmen, die ihn verwenden können sudo. Mit getentkönnen wir auf Benutzer zugreifen, die möglicherweise nicht in der passwdDatei vorhanden sind, z. B. LDAP-Benutzer:

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

sudo -U gibt keinen Exit-Wert ungleich Null zurück, den wir ausnutzen könnten, sodass wir uns darauf beschränken, die Ausgabe zu begrenzen.


Dies ist die beste Antwort, da nicht davon ausgegangen wird, dass eine Gruppe aufgerufen wird sudo.
Simon Woodside

3

Auf den meisten Unix-ähnlichen Systemen mit dem Befehl sudo und einer sudo-Konfigurationsdatei. visudo als root ausführen:

:~$ sudo bash

oder

:~$ su

:~# visudo

ermöglicht es einem Administrator, die Berechtigungen von Gruppen zu überprüfen und zu ändern, die den Befehl sudo verwenden können.

Auf Debian-basierten Unix-ähnlichen Systemen wie Ubuntu haben die Gruppen 4 und 27 im Allgemeinen Zugriffsrechte auf die sudo-Berechtigungen.

Gruppe 4 ist die Administratorgruppe (adm) und Gruppe 27 ist die Sudo-GID.

Um zu sehen, welche Benutzer diesen Gruppen derzeit zugewiesen sind, rufen Sie die Datei / etc / group wie folgt auf:

:~$ cat /etc/group

Eine Beispielausgabe unter Ubuntu (aber nicht auf Redhat-, Oracle Solaris / Solaris- oder BSD-basierten Systemen) würde dies ergeben:

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

Wie wir sehen können, ist Ihr Benutzer der Administrator des Systems und Mitglied der Gruppe 4 (adm). Ihr Benutzer und mein Bruder sind jedoch beide Mitglieder der Gruppe 27, bei der es sich um die gid-Nummer (Gruppenidentifikationsnummer) des Gruppen-Sudos handelt. So kann mybrother auch Root-Rechte erlangen (Superuser).

Viele Linux-Systeme wie Fedora und Slackware enthalten die Radgruppe gid = 10. Dies ermöglicht Administratorrechte, wenn der Befehl sudo angewendet wird. Auf BSD-basierten Systemen (zB FreeBSD) ist der Root-Benutzer ein Mitglied der Wheel-Gruppe, die gid 0 hat.

Auch mit dem Befehl id kann jeder Benutzer die Gruppeninformationen eines anderen bekannten Benutzers im System finden.

Zum Beispiel:

:~$ id mybrother

Beispielausgabe

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

Ich habe mich speziell eingeloggt, um dich zu unterstützen. Perfekte Erklärung :)
Vidor Vistrom

1

Dieser Befehl gibt eine Liste von Benutzern mit sudo-Rechten zurück:

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

Ausgabe ist (zB):

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

Wenn nur der Benutzername angezeigt werden soll, dann lautet dieser Befehl:

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

1
Es zeigt mehr Benutzer als die Sudoer. Es braucht einige Änderungen
Maythux

@NewUSer Ist das besser?
AB

Viel besser. Gd Arbeit
Maythux


0

Ich war ratlos darüber, wie der vagrantBenutzer sudoauch ohne Erwähnung in /etc/sudoersnoch in /etc/groupnoch gefunden mit verwenden kann getent.

Stellt sich heraus, sudoliest auch Einträge aus allen Dateien unter/etc/sudoers.d/ . Wenn Sie dieses Verzeichnis nicht durchgesehen haben, können Sie möglicherweise nicht erkennen, wie viele Benutzer tatsächlich sudoZugriff haben.

Diese Art des sudoZugriffs kann durch die Antwort von JoKeR unter Verwendung von erkannt werden sudo -l -U vagrant, wird jedoch von keiner der anderen Antworten hier erkannt, auf die sich alle entweder getentoder verlassen /etc/group.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.