¿Cómo podría enumerar todos los superusuarios?

87

Quiero un comando para enumerar todos los usuarios que tienen privilegios de root, es decir, sudo?

Supongamos que soy un usuario sudoer. ¿Cómo podría conocer a todos los demás usuarios de sudoer?

Maythux
fuente
Aquí está la respuesta: unix.stackexchange.com/a/140974/107084
AB
1
Me parece agradable este unix.stackexchange.com/questions/50785/…
JoKeR
@JoKeR agradable y complicado
Maythux
1
Tenga en cuenta que solo las respuestas de Joker y muru son correctas, solo analizar los archivos conf de usuario / grupo no le da quién tiene el sudopermiso y quién no ... si un usuario está en el sudogrupo pero el sudoersarchivo no tiene nada mencionado para el sudogrupo, ¿entonces?
heemayl

Respuestas:

81

Si solo necesita enumerar los sudoers enumerados en el sudogrupo, creo que la mejor manera de hacerlo sería ejecutar este comando (que debería ser computacionalmente más ligero que cualquiera de los otros comandos en esta respuesta):

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

Además, como se sugiere en los comentarios de muru, el formato de las entradas /etc/grouppuede ser manejado fácilmente por cut:

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

También de nuevo como se sugiere en los comentarios de muru, uno puede usar getenten lugar de grep:

getent group sudo | cut -d: -f4

Cualquiera de estos comandos imprimirá a todos los usuarios enumerados en el sudogrupo /etc/group(si corresponde).

Desglose del comando n. ° 1:

  • grep: Imprime todas las líneas que coinciden con una expresión regular en un archivo
  • -P: hace grepcoincidir las expresiones regulares de estilo Perl
  • o: hace grepimprimir solo la cadena coincidente
  • '^sudo.+:\K.*$': hace grepcoincidir la expresión regular entre las comillas

Desglose de la expresión regular n. ° 1:

  • Cualquier carácter o grupo de caracteres no enumerados coincide con el carácter o el grupo de caracteres en sí
  • ^: inicio de línea
  • .+: uno o más personajes
  • \K: descartar el partido anterior
  • .*: cero o más caracteres
  • $: fin de la línea

Desglose del comando n. ° 2:

  • grep: Imprime todas las líneas que coinciden con una expresión regular en un archivo
  • '^sudo.+:\K.*$': hace grepcoincidir la expresión regular entre las comillas
  • cut: Imprime solo una sección específica de cada línea en un archivo
  • -d:: hace cutinterpretar :como un delimitador de campo
  • -f4: hace que la cutimpresión sea solo el cuarto campo

Desglose de Regex # 2:

  • Cualquier carácter o grupo de caracteres no enumerados coincide con el carácter o el grupo de caracteres en sí
  • ^: inicio de línea
  • .*: cero o más caracteres
  • $: fin de la línea
kos
fuente
55
-1: esto no atrapará a otros usuarios o grupos que puedan haber sido agregados a sudoers o fuentes externas como LDAP, y vaya, es una forma fea de hacer esto. getent group sudo | cut -d: -f4, o use awk, pero recuerde que group y passwd tienen formatos fijos, con delimitadores.
muru
@muru Tienes razón, actualicé mi respuesta
kos
@kos También tenga en cuenta lo que realmente debe usar getent group: no necesita el grep en absoluto. getent group fooes como grep foo /etc/group, pero más capaz.
muru
@muru No sabía getentnada, ¿alguna idea sobre cómo grepy cómo getentcomparar computacionalmente? ¿Sería más ligero correr getent?
kos
1
Esta respuesta supone que todos los sudoers son miembros del sudogrupo. Algunos unixes tienen otros grupos como wheel. La respuesta de @muru incluirá a todos los sudoers sin importar en qué grupos se encuentren.
Simon Woodside
30

Como se indica aquí , considero la forma más sencilla de descubrir con -l& -Uopciones juntas, solo tipee una userslista, por ejemplo: Johnluego:

Si el usuario tiene sudoacceso, imprimirá el nivel de sudoacceso para ese usuario en particular:

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

Si el usuario no tiene acceso a sudo, se imprimirá que un usuario no puede ejecutar sudoen localhost:

   sudo -l -U John
   User John is not allowed to run sudo on localhost.
Bufón
fuente
2
Usted podría recorrer todos los usuarios normales y devolver los datos en ellos usando algo como : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. pirateo rápido nada garantizado :)
Wilf
Esto también funciona en una configuración de directorio activo. Por ejemplo, puede elegir un usuario de algún grupo especial y verificarlo. Si agregó el grupo AD correctamente, algo así "%domain [email protected]" ALL=(ALL) ALLfunciona. Me ahorró mucho tiempo, porque no sabía que esto también funciona para usuarios no locales.
AdamKalisz
14

