Tôi sẽ cố gắng giải thích từng bước với một số ví dụ.
Nền ngắn
Mỗi tiến trình có riêng 'Quy trình thông tin' của nó bao gồm các thuộc tính như PID, các PPID, PGID, session IDvà cũng là người dùng và nhóm ID thực và hiệu quả:
RUID, EUID, RGID, EGID.
Chúng tôi sẽ tập trung vào những điều đó.
Phần 1: Hiểu UID và GID
Bây giờ tôi sẽ đăng nhập vào một trình bao bằng thông tin đăng nhập của mình và chạy:
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
Bạn có thể thấy tên đăng nhập (rotem) của tôi, UID và GID đều là 1000 và các chi tiết khác như shell mà tôi đã đăng nhập.
Phần 2: Hiểu RUID và RGID
Mọi quy trình đều có chủ sở hữu và thuộc về một nhóm .
Trong trình bao của chúng tôi, mọi quy trình mà bây giờ chúng tôi sẽ chạy sẽ kế thừa các đặc quyền của tài khoản người dùng của tôi và sẽ chạy với cùng một UID và GID.
Hãy chạy một lệnh đơn giản để kiểm tra nó:
$ sleep 10 & ps aux | grep 'sleep'
Và kiểm tra UID và GID của quá trình:
$ stat -c "%u %g" /proc/$pid/
1000 1000
Đó là ID người dùng thực ( ) và ID nhóm thực ( ) của quy trình .RUIDRGID
(*) Kiểm tra các tùy chọn khác để xem UID và GID và các cách để có được điều này trong một lớp lót .
Hiện tại, hãy chấp nhận sự thật rằng các thuộc tính EUIDvà EGIDthuộc tính là 'dư thừa' và chỉ bằng với RUIDvà RGIDở phía sau.
Phần 3: Hiểu EUID và EGID
Hãy lấy pinglệnh làm ví dụ.
Tìm kiếm vị trí nhị phân bằng whichlệnh sau đó chạy ls -la:
-rwsr-xr-x 1 root root 64424 Mar 10 2017 ping
Bạn có thể thấy rằng chủ sở hữu và nhóm của tệp root. Điều này là do pinglệnh cần mở một ổ cắm và nhân Linux yêu cầu rootđặc quyền cho việc đó.
Nhưng làm thế nào tôi có thể sử dụng pingnếu tôi không có rootđặc quyền?
Chú ý ký tự 's' thay vì 'x' trong phần chủ sở hữu quyền đối với tệp.
Đây là một bit cấp phép đặc biệt cho các tệp thực thi nhị phân cụ thể (như pingvà sudo) được gọi là setuid .
Đây là nơi EUIDvà EGIDphát huy tác dụng.
Điều gì sẽ xảy ra là khi tệp nhị phân setuid như pingthực thi, quá trình thay đổi ID người dùng hiệu quả ( EUID) của nó từ mặc định RUIDthành chủ sở hữu của tệp thực thi nhị phân đặc biệt này, trong trường hợp này là -root .
Tất cả điều này được thực hiện bởi thực tế đơn giản là tệp này có setuidbit.
Kernel đưa ra quyết định liệu quá trình này có đặc quyền hay không bằng cách xem xét EUIDquá trình của quá trình. Bởi vì bây giờ các EUIDđiểm đến root, hoạt động sẽ không bị hạt nhân từ chối.
Lưu ý : Trên các bản phát hành Linux mới nhất, đầu ra của pinglệnh sẽ trông khác vì thực tế là họ đã áp dụng cách tiếp cận Khả năng của Linux thay vì cách tiếp cận setuid này - đối với những người chưa quen - hãy đọc ở đây .
Phần 4: Còn SUID và SGID?
ID người dùng đã lưu ( SUID) đang được sử dụng khi một quy trình đặc quyền đang chạy ( rootchẳng hạn như) và nó cần thực hiện một số tác vụ không đặc quyền.
Trong trường hợp đó, UID ( EUID) có hiệu lực từ trước đó sẽ được lưu bên trong SUIDvà sau đó được thay đổi thành một tác vụ không đặc quyền. Khi nhiệm vụ không đặc quyền được hoàn thành, EUIDý chí sẽ được lấy từ giá trị của SUIDvà chuyển trở lại tài khoản đặc quyền.