Comment pourrais-je lister tous les super utilisateurs?

87

Je veux une commande pour lister tous les utilisateurs qui ont des privilèges root, par exemple sudo?

Supposons que je suis un utilisateur sudoer. Comment pourrais-je connaître tous les autres utilisateurs sudoer?

Maythux
la source
1
Je trouve celui-ci bien unix.stackexchange.com/questions/50785/…
JoKeR
@JoKeR sympa et compliqué
Maythux
1
Notez que seules les réponses de Joker et de muru sont correctes, seul l'analyse des fichiers de configuration utilisateur / groupe ne vous permet pas de savoir qui a la sudopermission et qui n'a pas .... si un utilisateur est dans le sudogroupe mais que le sudoersfichier n'a rien mentionné pour sudogroupe, ensuite?
Heemayl

Réponses:

81

Si vous avez juste besoin de lister les sudoers listés dans le sudogroupe, je pense que la meilleure façon de le faire serait d'exécuter cette commande (qui devrait être plus légère en calcul que toutes les autres commandes de cette réponse):

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

De plus, comme suggéré dans les commentaires de muru, le format des entrées /etc/grouppeut être facilement géré par cut:

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

Aussi, comme suggéré dans les commentaires de muru, on peut utiliser getentà la place de grep:

getent group sudo | cut -d: -f4

Chacune de ces commandes imprimera tous les utilisateurs répertoriés dans le sudogroupe /etc/group(le cas échéant).

Répartition de la commande n ° 1:

  • grep: Imprime toutes les lignes correspondant à une expression régulière dans un fichier
  • -P: fait grepcorrespondre les expressions rationnelles de style Perl
  • o: permet d’ grepimprimer uniquement la chaîne correspondante
  • '^sudo.+:\K.*$': fait grepcorrespondre les expressions rationnelles entre les guillemets

Répartition regex # 1:

  • Tout caractère ou groupe de caractères non répertorié correspond au caractère ou au groupe de caractères lui-même
  • ^: début de ligne
  • .+: un ou plusieurs personnages
  • \K: écarte le match précédent
  • .*: zéro ou plusieurs caractères
  • $: fin de ligne

Répartition de la commande n ° 2:

  • grep: Imprime toutes les lignes correspondant à une expression régulière dans un fichier
  • '^sudo.+:\K.*$': fait grepcorrespondre les expressions rationnelles entre les guillemets
  • cut: N'imprime qu'une section spécifiée de chaque ligne d'un fichier
  • -d:: fait cutinterpréter :comme un délimiteur de champ
  • -f4: fait cutimprimer seulement le quatrième champ

Répartition regex # 2:

  • Tout caractère ou groupe de caractères non répertorié correspond au caractère ou au groupe de caractères lui-même
  • ^: début de ligne
  • .*: zéro ou plusieurs caractères
  • $: fin de ligne
kos
la source
5
-1: cela n'acceptera pas d'autres utilisateurs ou groupes qui pourraient avoir été ajoutés à des sudoers, ni à des sources externes telles que LDAP, et c'est une mauvaise façon de le faire. getent group sudo | cut -d: -f4, ou utilisez awk, mais dans tous les cas, rappelez-vous que group et passwd ont des formats fixes, avec des délimiteurs.
muru
@muru Vous avez raison, j'ai mis à jour ma réponse
kos
@ kos Notez également que vous devez vraiment utiliser getent group- vous n'avez pas du tout besoin de grep. getent group fooest comme grep foo /etc/group, mais plus capable.
muru
@muru je ne savais pas getentdu tout, aucune pensée sur comment grepet getentcomparer de calcul? Serait-il plus léger de courir getent?
Kos
1
Cette réponse suppose que tous les sudoers sont membres du sudogroupe. Certains Unix ont d'autres groupes tels que wheel. La réponse de @muru inclura tous les sudoers, peu importe le groupe dans lequel ils se trouvent.
Simon Woodside
30

Comme indiqué ici, je considère la manière la plus simple de découvrir les options -l& -Uensemble, il suffit de taper la usersliste, par exemple: Johnthen:

Si l'utilisateur a un sudoaccès, il imprimera le niveau d' sudoaccès pour cet utilisateur particulier:

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

Si l'utilisateur n'a pas d'accès sudo, il sera indiqué qu'un utilisateur n'est pas autorisé à s'exécuter sudosur localhost:

   sudo -l -U John
   User John is not allowed to run sudo on localhost.
Joker
la source
2
Vous pourriez créer une boucle par tous les utilisateurs normaux et retourner les détails sur les utiliser quelque chose comme : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. rapide bidouille rien garanti :)
Wilf
Cela fonctionne également dans une configuration Active Directory. Par exemple, vous pouvez choisir un utilisateur dans un groupe spécial et vérifier l'utilisateur. Si vous avez correctement ajouté le groupe AD, "%domain [email protected]" ALL=(ALL) ALLcela fonctionne. Vous m'avez fait gagner beaucoup de temps, car je ne savais pas que cela fonctionnait également pour les utilisateurs non locaux.
AdamKalisz
14

