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 ID
và 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 .RUID
RGID
(*) 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 EUID
và EGID
thuộc tính là 'dư thừa' và chỉ bằng với RUID
và RGID
ở phía sau.
Phần 3: Hiểu EUID và EGID
Hãy lấy ping
lệnh làm ví dụ.
Tìm kiếm vị trí nhị phân bằng which
lệ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 ping
lệ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 ping
nế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ư ping
và sudo
) được gọi là setuid .
Đây là nơi EUID
và EGID
phát huy tác dụng.
Điều gì sẽ xảy ra là khi tệp nhị phân setuid như ping
thực thi, quá trình thay đổi ID người dùng hiệu quả ( EUID
) của nó từ mặc định RUID
thà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ó setuid
bit.
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 EUID
quá 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 ping
lệ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 ( root
chẳ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 SUID
và 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 SUID
và chuyển trở lại tài khoản đặc quyền.