Sự khác biệt giữa chủ sở hữu / root và RUID / EUID


24

Tôi còn khá mới đối với các khái niệm được đề cập trong câu hỏi và đọc về chúng từ các nguồn khác nhau chỉ khiến chúng trở nên khó hiểu hơn. Vì vậy, đây là những gì tôi hiểu cho đến nay:

Khi chúng tôi được cấp quyền cho một tệp, chúng trông như thế này:

-rwsr-xr-- 1 user1 users 190 Oct 12 14:23 file.bin

Chúng tôi giả định rằng một người dùng user2trong nhóm userscố gắng thực thi file.bin. Nếu bit setuid không được đặt, điều này có nghĩa là cả RUID và EUID file.binđều bằng UID của user2. Nhưng vì bit setuid được đặt, điều này có nghĩa là RUID hiện bằng với UID của user2, trong khi EUID là UID của chủ sở hữu tệp , user1.

Câu hỏi của tôi là:

  1. Sự khác biệt giữa chủ sở hữu của tập tin và là rootgì? Có rootquyền như chủ sở hữu? Hoặc chúng ta sẽ cần một mục riêng trong danh sách quyền root?
  2. Sự khác biệt giữa RUID và EUID?
    • Theo tôi hiểu, RUID và EUID chỉ được áp dụng cho các quy trình. Nếu đó là trường hợp, tại sao họ có giá trị của id người dùng?
    • Nếu RUID là người dùng tạo quy trình và EUID là người dùng hiện đang chạy quy trình, thì câu đầu tiên của câu trả lời đầu tiên trong câu hỏi này không có ý nghĩa gì với tôi.
    • Tôi đã hiểu chính xác những gì setuid bit làm?

Câu trả lời:


35

Đây là những câu trả lời:

  1. rootluôn luôn truy cập đầy đủ vào các tập tin và thư mục. Chủ sở hữu của tệp thường có chúng, nhưng điều này không phải lúc nào cũng đúng. Ví dụ:

    -r-xr----- 1 user1 users 199 Oct 14 18:42 otherfile.bin
    

    user1chủ sở hữu ; tuy nhiên họ chỉ có thể đọcthực thi , nhưng rootvẫn có quyền truy cập đầy đủ ( rwx ) vào tệp.

  2. RUID là ID người dùng thực và nó không bao giờ (gần như) thay đổi. Nếu user2đăng nhập vào hệ thống, shell sẽ được khởi chạy với ID thực được đặt thành user2. Tất cả các quy trình họ bắt đầu từ shell sẽ kế thừa ID thực user2như ID thực của họ.

    EUID là ID người dùng hiệu quả , nó thay đổi cho các quy trình (không dành cho người dùng) mà người dùng thực thi đã đặt bit setuid .

    Nếu user2thực thi file.bin, RUID sẽ là user2và EUID của quá trình bắt đầu sẽ user1.

Hãy sử dụng trường hợp passwd:

-rwsr-xr-x 1 root root 45396 may 25  2012 /usr/bin/passwd
  • Khi user2muốn thay đổi mật khẩu , họ thực thi /usr/bin/passwd.

  • RUID sẽ là user2nhưng EUID của quá trình đó sẽ là root.

  • user2có thể sử dụng passwdđể thay đổi chỉ mật khẩu riêng của họ, vì trong nội bộ passwdkiểm tra RUID, và nếu nó không phải là root, hành động của họ sẽ được giới hạn mật khẩu thực của người dùng.

  • Điều cần thiết là EUID trở thành roottrong trường hợp passwdvì quá trình này cần phải ghi vào /etc/passwdvà / hoặc /etc/shadow.


Cảm ơn bạn! Bây giờ mọi thứ đã rõ ràng hơn. Tôi có một câu hỏi nữa, mặc dù. EUID chỉ thay đổi khi người dùng thực thi một quy trình có tập bit setuid? Hoặc nó có thể thay đổi cũng trong một tình huống khác? Và nếu vậy, tình huống đó là gì?
1956190

1
Tôi nghĩ không có cách nào khác ngoài việc thực hiện các quy trình có setuidbit được thiết lập.
jcbermu

3
Một quy trình đang chạy từ chương trình Set setidid (nghĩa là một quy trình có UID hiệu quả U UID thực) có thể đặt EUID trở lại RUID. Trong một số trường hợp, nó có thể chuyển đổi EUID qua lại giữa giá trị ban đầu của nó (nghĩa là chủ sở hữu của tệp chương trình) và RUID. Ngoài ra, nó có thể đặt RUID bằng EUID của nó. Tiết (Cont'd)
Scott

2
(Tiếp theo) ... quá trình Privileged (những người có euid = 0, aka root) có thể thiết lập euid và RUID các giá trị tùy ý (ví dụ, login, su, và sudocác chương trình làm điều đó). Nói chung, một khi một quy trình đặc quyền thay đổi UID của nó thành các giá trị khác không, nó không còn là đặc quyền và không thể trở rootlại. Xem các trang man setuid (2) , seteuid (2)setreuid (2) .
Scott

1
(Tiếp), Nó được giới thiệu là một bản hack để giải quyết một vấn đề, sau đó đã được giải quyết theo một cách rộng hơn. Nó có thể đã bị xóa khỏi Linux ngoại trừ thực tế là việc cắt tỉa như vậy sẽ phá vỡ các chương trình sử dụng nó. Michael Kerrisk, tác giả của Giao diện lập trình Linux , cho biết, trong phiên bản trang con người setfsuid (2) của mình , setfsuid()hiện tại không cần thiết và nên tránh trong các ứng dụng mới.
Scott
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.