ฉันต้องการคำสั่งเพื่อแสดงรายการผู้ใช้ทั้งหมดที่มีสิทธิ์ใช้งานรูทเช่น sudo หรือไม่
สมมติว่าฉันเป็นผู้ใช้ sudoer ฉันจะรู้ผู้ใช้ sudoer คนอื่น ๆ ได้อย่างไร?
ฉันต้องการคำสั่งเพื่อแสดงรายการผู้ใช้ทั้งหมดที่มีสิทธิ์ใช้งานรูทเช่น sudo หรือไม่
สมมติว่าฉันเป็นผู้ใช้ sudoer ฉันจะรู้ผู้ใช้ sudoer คนอื่น ๆ ได้อย่างไร?
คำตอบ:
หากคุณเพียงแค่ต้องการแสดงรายการ 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 Perlo: ทำให้grepพิมพ์เฉพาะสตริงที่ตรงกัน'^sudo.+:\K.*$': ทำให้grepตรงกับ regex ระหว่างคำพูดรายละเอียด Regex # 1:
^: จุดเริ่มต้นของบรรทัด.+: หนึ่งตัวหรือมากกว่านั้น\K: ยกเลิกการแข่งขันก่อนหน้า.*: ศูนย์หรือมากกว่าตัวละคร$: สิ้นสุดบรรทัดการแยกย่อยคำสั่ง # 2:
grep: พิมพ์บรรทัดทั้งหมดที่ตรงกับ regex ในไฟล์'^sudo.+:\K.*$': ทำให้grepตรงกับ regex ระหว่างคำพูดcut: พิมพ์เฉพาะส่วนที่ระบุของแต่ละบรรทัดในไฟล์-d:: ทำให้cutตีความ:เป็นตัวคั่นฟิลด์-f4: ทำให้cutพิมพ์เฉพาะฟิลด์ที่สี่รายละเอียด Regex # 2:
^: จุดเริ่มต้นของบรรทัด.*: ศูนย์หรือมากกว่าตัวละคร$: สิ้นสุดบรรทัดgetent group sudo | cut -d: -f4หรือใช้ awk แต่วิธีใดก็ตามโปรดจำไว้ว่ากลุ่มและ passwd มีรูปแบบคงที่พร้อมตัวคั่น
getent group- คุณไม่จำเป็นต้องใช้ grep เลย getent group fooเป็นเหมือนgrep foo /etc/groupแต่มีความสามารถมากกว่า
getentเลยว่ามีวิธีใดgrepและgetentเปรียบเทียบการคำนวณอย่างไร มันจะเบากว่าgetentหรือไม่ในการทำงาน
sudoกลุ่ม UNIXes บางคนมีกลุ่มอื่น ๆ wheelเช่น คำตอบโดย @muru จะรวมถึง sudoers ทั้งหมดไม่ว่าพวกเขาจะอยู่ในกลุ่มใด
ตามที่ระบุไว้ที่นี่ฉันพิจารณาวิธีที่ง่ายที่สุดในการค้นหาด้วย-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.
"%domain admins@mycompany.intra" ALL=(ALL) ALLนั้นจะใช้ได้ คุณประหยัดเวลาได้มากเพราะฉันไม่ทราบว่าวิธีนี้ใช้ได้ผลกับผู้ใช้ที่ไม่ใช่คนท้องถิ่น
ตามที่ได้มีการระบุไว้แล้วคำตอบสามารถพบได้ในUnix & Linux Stack Exchange :
สิ่งนี้แสดงให้เห็นว่าผู้ใช้ "saml" เป็นสมาชิกของกลุ่มล้อ
$ getent group wheel wheel:x:10:saml
ข้อแตกต่างคือกลุ่มใน Ubuntu ไม่ใช่wheelแต่sudo(หรือadminใน Ubuntu รุ่นเก่ากว่า) ดังนั้นคำสั่งจะกลายเป็น:
getent group sudo
geten groupและฉันเห็นตัวเลขที่แตกต่างกันมากมาย คำถามเดิมของฉันคือวิธีการที่จะดูว่าผู้ใช้เป็นผู้ใช้ระบบ (สร้างขึ้นด้วยuseradd -r)
เมื่อขยายการ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นี่คือคำตอบที่ดีที่สุดเพราะมันไม่ได้คิดว่ามีกลุ่มที่เรียกว่า
บนระบบที่เหมือน 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)
คำสั่งนี้ส่งคืนรายการผู้ใช้ที่มีสิทธิ์ 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
คำสั่ง:
cat /etc/group | grep sudo
เอาท์พุท:
sudo:x:27:Tom,Stacy
Tom, Stacy เป็นผู้ใช้ที่มีสิทธิ์ sudo
cat
ผมอึ้งเกี่ยวกับวิธีการที่vagrantผู้ใช้สามารถใช้งานsudoได้โดยไม่ต้องได้รับการกล่าวถึงใน/etc/sudoersหรือในมิได้พบกับ/etc/groupgetent
เปิดออกยังอ่านรายการจากไฟล์ทั้งหมดภายใต้sudo /etc/sudoers.d/ดังนั้นหากคุณยังไม่ได้ดูในไดเรกทอรีนั้นคุณอาจไม่ทราบว่ามีผู้ใช้กี่คนที่sudoสามารถเข้าถึงได้
ชนิดของsudoการเข้าถึงสามารถตรวจพบโดยคำตอบโจ๊กโดยใช้sudo -l -U vagrantแต่ไม่ถูกตรวจจับโดยใด ๆ ของคำตอบอื่น ๆ ที่นี่ที่ทุกคนต้องพึ่งพาทั้งหรือgetent/etc/group