슈퍼 사용자를 모두 나열하려면 어떻게해야합니까?


86

루트 권한을 가진 모든 사용자 (예 : sudo)를 나열하는 명령이 필요합니다.

내가 sudoer 사용자라고 가정하십시오. 다른 모든 sudoer 사용자를 어떻게 알 수 있습니까?


대답은 다음과 같습니다. unix.stackexchange.com/a/140974/107084
AB


@JoKeR 멋지고 까다로운
Maythux

1
오직주의 조커muru 의 답변이 올바른지, 오직 사용자 / 그룹의 conf 파일을 구문 분석하는 것은이 사람을 제공하지 않습니다 sudo권한과 사용자가있는 경우 사람 ....하지 않은 sudo그룹하지만 sudoers파일이 아무것도 언급하지 않았다 sudo그룹, 그때?
heemayl

답변:


81

sudo그룹에 나열된 sudoers를 나열 해야하는 경우 가장 좋은 방법은이 명령을 실행하는 것입니다 ( 이 답변의 다른 명령보다 계산이 가벼워 함).

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

또한 muru의 의견에서 제안한 것처럼 항목의 형식은 다음 /etc/group을 통해 쉽게 처리 할 수 ​​있습니다 cut.

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

또한 muru의 의견에서 제안한대로 다음 getent대신 사용할 수 있습니다 grep.

getent group sudo | cut -d: -f4

이러한 명령은 sudo그룹에 나열된 모든 사용자를 표시합니다 /etc/group(있는 경우).

명령 # 1 고장 :

  • grep: 파일의 정규식과 일치하는 모든 줄을 인쇄합니다
  • -P: grepPerl 스타일 정규식과 일치
  • o: grep일치하는 문자열 만 인쇄합니다
  • '^sudo.+:\K.*$': grep따옴표 사이의 정규 표현식과 일치시킵니다.

정규식 # 1 분석 :

  • 나열되지 않은 문자 또는 문자 그룹은 문자 또는 문자 그룹 자체와 일치합니다.
  • ^: 줄의 시작
  • .+: 하나 이상의 문자
  • \K: 이전 경기를 버리십시오
  • .*: 0 개 이상의 문자
  • $: 줄의 끝

명령 # 2 고장 :

  • grep: 파일의 정규식과 일치하는 모든 줄을 인쇄합니다
  • '^sudo.+:\K.*$': grep따옴표 사이의 정규 표현식과 일치시킵니다.
  • cut: 파일에서 각 줄의 지정된 섹션 만 인쇄합니다
  • -d:: 필드 구분자로 cut해석 :합니다.
  • -f4: cut네 번째 필드 만 인쇄합니다

정규식 # 2 분석 :

  • 나열되지 않은 문자 또는 문자 그룹은 문자 또는 문자 그룹 자체와 일치합니다.
  • ^: 줄의 시작
  • .*: 0 개 이상의 문자
  • $: 줄의 끝

5
-1 : 이것은 sudoers 또는 LDAP와 같은 외부 소스에 추가되었을 수있는 다른 사용자 나 그룹을 잡을 수 없으며,이를 수행하는 것은 추악한 방법입니다. getent group sudo | cut -d: -f4또는 awk를 사용하지만 group과 passwd에는 구분 기호가있는 고정 형식이 있음을 기억하십시오.
muru

@muru 당신 말이 맞아, 난 내 대답을 업데이트
kos

@kos 또한 당신이 정말로 사용해야 할 것에 주목하십시오 getent group-당신은 전혀 grep이 필요하지 않습니다. getent group foo처럼 grep foo /etc/group,하지만 더 할 수.
muru

@muru 전혀 몰랐 getent습니다. 어떻게 계산 grep하고 getent비교 하는 데 어려움이 있습니까? 달리는 것이 더 가벼울 getent까요?
kos

1
이 답변은 모든 sudoers가 sudo그룹의 구성원이라고 가정합니다 . 일부 유닉스에는와 같은 다른 그룹이 있습니다 wheel. @muru의 답변에는 그룹에 관계없이 모든 sudoers가 포함됩니다.
Simon Woodside

30

여기에 언급했듯이 -l& -U옵션을 함께 사용하는 가장 간단한 방법을 고려하면 다음과 같이 입력 users하십시오 John.

사용자에게 sudo액세스 sudo권한이있는 경우 해당 특정 사용자 에 대한 액세스 레벨을 인쇄합니다 .

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

사용자에게 sudo 액세스 권한이 없으면 사용자가 sudolocalhost 에서 실행할 수 없다는 메시지가 표시 됩니다.

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

2
당신은 모든 일반 사용자를 통해 루프를 할 수 있었던 사용하여에 대한 세부 사항을 반환 같은 것을 : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. 빠른 해킹 보장 없음 :)
Wilf

