Como eu poderia listar todos os superusuários?

87

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 pude conhecer todos os outros usuários de sudoer?

Maythux
fonte
Aqui está a resposta: unix.stackexchange.com/a/140974/107084
AB
@JoKeR agradável e complicado
Maythux
1
Observe que apenas as respostas de Joker e muru estão corretas, apenas a análise de arquivos conf de usuário / grupo não fornece a você quem tem sudopermissão e quem não tem .... se um usuário estiver no sudogrupo, mas o sudoersarquivo não tiver nada mencionado para o sudogrupo, então?
heemayl

Respostas:

81

Se você apenas precisar listar os sudoers listados no sudogrupo, acho que a melhor maneira de fazer isso seria executar este comando (que deve ser computacionalmente mais leve do que qualquer outro comando nesta resposta):

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

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

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

Também de novo, como sugerido nos comentários de muru, pode-se usar getentno lugar de grep:

getent group sudo | cut -d: -f4

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

Repartição do comando nº 1:

  • grep: Imprime todas as linhas correspondentes a uma regex em um arquivo
  • -P: faz grepcorresponder às expressões regulares ao estilo Perl
  • o: faz grepimprimir apenas a sequência correspondente
  • '^sudo.+:\K.*$': faz grepcorresponder o regex entre aspas

Repartição 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: descartar a partida anterior
  • .*: zero ou mais caracteres
  • $: fim da linha

Repartição do comando nº 2:

  • grep: Imprime todas as linhas correspondentes a uma regex em um arquivo
  • '^sudo.+:\K.*$': faz grepcorresponder o regex entre aspas
  • cut: Imprime apenas uma seção especificada de cada linha em um arquivo
  • -d:: faz cutinterpretar :como um delimitador de campo
  • -f4: cutimprime apenas o quarto campo

Repartição da 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
kos
fonte
5
-1: isso não captura outros usuários ou grupos que podem ter sido adicionados a sudoers ou fontes externas como LDAP, e boy é uma maneira feia de fazer isso. getent group sudo | cut -d: -f4, ou use awk, mas lembre-se de que o grupo e a senha têm formatos fixos, com delimitadores.
Muru
@muru Você está certo, eu atualizei minha resposta
kos
@kos Observe também o que você realmente deve usar getent group- você não precisa do grep. getent group fooé como grep foo /etc/group, mas mais capaz.
Muru
@ muru eu não sabia getent, pensou em como grepe getentcomparar computacionalmente? Seria mais leve correr getent?
kos
1
Esta resposta assume que todos os sudoers são membros do sudogrupo. Alguns unixes têm outros grupos, como wheel. A resposta por @muru incluirá todos sudoers não importa o que os grupos em que estão.
Simon Woodside
30

Como foi declarado aqui , considero a maneira mais simples de descobrir juntos com o -l& -Uoptions, basta digitar users; por exemplo John:

Se o usuário tiver sudoacesso, ele imprimirá o nível de sudoacesso 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, será impresso que o usuário não tem permissão para executar sudono localhost:

   sudo -l -U John
   User John is not allowed to run sudo on localhost.
Palhaço
fonte
2
Você poderia percorrer todos os usuários normais e retornar os detalhes sobre eles usando algo como : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. rápida corte nada garantido :)
Wilf
Isso também funciona em uma configuração do diretório ativo. Por exemplo, você pode escolher um usuário de algum grupo especial e verificar o usuário. Se você adicionou o grupo AD corretamente, algo como "%domain [email protected]" ALL=(ALL) ALLisso funciona. Você me salvou muito tempo, porque eu não sabia que isso também funciona para usuários não locais.
26617 AdamKalisz
14

Como já foi afirmado, a resposta pode ser encontrada no Unix e Linux Stack Exchange :

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

$ getent group wheel
wheel:x:10:saml

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

getent group sudo
Andrea Corbellini
fonte
O que estes números significam? Eu fiz geten groupe vejo muitos números diferentes. Minha pergunta original é: como descobrir se um usuário é um usuário do sistema (criado com useradd -r)
Shayan
9

Expandindo no sudo -l -Uteste, pode-se usar getent passwdpara determinar os usuários que podem usar sudo. O uso getentpermite acessar usuários que podem não estar presentes no passwdarquivo, 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 tirar proveito; portanto, somos reduzidos a receber a saída.

muru
fonte
Esta é a melhor resposta porque não supõe que exista um grupo chamado sudo.
Simon Woodside
3

Na maioria dos sistemas Unix, que possuem o comando sudo e 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.

Nos sistemas Unix, como o Ubuntu, 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, clique no arquivo / etc / group, como mostrado abaixo:

:~$ cat /etc/group

Uma saída de amostra, no Ubuntu (mas não nos sistemas Redhat, Oracle Solaris / Solaris ou BSD), produziria o seguinte:

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

Muitos sistemas linux como o Fedora e o Slackware incorporam o grupo de roda gid = 10. O 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

Saída de amostra

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
oOpSgEo
fonte
Eu efetuei login especialmente para fazer um voto positivo. Explicação perfeita :)
Vidor Vistrom 03/07
1

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

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

A saída é (por exemplo):

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

Se apenas o nome do usuário for exibido, este comando:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
AB
fonte
1
mostra mais usuários que os sudoers. Ele precisa de algumas modificações
Maythux
@NewUSer Isso é melhor?
AB
Muito melhor. Gd work
Maythux
1

Comando:

cat /etc/group | grep sudo

Resultado:

sudo:x:27:Tom,Stacy

Tom, Stacy são os usuários com privilégios de sudo.

XYZ
fonte
1
Bem-vindo ao Ask Ubuntu! Apenas para que você saiba, este é um uso inútil decat .
David Foerster
0

Eu estava perplexo sobre como o vagrantusuário pode usar sudo, mesmo sem ser mencionado em /etc/sudoersnem em /etc/groupnem encontrado com getent.

Acontece que sudotambém lê entradas de todos os arquivos em/etc/sudoers.d/ . Portanto, se você não consultou esse diretório, pode não perceber quantos usuários realmente têm sudoacesso.

Esse tipo de sudoacesso pode ser detectado pela resposta do JoKeR usando, sudo -l -U vagrantmas não é detectado por nenhuma das outras respostas aqui, nas quais todos dependem de um getentou de outro /etc/group.

krubo
fonte