Comme cela a déjà été dit, la réponse peut être trouvée sur Unix & Linux Stack Exchange :

Cela montre que l'utilisateur "saml" est membre du groupe wheel.

$ getent group wheel
wheel:x:10:saml

La seule différence est que le groupe dans Ubuntu ne l'est pas wheel, mais sudo(ou admindans les anciennes versions d'Ubuntu). Alors la commande devient:

getent group sudo
Andrea Corbellini
la source
Que signifient ces chiffres? Je l'ai fait geten groupet je vois beaucoup de chiffres différents. Ma question initiale était de savoir comment savoir si un utilisateur est un utilisateur du système (créé avec useradd -r)
Shayan
9

En développant le sudo -l -Utest, on peut utiliser getent passwdpour déterminer les utilisateurs qui peuvent utiliser sudo. L'utilisation getentnous permet d'accéder aux utilisateurs qui peuvent ne pas être présents dans le passwdfichier, tels que les utilisateurs LDAP:

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

sudo -U ne renvoie pas une valeur de sortie non nulle dont nous pourrions tirer parti, nous sommes donc réduits à greper la sortie.

muru
la source
C'est la meilleure réponse car cela ne suppose pas qu'il existe un groupe appelé sudo.
Simon Woodside
3

Sur la plupart des systèmes de type Unix, qui ont la commande sudo et un fichier de configuration sudo; lancer visudo en tant que root:

:~$ sudo bash

ou

:~$ su

:~# visudo

permettra à un administrateur d'inspecter et de modifier les privilèges des groupes pouvant utiliser la commande sudo.

Sur les systèmes de type Unix basés sur Debian, comme Ubuntu, les groupes 4 et 27 ont généralement des droits d’accès aux privilèges sudo.

Le groupe 4 est le groupe d'administrateurs (adm) et le groupe 27 est le sudo gid.

Pour voir quels utilisateurs sont actuellement affectés à ces groupes, tapez le fichier / etc / group comme indiqué ci-dessous:

:~$ cat /etc/group

Un exemple de sortie, sur Ubuntu (mais pas sur Redhat, sur Oracle Solaris / Solaris ou sur des systèmes BSD) donnerait ceci:

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

Comme nous pouvons le constater, votre utilisateur est l'administrateur du système et membre du groupe 4 (adm). Mais youruser et mybrother sont tous deux membres du groupe 27, qui correspond au numéro de groupe (gid) du groupe sudo. Donc, mon frère peut également atteindre les privilèges root (super utilisateur).

De nombreux systèmes Linux comme Fedora et Slackware intègrent le groupe de roues gid = 10. Qui autorise les privilèges d'administrateur lorsque la commande sudo est appliquée. Sur les systèmes basés sur BSD (par exemple FreeBSD), l'utilisateur root est membre du groupe de roues qui est gid 0.

De plus, en utilisant la commande id, tout utilisateur peut trouver les informations de groupe d'un autre utilisateur connu du système.

Par exemple:

:~$ id mybrother

Échantillon de sortie

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
oOpSgEo
la source
Je me suis spécialement connecté pour vous faire voter. Explication parfaite :)
Vidor Vistrom
1

Cette commande retourne une liste d'utilisateurs avec des droits sudo:

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

La sortie est (par exemple):

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

Si seul le nom d'utilisateur à afficher, alors cette commande:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
UN B
la source
1
il montre plus d'utilisateurs que les sudoers. Il a besoin de quelques modifications
Maythux
@NewUSer Est-ce mieux?
AB
Beaucoup mieux. D.ieu travail
Maythux
1

Commander:

cat /etc/group | grep sudo

Sortie:

sudo:x:27:Tom,Stacy

Tom, Stacy sont les utilisateurs avec les privilèges sudo.

XYZ
la source
1
Bienvenue sur Ask Ubuntu! Juste pour vous faire savoir, ceci est une utilisation inutile decat .
David Foerster
0

J'étais perplexe sur la façon dont l' vagrantutilisateur peut utiliser sudomême sans être mentionné /etc/sudoersdans /etc/groupni trouvé avec getent.

Il s'avère que sudolit également les entrées de tous les fichiers sous/etc/sudoers.d/ . Donc, si vous n'avez pas parcouru ce répertoire, vous ne réaliserez peut-être pas combien d'utilisateurs ont réellement sudoaccès.

Ce type d' sudoaccès peut être détecté par la réponse de JoKeR en utilisant, sudo -l -U vagrantmais n'est détecté par aucune des autres réponses ici qui reposent toutes sur l'un getentou l' autre /etc/group.

Krubo
la source