ฉันจะแสดงรายการผู้ใช้ขั้นสูงทั้งหมดได้อย่างไร


86

ฉันต้องการคำสั่งเพื่อแสดงรายการผู้ใช้ทั้งหมดที่มีสิทธิ์ใช้งานรูทเช่น sudo หรือไม่

สมมติว่าฉันเป็นผู้ใช้ sudoer ฉันจะรู้ผู้ใช้ sudoer คนอื่น ๆ ได้อย่างไร?


นี่คือคำตอบ: unix.stackexchange.com/a/140974/107084
AB

1
ฉันพบนี้อย่างใดอย่างหนึ่งที่ดีunix.stackexchange.com/questions/50785/...
โจ๊ก

@JoKeR ที่ดีและยุ่งยาก
Maythux

1
โปรดทราบว่าเฉพาะคำตอบของJokerและmuruเท่านั้นการแยกไฟล์ conf ผู้ใช้ / กลุ่มไม่ได้ให้sudoสิทธิ์ผู้ใช้และใครที่ไม่ได้ .... ถ้าผู้ใช้อยู่ในsudoกลุ่ม แต่sudoersไม่มีการพูดถึงsudoกลุ่ม แล้ว?
heemayl

คำตอบ:


81

หากคุณเพียงแค่ต้องการแสดงรายการ sudoers ที่ระบุไว้ในsudoกลุ่มฉันคิดว่าวิธีที่ดีที่สุดที่จะทำคือเรียกใช้คำสั่งนี้ (ซึ่งควรจะเบากว่าคำสั่งอื่น ๆ ในคำตอบนี้):

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: พิมพ์บรรทัดทั้งหมดที่ตรงกับ regex ในไฟล์
  • -P: ทำให้การgrepจับคู่สไตล์ regexes Perl
  • o: ทำให้grepพิมพ์เฉพาะสตริงที่ตรงกัน
  • '^sudo.+:\K.*$': ทำให้grepตรงกับ regex ระหว่างคำพูด

รายละเอียด Regex # 1:

  • อักขระหรือกลุ่มของอักขระที่ไม่อยู่ในรายการตรงกับอักขระหรือกลุ่มของอักขระ
  • ^: จุดเริ่มต้นของบรรทัด
  • .+: หนึ่งตัวหรือมากกว่านั้น
  • \K: ยกเลิกการแข่งขันก่อนหน้า
  • .*: ศูนย์หรือมากกว่าตัวละคร
  • $: สิ้นสุดบรรทัด

การแยกย่อยคำสั่ง # 2:

  • grep: พิมพ์บรรทัดทั้งหมดที่ตรงกับ regex ในไฟล์
  • '^sudo.+:\K.*$': ทำให้grepตรงกับ regex ระหว่างคำพูด
  • cut: พิมพ์เฉพาะส่วนที่ระบุของแต่ละบรรทัดในไฟล์
  • -d:: ทำให้cutตีความ:เป็นตัวคั่นฟิลด์
  • -f4: ทำให้cutพิมพ์เฉพาะฟิลด์ที่สี่

รายละเอียด Regex # 2:

  • อักขระหรือกลุ่มของอักขระที่ไม่อยู่ในรายการตรงกับอักขระหรือกลุ่มของอักขระ
  • ^: จุดเริ่มต้นของบรรทัด
  • .*: ศูนย์หรือมากกว่าตัวละคร
  • $: สิ้นสุดบรรทัด

5
-1: สิ่งนี้จะไม่จับผู้ใช้หรือกลุ่มอื่น ๆ ที่อาจถูกเพิ่มไปยัง sudoers หรือแหล่งภายนอกเช่น LDAP และเด็กชายเป็นวิธีที่น่าเกลียดในการทำเช่นนี้ getent group sudo | cut -d: -f4หรือใช้ awk แต่วิธีใดก็ตามโปรดจำไว้ว่ากลุ่มและ 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กลุ่ม UNIXes บางคนมีกลุ่มอื่น ๆ 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 จะพิมพ์ว่าผู้ใช้ไม่ได้รับอนุญาตให้ทำงานsudoบน localhost:

   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ต่อไปนี้: ไม่มีการรับประกันแฮ็คอย่างรวดเร็ว :)
วิลฟ์

