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?
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?
Câu trả lời:
Nếu bạn chỉ cần liệt kê các sudoers được liệt kê trong sudo
nhó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/group
có 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 getent
thay 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 sudo
nhó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 grep
phù hợp với biểu thức kiểu Perlo
: làm cho grep
chỉ in chuỗi phù hợp'^sudo.+:\K.*$'
: làm cho grep
khớp với biểu thức chính giữa các dấu ngoặc képSự cố Regex # 1:
^
: 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òngSự 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 grep
khớp với biểu thức chính giữa các dấu ngoặc képcut
: Chỉ in một phần được chỉ định của mỗi dòng trong một tệp-d:
: làm cho cut
diễn giải :
như một dấu phân cách trường-f4
: cut
chỉ in trường thứ tưSự cố Regex # 2:
^
: bắt đầu của dòng.*
: không hoặc nhiều ký tự$
: kết thúc dònggetent group sudo | cut -d: -f4
hoặ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.
getent group
- bạn hoàn toàn không cần grep. getent group foo
là như thế grep foo /etc/group
, nhưng có khả năng hơn.
getent
, có ai nghĩ về cách tính toán grep
và getent
so sánh không? Nó sẽ nhẹ hơn để chạy getent
?
sudo
nhó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.
Như đã nêu ở đây, tôi xem xét cách đơn giản nhất để khám phá với -l
& -U
các tùy chọn cùng nhau, chỉ cần nhập users
nó sẽ liệt kê ví dụ: John
sau đó:
Nếu người dùng có sudo
quyền truy cập, nó sẽ in mức sudo
truy 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 sudo
trên localhost:
sudo -l -U John
User John is not allowed to run sudo on localhost.
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 :)
"%domain admins@mycompany.intra" ALL=(ALL) ALL
thì 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.
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 admin
trong các phiên bản cũ hơn của Ubuntu). Vì vậy, lệnh trở thành:
getent group sudo
geten group
và 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
)
Mở rộng trong sudo -l -U
bà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 getent
cho phép chúng tôi truy cập người dùng có thể không có trong passwd
tệ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.
sudo
.
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)
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
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.
cat
.
Tôi đã bối rối về cách vagrant
người dùng có thể sử dụng sudo
ngay cả khi không được đề cập đến /etc/sudoers
cũng /etc/group
như không được tìm thấy getent
.
Hóa ra sudo
cũ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ó sudo
quyền truy cập.
Loại sudo
truy 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 vagrant
như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 getent
hoặc /etc/group
.