Làm thế nào để nội bộ của sudo làm việc?


74

Làm thế nào để sudolàm việc nội bộ? Làm thế nào có thể nó có thể trở thành root mà không cần mật khẩu root, không giống như su? Những tòa nhà cao tầng, vv có liên quan đến quá trình? Có phải đó không phải là lỗ hổng bảo mật trong Linux (ví dụ: tại sao tôi không thể biên dịch một bản vá lỗi nặng nề sudomà chỉ cần làm bất cứ điều gì thông thường sudo, nhưng không yêu cầu mật khẩu người dùng không được ưu tiên)?

Tôi đã đọc đăng nhập và su nội bộ . Tôi cũng đã đọc Làm thế nào là sudo dự định sẽ được sử dụng? nhưng mặc dù tiêu đề, họ chủ yếu giải quyết sự khác biệt giữa susudo.

Câu trả lời:


80

Nếu bạn nhìn vào thực thi sudo:

$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun  3  2011 /usr/bin/sudo

Bạn sẽ nhận thấy rằng nó mang các bit cho phép ---s--x--x. Chúng có thể được chia nhỏ như sau:

-|--s|--x|--x
-      - first dash denotes if a directory or a file ("d" = dir, "-" = file)  
--s    - only the setuid bit is enabled for user who owns file
--x    - only the group execute bit is enabled
--x    - only the other execute bit is enabled

Vì vậy, khi một chương trình được kích hoạt bit setuid (còn được gọi là SUID), có nghĩa là khi ai đó chạy chương trình này, nó sẽ chạy với thông tin đăng nhập của người dùng sở hữu tệp, hay còn gọi là. gốc trong trường hợp này.

Thí dụ

Nếu tôi chạy lệnh sau là người dùng saml:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

Bạn sẽ nhận thấy rằng việc thực thi sudothực sự đang chạy bằng root:

$ ps -eaf|grep sudo
root     20399  2353  0 05:07 pts/13   00:00:00 sudo su -

cơ chế setuid

Nếu bạn tò mò về cách thức hoạt động của SUID, hãy xem man setuid. Đây là một đoạn trích từ trang người đàn ông giải thích nó tốt hơn tôi có thể:

setuid () đặt ID người dùng hiệu quả của quy trình gọi. Nếu UID hiệu quả của người gọi là root, UID thực và ID người dùng đã lưu cũng được đặt. Trong Linux, setuid () được triển khai giống như phiên bản POSIX với tính năng _POSIX_SAVED_IDS. Điều này cho phép chương trình ID người dùng tập hợp (không phải root) bỏ tất cả các đặc quyền người dùng của nó, thực hiện một số công việc không có đặc quyền và sau đó kiểm tra lại ID người dùng hiệu quả ban đầu một cách an toàn.

Nếu người dùng là root hoặc chương trình được đặt - ID-user-root, phải đặc biệt cẩn thận. Hàm setuid () kiểm tra ID người dùng hiệu quả của người gọi và nếu đó là siêu người dùng, tất cả ID người dùng liên quan đến quá trình được đặt thành uid. Sau khi điều này xảy ra, chương trình không thể lấy lại quyền root.

Khái niệm chính ở đây là các chương trình có một userid thực sự (UID) và một chương trình hiệu quả (EUID). Setuid đang thiết lập userid hiệu quả (EUID) khi bit này được bật.

Vì vậy, từ quan điểm của hạt nhân, người ta biết rằng trong ví dụ của chúng tôi, samlvẫn là chủ sở hữu ban đầu (UID), nhưng EUID đã được thiết lập với bất kỳ ai là chủ sở hữu của tệp thực thi.

setgid

Tôi cũng nên đề cập rằng khi chúng ta phá vỡ các quyền trên lệnh sudo, nhóm bit thứ hai là dành cho quyền của nhóm. Các bit nhóm cũng có một cái gì đó tương tự như setuid được gọi là id nhóm set (hay còn gọi là setgid, SGID). Điều này thực hiện tương tự như SUID ngoại trừ nó chạy quy trình với thông tin đăng nhập nhóm thay vì thông tin đăng nhập của chủ sở hữu.

Người giới thiệu


4
Bạn nên sử dụng sudo -sthay sudo suvì sử dụng vô dụng su. :)
Toto

4

sudoNhị phân thực là gốc setuid và bạn không thể tạo các tệp thành tồn tại theo cách này.

setuid và setgid (viết tắt của "đặt ID người dùng khi thực thi" và "đặt ID nhóm khi thực thi", tương ứng) [1] là các cờ quyền truy cập Unix cho phép người dùng chạy một tệp thực thi với quyền của chủ sở hữu hoặc nhóm thực thi tương ứng và để thay đổi hành vi trong các thư mục.


được rồi, đó là một phần câu hỏi của tôi nếu bạn giải thích về cách sudo sử dụng bit này và thêm một chút về những gì bit này làm, tôi rất muốn chấp nhận câu trả lời này
strugee

2

Để trả lời một phần về các tòa nhà chọc trời mà dường như không ai chạm vào, một trong những tòa nhà quan trọng là setresuid () hoặc setresgid (). Tôi chắc chắn có những người khác, nhưng 2 cái này có vẻ khá cụ thể đối với setuid / sudo.

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.