이것은 활성 디렉토리 설정에서도 작동합니다. 예를 들어 특정 그룹에서 사용자를 선택하고 사용자를 확인할 수 있습니다. AD 그룹을 올바르게 추가하면 "%domain admins@mycompany.intra" ALL=(ALL) ALL작동합니다. 로컬 사용자가 아닌 사람들에게도 효과가 있다는 것을 알지 못했기 때문에 많은 시간을 절약했습니다.
AdamKalisz

14

이미 언급했듯이 유닉스 및 리눅스 스택 교환 에서 답을 찾을 수 있습니다 .

이는 "saml"사용자가 휠 그룹의 구성원임을 나타냅니다.

$ getent group wheel
wheel:x:10:saml

유일한 차이점은 Ubuntu의 그룹은 wheel아니지만 sudo(또는 admin이전 버전의 Ubuntu)입니다. 따라서 명령은 다음과 같습니다.

getent group sudo

이 숫자는 무엇을 의미합니까? 나는했고 geten group다른 숫자를 많이 봅니다. 내 원래 질문은 사용자가 시스템 사용자인지 확인하는 방법입니다 (로 만든 useradd -r)
Shayan

9

sudo -l -U테스트를 확장하여 사용할 getent passwd수있는 사용자를 결정할 수 있습니다 sudo. 를 사용 getent하면 passwdLDAP 사용자와 같이 파일 에없는 사용자에게 액세스 할 수 있습니다 .

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

sudo -U 우리가 활용할 수있는 0이 아닌 종료 값을 반환하지 않으므로 출력을 grepping하는 것이 줄어 듭니다.


라는 그룹이 있다고 가정하지 않기 때문에 이것이 가장 좋은 대답 sudo입니다.
Simon Woodside

3

대부분의 유닉스 계열 시스템에서 sudo 명령이 있고 sudo 구성 파일이 있습니다. 루트로 visudo 실행 :

:~$ sudo bash

또는

:~$ su

:~# visudo

관리자는 sudo 명령을 사용할 수있는 그룹의 권한을 검사하고 수정할 수 있습니다.

우분투와 같은 데비안 기반 유닉스 계열 시스템에서 그룹 4와 27은 일반적으로 sudo 권한에 대한 액세스 권한을 갖습니다.

그룹 4는 관리자 그룹 (adm)이고 그룹 27은 sudo gid입니다.

이 그룹에 현재 할당 된 사용자를 확인하려면 아래와 같이 / etc / group 파일을 만드십시오.

:~$ cat /etc/group

Ubuntu (Redhat 기반, Oracle Solaris / Solaris 기반 또는 BSD 기반 시스템은 아님)의 샘플 출력은 다음과 같습니다.

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

우리가 알 수 있듯이, 사용자는 시스템의 관리자이며 그룹 4 (adm)의 구성원입니다. 그러나 사용자와 mybrother는 그룹 sudo의 gid (그룹 식별) 수인 그룹 27의 구성원입니다. 따라서 mybrother는 루트 권한 (슈퍼 사용자)도 얻을 수 있습니다.

Fedora 및 Slackware와 같은 많은 Linux 시스템은 gid = 10이라는 휠 그룹을 통합합니다. sudo 명령이 적용될 때 관리자 권한을 허용합니다. BSD 기반 시스템 (예 : FreeBSD)에서 루트 사용자는 gid 0 인 휠 그룹의 멤버입니다.

또한 id 명령을 사용하면 모든 사용자가 시스템에 알려진 다른 사용자의 그룹 정보를 찾을 수 있습니다.

예를 들어 :

:~$ id mybrother

샘플 출력

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

난 당신을 투표하기 위해 특별히 로그인했습니다. 완벽한 설명 :)
Vidor Vistrom

1

이 명령은 sudo 권한을 가진 사용자 목록을 반환합니다.

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

출력은 (예) :

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

사용자 이름 만 표시하려면이 명령을 사용하십시오.

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

1
sudoers보다 더 많은 사용자를 보여줍니다. 일부 수정이 필요함
Maythux

@NewUSer 더 나은가요?
AB

훨씬 낫다. Gd 작품
Maythux


0

나는 방법에 대해 난처한 상황에 빠진 한 vagrant사용자가 사용할 수 있습니다 sudo언급하지 않고 심지어는 /etc/sudoers도에서 /etc/group도 발견 getent.

밝혀 sudo도 아래의 모든 파일에서 항목을 읽습니다/etc/sudoers.d/ . 따라서 해당 디렉토리를 살펴 보지 않으면 실제로 sudo액세스 할 수있는 사용자 수를 알지 못할 수 있습니다.

이러한 종류의 sudo액세스는 JoKeR의 답변을 사용하여 감지 할 수 sudo -l -U vagrant있지만 여기 getent또는 모두에 의존하는 다른 답변은 감지하지 않습니다 /etc/group.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.