สิ่งนี้ยังทำงานในการตั้งค่าไดเรกทอรีที่ใช้งานอยู่ ตัวอย่างเช่นคุณสามารถเลือกผู้ใช้จากกลุ่มพิเศษบางอย่างและตรวจสอบผู้ใช้ หากคุณเพิ่มกลุ่มโฆษณาอย่างถูกต้องสิ่ง"%domain admins@mycompany.intra" ALL=(ALL) ALLนั้นจะใช้ได้ คุณประหยัดเวลาได้มากเพราะฉันไม่ทราบว่าวิธีนี้ใช้ได้ผลกับผู้ใช้ที่ไม่ใช่คนท้องถิ่น
AdamKalisz

14

ตามที่ได้มีการระบุไว้แล้วคำตอบสามารถพบได้ในUnix & Linux Stack Exchange :

สิ่งนี้แสดงให้เห็นว่าผู้ใช้ "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ช่วยให้เราสามารถเข้าถึงผู้ใช้ที่อาจไม่ปรากฏในpasswdไฟล์เช่นผู้ใช้ LDAP:

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

sudo -U ไม่ส่งคืนค่าออกที่ไม่เป็นศูนย์ซึ่งเราสามารถใช้ประโยชน์ได้ดังนั้นเราจึงลดการ grepping ผลลัพธ์


sudoนี่คือคำตอบที่ดีที่สุดเพราะมันไม่ได้คิดว่ามีกลุ่มที่เรียกว่า
Simon Woodside

3

บนระบบที่เหมือน Unix ส่วนใหญ่ที่มีคำสั่ง sudo และมีไฟล์คอนฟิกูเรชัน sudo ใช้ visudo เป็น root:

:~$ sudo bash

หรือ

:~$ su

:~# visudo

จะอนุญาตให้ผู้ดูแลระบบตรวจสอบและแก้ไขสิทธิ์ของกลุ่มที่สามารถใช้คำสั่ง sudo

สำหรับระบบ Unix-Debian ที่ใช้ Debian เช่น Ubuntu กลุ่มที่ 4 และ 27 จะมีสิทธิ์การเข้าถึงสิทธิ์ sudo

กลุ่ม 4 คือกลุ่มผู้ดูแลระบบ (adm) และกลุ่ม 27 คือ sudo gid

หากต้องการดูว่าผู้ใช้ใดที่ได้รับมอบหมายให้กลุ่มเหล่านี้แมวไฟล์ / etc / group ดังแสดงด้านล่าง:

:~$ cat /etc/group

ตัวอย่างผลลัพธ์บน Ubuntu (แต่ไม่ใช่ Redhat based, 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) แต่ youruser และ mybrother เป็นสมาชิกของกลุ่ม 27 ซึ่งเป็นหมายเลข gid (การระบุกลุ่ม) ของกลุ่ม sudo ดังนั้น mybrother ยังสามารถได้รับสิทธิ์รูต (ผู้ใช้ระดับสูง)

ระบบ linux จำนวนมากเช่น Fedora และ Slackware รวมกลุ่มล้อ 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

1

คำสั่ง:

cat /etc/group | grep sudo

เอาท์พุท:

sudo:x:27:Tom,Stacy

Tom, Stacy เป็นผู้ใช้ที่มีสิทธิ์ sudo


1
ยินดีต้อนรับสู่ถาม Ubuntu! เพียงเพื่อให้คุณรู้ว่านี่คือการใช้งานที่ไร้ประโยชน์ของ cat
David Foerster

0

ผมอึ้งเกี่ยวกับวิธีการที่vagrantผู้ใช้สามารถใช้งานsudoได้โดยไม่ต้องได้รับการกล่าวถึงใน/etc/sudoersหรือในมิได้พบกับ/etc/groupgetent

เปิดออกยังอ่านรายการจากไฟล์ทั้งหมดภายใต้sudo /etc/sudoers.d/ดังนั้นหากคุณยังไม่ได้ดูในไดเรกทอรีนั้นคุณอาจไม่ทราบว่ามีผู้ใช้กี่คนที่sudoสามารถเข้าถึงได้

ชนิดของsudoการเข้าถึงสามารถตรวจพบโดยคำตอบโจ๊กโดยใช้sudo -l -U vagrantแต่ไม่ถูกตรวจจับโดยใด ๆ ของคำตอบอื่น ๆ ที่นี่ที่ทุกคนต้องพึ่งพาทั้งหรือgetent/etc/group

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.