Làm thế nào tôi có thể liệt kê tất cả người dùng siêu?


86

Tôi muốn một lệnh để liệt kê tất cả người dùng có quyền root tức là sudo?

Giả sử tôi là một người dùng sudoer. Làm thế nào tôi có thể biết tất cả người dùng sudoer khác?


Đây là câu trả lời: unix.stackexchange.com/a/140974/107084
AB

1
Tôi tìm thấy một đẹp này unix.stackexchange.com/questions/50785/...
Joker

@JoKeR đẹp và phức tạp
Maythux

1
Lưu ý rằng chỉ có câu trả lời của Jokermuru là chính xác, chỉ phân tích cú pháp tệp người dùng / nhóm không cung cấp cho bạn ai có sudoquyền và ai không .... nếu người dùng ở trong sudonhóm nhưng sudoerstệp không có gì được đề cập cho sudonhóm, sau đó?
heemayl

Câu trả lời:


81

Nếu bạn chỉ cần liệt kê các sudoers được liệt kê trong sudonhóm, tôi nghĩ rằng cách tốt nhất để làm điều đó là chạy lệnh này ( nên nhẹ hơn bất kỳ lệnh nào khác trong câu trả lời này):

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

Cũng như được đề xuất trong các nhận xét của muru, định dạng của các mục trong /etc/groupcó thể dễ dàng xử lý bằng cách cut:

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

Ngoài ra, một lần nữa như được đề xuất trong các bình luận của muru, người ta có thể sử dụng getentthay cho grep:

getent group sudo | cut -d: -f4

Bất kỳ lệnh nào trong số này sẽ in tất cả người dùng được liệt kê trong sudonhóm /etc/group(nếu có).

Sự cố lệnh số 1:

  • grep: In tất cả các dòng khớp với biểu thức chính quy trong tệp
  • -P: làm cho grepphù hợp với biểu thức kiểu Perl
  • o: làm cho grepchỉ in chuỗi phù hợp
  • '^sudo.+:\K.*$': làm cho grepkhớp với biểu thức chính giữa các dấu ngoặc kép

Sự cố Regex # 1:

  • Bất kỳ nhân vật hoặc nhóm nhân vật nào không được liệt kê đều khớp với nhân vật hoặc chính nhóm nhân vật đó
  • ^: bắt đầu của dòng
  • .+: một hoặc nhiều ký tự
  • \K: loại bỏ trận đấu trước
  • .*: không hoặc nhiều ký tự
  • $: kết thúc dòng

Sự cố lệnh số 2:

  • grep: In tất cả các dòng khớp với biểu thức chính quy trong tệp
  • '^sudo.+:\K.*$': làm cho grepkhớp với biểu thức chính giữa các dấu ngoặc kép
  • cut: Chỉ in một phần được chỉ định của mỗi dòng trong một tệp
  • -d:: làm cho cutdiễn giải :như một dấu phân cách trường
  • -f4: cutchỉ in trường thứ tư

Sự cố Regex # 2:

  • Bất kỳ nhân vật hoặc nhóm nhân vật nào không được liệt kê đều khớp với nhân vật hoặc chính nhóm nhân vật đó
  • ^: bắt đầu của dòng
  • .*: không hoặc nhiều ký tự
  • $: kết thúc dòng

5
-1: điều này sẽ không bắt được những người dùng hoặc nhóm khác có thể đã được thêm vào sudoers hoặc các nguồn bên ngoài như LDAP và cậu bé là một cách xấu xí để làm điều này. getent group sudo | cut -d: -f4hoặc sử dụng awk, nhưng bằng cách nào đó hãy nhớ rằng nhóm và mật khẩu có các định dạng cố định, với các dấu phân cách.
muru

@muru Bạn nói đúng, tôi đã cập nhật câu trả lời của mình
kos

@kos Cũng lưu ý rằng bạn thực sự nên sử dụng getent group- bạn hoàn toàn không cần grep. getent group foolà như thế grep foo /etc/group, nhưng có khả năng hơn.
muru

@muru Tôi hoàn toàn không biết getent, có ai nghĩ về cách tính toán grepgetentso sánh không? Nó sẽ nhẹ hơn để chạy getent?
kos

1
Câu trả lời này giả định rằng tất cả các sudoers là thành viên của sudonhóm. Một số unix có các nhóm khác như wheel. Câu trả lời của @muru sẽ bao gồm tất cả các sudoers cho dù họ thuộc nhóm nào.
Simon Woodside

30

Như đã nêu ở đây, tôi xem xét cách đơn giản nhất để khám phá với -l& -Ucác tùy chọn cùng nhau, chỉ cần nhập usersnó sẽ liệt kê ví dụ: Johnsau đó:

Nếu người dùng có sudoquyền truy cập, nó sẽ in mức sudotruy cập cho người dùng cụ thể đó:

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

Nếu người dùng không có quyền truy cập sudo, nó sẽ in rằng người dùng không được phép chạy sudotrên localhost:

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

2
Bạn có thể lặp qua tất cả người dùng bình thường và trả lại các chi tiết về họ bằng cách sử dụng cái gì đó như : for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done. hack nhanh không có gì đảm bảo :)
Wilf

