Como eu poderia listar todos os superusuários?

58

Eu quero um comando para listar todos os usuários que têm privilégios de root, ou seja, sudo?

Suponha que eu seja um usuário sudoer. Como eu poderia conhecer todos os outros usuários sudoer?

    
por Maythux 20.04.2015 / 12:57

6 respostas

59

Se você só precisar listar os sudoers listados no grupo sudo , acho que a melhor maneira de fazer isso seria executar este comando (que deve ser computacionalmente mais leve que qualquer um dos os outros comandos nesta resposta):

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

Além disso, conforme sugerido nos comentários de muru, o formato das entradas em /etc/group pode ser facilmente manipulado por cut :

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

Além disso, como sugerido nos comentários de muru, pode-se usar getent no lugar de grep :

getent group sudo | cut -d: -f4

Qualquer um desses comandos imprimirá todos os usuários listados no grupo sudo em /etc/group (se houver).

Divisão do comando 1:

  • grep : imprime todas as linhas correspondentes a uma expressão regular em um arquivo
  • -P : faz com que grep corresponda às expressões regulares em estilo Perl
  • o : torna grep imprimir apenas a string correspondente
  • '^sudo.+:\K.*$' : torna grep igual ao regex entre as aspas

Divisão do Regex # 1:

  • Qualquer caractere ou grupo de caracteres não listados corresponde ao caractere ou ao grupo de caracteres em si
  • ^ : início da linha
  • .+ : um ou mais caracteres
  • \K : descarta a correspondência anterior
  • .* : zero ou mais caracteres
  • $ : fim da linha

Divisão do Comando nº 2:

  • grep : imprime todas as linhas correspondentes a uma expressão regular em um arquivo
  • '^sudo.+:\K.*$' : torna grep igual ao regex entre as aspas
  • cut : imprime somente uma seção específica de cada linha em um arquivo
  • -d: : torna cut interpretar : como um delimitador de campo
  • -f4 : faz cut imprimir apenas o quarto campo

Divisão do Regex # 2:

  • Qualquer caractere ou grupo de caracteres não listados corresponde ao caractere ou ao grupo de caracteres em si
  • ^ : início da linha
  • .* : zero ou mais caracteres
  • $ : fim da linha
por kos 20.04.2015 / 13:57
25

Como declarado aqui I considere a maneira mais simples de descobrir com -l & amp; -U opções juntas, basta digitar users , por exemplo: John then:

Se o usuário tiver sudo access, ele imprimirá o nível de sudo de acesso para esse usuário específico:

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

Se o usuário não tiver acesso ao sudo, ele indicará que não é permitido que o usuário execute sudo no localhost:

   sudo -l -U John
   User John is not allowed to run sudo on localhost.
    
por JoKeR 20.04.2015 / 13:40
10

Como já foi dito, a resposta pode ser encontrada em Unix & amp; Troca de pilha do Linux :

  

Isso mostra que o usuário "saml" é um membro do grupo wheel.

$ getent group wheel
wheel:x:10:saml

A única diferença é que o grupo no Ubuntu não é wheel , mas sudo (ou admin em versões mais antigas do Ubuntu). Então o comando se torna:

getent group sudo
    
por Andrea Corbellini 20.04.2015 / 13:02
6

Ao expandir o teste sudo -l -U , pode-se usar getent passwd para determinar os usuários que podem usar sudo . O uso de getent nos permite acessar usuários que podem não estar presentes no arquivo passwd , como usuários LDAP:

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

sudo -U não retorna um valor de saída diferente de zero do qual poderíamos aproveitar, por isso, estamos reduzidos para obter a saída.

    
por muru 20.04.2015 / 15:26
1

Este comando retorna uma lista de usuários com direitos sudo:

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

O resultado é (por exemplo):

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

Se apenas o nome do usuário a ser exibido, então este comando:

awk -F ":" '{ system("groups "  " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print  }' /etc/passwd
    
por A.B. 20.04.2015 / 13:12
0

Na maioria dos sistemas Unix-like, que possuem o comando sudo, e possuem um arquivo de configuração sudo; executando visudo como root:

:~$ sudo bash

ou

:~$ su

:~# visudo

permitirá que um administrador inspecione e altere os privilégios de grupos que podem usar o comando sudo.

Em sistemas Debian baseados em Unix, como o Ubuntu, os grupos 4 e 27 geralmente têm direitos de acesso aos privilégios sudo.

O grupo 4 é o grupo de administradores (adm) e o grupo 27 é o sudo gid.

Para ver quais usuários estão atualmente atribuídos a esses grupos, colete o arquivo / etc / group como mostrado abaixo:

:~$ cat /etc/group

Um exemplo de saída, no Ubuntu (mas não baseado em Redhat, baseado em Oracle Solaris / Solaris ou sistemas baseados em BSD) produziria isso:

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 dizer, o seu usuário é o administrador do sistema e membro do grupo 4 (adm). Mas seu usuário e meu irmão são ambos membros do grupo 27, que é o número gid (group identification) do grupo sudo. Então mybrother também pode obter privilégios de root (superusuário).

Muitos sistemas Linux, como o Fedora e o Slackware, incorporam o grupo de rodas gid = 10. Que permite privilégios de administrador quando o comando sudo é aplicado. Em sistemas baseados em BSD (por exemplo, FreeBSD), o usuário root é um membro do grupo wheel que é gid 0.

Além disso, usando o comando id, qualquer usuário pode encontrar as informações do grupo de outro usuário conhecido no sistema.

Por exemplo:

:~$ id mybrother

Exemplo de saída

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
    
por oOpSgEo 08.06.2015 / 22:13