Como ya se ha dicho, la respuesta se puede encontrar en Unix & Linux Stack Exchange :

Esto muestra que el usuario "saml" es un miembro del grupo de ruedas.

$ getent group wheel
wheel:x:10:saml

La única diferencia es que el grupo en Ubuntu no es wheel, pero sudo(o adminen versiones anteriores de Ubuntu). Entonces el comando se convierte en:

getent group sudo
Andrea Corbellini
fuente
Que significan estos numeros? Lo hice geten groupy veo muchos números diferentes. Mi pregunta original es cómo averiguar si un usuario es un usuario del sistema (creado con useradd -r)
Shayan
9

Ampliando la sudo -l -Uprueba, se puede usar getent passwdpara determinar los usuarios que pueden usar sudo. El uso getentnos permite acceder a usuarios que pueden no estar presentes en el passwdarchivo, como los usuarios LDAP:

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

sudo -U no devuelve un valor de salida distinto de cero que podríamos aprovechar, por lo que estamos reducidos a grep la salida.

muru
fuente
Esta es la mejor respuesta porque no supone que haya un grupo llamado sudo.
Simon Woodside
3

En la mayoría de los sistemas tipo Unix, que tienen el comando sudo y tienen un archivo de configuración sudo; ejecutando visudo como root:

:~$ sudo bash

o

:~$ su

:~# visudo

permitirá que un administrador inspeccione y modifique los privilegios de los grupos que pueden usar el comando sudo.

En los sistemas tipo Unix basados ​​en Debian, como Ubuntu, los grupos 4 y 27 generalmente tienen derechos de acceso a los privilegios de sudo.

El grupo 4 es el grupo administrador (adm) y el grupo 27 es el sudo gid.

Para ver qué usuarios están asignados actualmente a estos grupos, busque el archivo / etc / group como se muestra a continuación:

:~$ cat /etc/group

Una salida de muestra, en Ubuntu (pero no en sistemas basados ​​en Redhat, Oracle Solaris / Solaris o BSD) produciría esto:

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

Como podemos ver, su usuario es el administrador del sistema y miembro del grupo 4 (adm). Pero su usuario y mi hermano son miembros del grupo 27, que es el número gid (identificación del grupo) del sudo del grupo. Entonces mybrother también puede obtener privilegios de root (superusuario).

Muchos sistemas Linux como Fedora y Slackware incorporan el grupo de ruedas gid = 10. Lo que permite privilegios de administrador cuando se aplica el comando sudo. En sistemas basados ​​en BSD (por ejemplo, FreeBSD), el usuario raíz es un miembro del grupo de rueda que es gid 0.

Además, mediante el comando id, cualquier usuario puede encontrar la información del grupo de otro usuario conocido en el sistema.

Por ejemplo:

:~$ id mybrother

Salida de muestra

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
oOpSgEo
fuente
Inicié sesión especialmente para votarte. Explicación perfecta :)
Vidor Vistrom
1

Este comando devuelve una lista de usuarios con derechos de sudo:

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

La salida es (por ejemplo):

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

Si solo se muestra el nombre de usuario, este comando:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
AB
fuente
1
Muestra más usuarios que los sudoers. Necesita algunas modificaciones
Maythux
@NewUSer ¿Eso es mejor?
AB
Mucho mejor. Trabajo de Di-s
Maythux
1

Mando:

cat /etc/group | grep sudo

Salida:

sudo:x:27:Tom,Stacy

Tom, Stacy son los usuarios con privilegios de sudo.

XYZ
fuente
1
Bienvenido a Ask Ubuntu! Solo para hacerle saber, este es un uso inútil decat .
David Foerster
0

Yo estaba confundido acerca de cómo el vagrantusuario puede utilizar sudoincluso sin ser mencionado en /etc/sudoersni en /etc/groupni encontrado con getent.

Resulta que sudotambién lee entradas de todos los archivos en/etc/sudoers.d/ . Entonces, si no ha examinado ese directorio, es posible que no se dé cuenta de cuántos usuarios realmente tienen sudoacceso.

Este tipo de sudoacceso puede ser detectado por la respuesta de JoKeR usando, sudo -l -U vagrantpero no es detectado por ninguna de las otras respuestas aquí, en las que todos se basan getento /etc/group.

krubo
fuente