Điều này cũng hoạt động trong một thiết lập thư mục hoạt động. Chẳng hạn, bạn có thể chọn người dùng từ một số nhóm đặc biệt và kiểm tra người dùng. Nếu bạn thêm nhóm AD một cách chính xác "%domain admins@mycompany.intra" ALL=(ALL) ALLthì nó sẽ hoạt động. Bạn đã tiết kiệm cho tôi rất nhiều thời gian, vì tôi không biết điều này cũng hiệu quả với người dùng không phải là người địa phương.
AdamKalisz

14

Như đã được nêu, câu trả lời có thể được tìm thấy trên Unix & Linux Stack Exchange :

Điều này cho thấy người dùng "saml" là thành viên của nhóm bánh xe.

$ getent group wheel
wheel:x:10:saml

Sự khác biệt duy nhất là nhóm trong Ubuntu không phải wheel, nhưng sudo(hoặc admintrong các phiên bản cũ hơn của Ubuntu). Vì vậy, lệnh trở thành:

getent group sudo

Những con số có ý nghĩa gì? Tôi đã làm geten groupvà tôi thấy rất nhiều con số khác nhau. Câu hỏi ban đầu của tôi là, làm thế nào để tìm hiểu xem người dùng có phải là người dùng hệ thống (được tạo bằng useradd -r)
Shayan

9

Mở rộng trong sudo -l -Ubài kiểm tra, người ta có thể sử dụng getent passwdđể xác định người dùng có thể sử dụng sudo. Việc sử dụng getentcho phép chúng tôi truy cập người dùng có thể không có trong passwdtệp, chẳng hạn như người dùng LDAP:

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

sudo -U không trả về giá trị thoát khác không mà chúng ta có thể tận dụng, vì vậy chúng tôi được giảm xuống để lấy đầu ra.


Đây là câu trả lời tốt nhất vì nó không cho rằng có một nhóm được gọi sudo.
Simon Woodside

3

Trên hầu hết các hệ thống giống Unix, có lệnh sudo và có tệp cấu hình sudo; chạy visudo như root:

:~$ sudo bash

hoặc là

:~$ su

:~# visudo

sẽ cho phép quản trị viên kiểm tra và sửa đổi các đặc quyền của các nhóm có thể sử dụng lệnh sudo.

Trên các hệ thống giống như Unix dựa trên Debian, như Ubuntu, các nhóm 4 và 27 thường có quyền truy cập vào các đặc quyền sudo.

Nhóm 4 là nhóm quản trị viên (adm) và nhóm 27 là sudo gid.

Để xem những gì người dùng hiện được gán cho các nhóm này, hãy gửi tệp / etc / group như bên dưới:

:~$ cat /etc/group

Một đầu ra mẫu, trên Ubuntu (nhưng không dựa trên Redhat, dựa trên Oracle Solaris / Solaris hoặc các hệ thống dựa trên BSD) sẽ mang lại điều này:

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

Như chúng ta có thể nói, youruser là quản trị viên của hệ thống và là thành viên của nhóm 4 (adm). Nhưng youruser và mybrother đều là thành viên của nhóm 27, đó là số gid (nhận dạng nhóm) của nhóm sudo. Vì vậy, mybrother cũng có thể đạt được quyền root (siêu người dùng).

Nhiều hệ thống linux như Fedora và Slackware, kết hợp nhóm bánh xe gid = 10. Cho phép đặc quyền của quản trị viên khi lệnh sudo được áp dụng. Trên các hệ thống dựa trên BSD (ví dụ FreeBSD), người dùng root là thành viên của nhóm bánh xe là gid 0.

Cũng bằng cách sử dụng lệnh id, bất kỳ người dùng nào cũng có thể tìm thấy thông tin nhóm của một người dùng khác đã biết đến hệ thống.

Ví dụ:

:~$ id mybrother

Sản lượng mẫu

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

Tôi đặc biệt đăng nhập để nâng cấp bạn. Giải thích hoàn hảo :)
Vidor Vistrom

1

Lệnh này trả về danh sách người dùng có quyền sudo:

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

Đầu ra là (ví dụ):

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

Nếu chỉ có tên người dùng được hiển thị, thì lệnh này:

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

1
Nó cho thấy nhiều người dùng hơn so với sudoers. Nó cần một số sửa đổi
Maythux

@NewUSer Có tốt hơn không?
AB

Tốt hơn nhiều.
GV

1

Chỉ huy:

cat /etc/group | grep sudo

Đầu ra:

sudo:x:27:Tom,Stacy

Tom, Stacy là những người dùng có đặc quyền sudo.


1
Chào mừng bạn đến hỏi Ubuntu! Chỉ để cho bạn biết, đây là một cách sử dụng vô dụngcat .
David foerster

0

Tôi đã bối rối về cách vagrantngười dùng có thể sử dụng sudongay cả khi không được đề cập đến /etc/sudoerscũng /etc/groupnhư không được tìm thấy getent.

Hóa ra sudocũng đọc các mục từ tất cả các tập tin dưới/etc/sudoers.d/ . Vì vậy, nếu bạn chưa xem qua thư mục đó, bạn có thể không nhận ra có bao nhiêu người dùng thực sự có sudoquyền truy cập.

Loại sudotruy cập này có thể được phát hiện bằng câu trả lời của JoKeR bằng cách sử dụng sudo -l -U vagrantnhưng không bị phát hiện bởi bất kỳ câu trả lời nào khác ở đây mà tất cả đều dựa vào getenthoặc /etc/group.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.