2015-09-08 19 views
50

Tôi đã biết id người dùng thực. Đây là số duy nhất cho người dùng trong hệ thống. Trong hệ thống của tôi, My uid làSự khác biệt giữa ID người dùng thực, ID người dùng hiệu quả và ID người dùng đã lưu

$ echo $UID 
1014 
$     

Hai chữ cái khác là viết tắt của cái gì. Và việc sử dụng id người dùng hiệu quả và id người dùng đã lưu là gì và chúng tôi sử dụng nó ở đâu trong hệ thống.

+0

FYI - cũng có id người dùng hệ thống tệp, như được nêu trên trang Wikipedia: https://en.wikipedia.org/wiki/User_identifier –

Trả lời

75

Sự khác biệt giữa id người dùng thực và hiệu quả được tạo bởi vì bạn có thể cần phải tạm thời nhận dạng danh tính của người dùng khác (hầu hết thời gian, sẽ là root, nhưng có thể là bất kỳ người dùng nào). Nếu bạn chỉ có một id người dùng, thì sẽ không có cách nào thay đổi lại id người dùng ban đầu của bạn sau đó (trừ việc sử dụng từ của bạn, và trong trường hợp bạn là root, sử dụng đặc quyền của root để thay đổi thành người dùng bất kỳ) . Vì vậy, id người dùng thực sự là người bạn thực sự (người sở hữu quy trình) và id người dùng hiệu quả là hệ điều hành xem xét quyết định liệu bạn có được phép làm điều gì đó hay không (hầu hết thời gian, có một số ngoại lệ).

Khi bạn đăng nhập, shell đăng nhập đặt cả id người dùng thực và hiệu quả vào cùng một giá trị (id người dùng thực) của bạn như được cung cấp bởi tệp mật khẩu.

Bây giờ, nó cũng xảy ra mà bạn thực hiện một chương trình setuid, vả lại chạy như một người dùng khác (ví dụ root) chương trình setuid là cũng phải làm một cái gì đó thay cho bạn. Cái này hoạt động ra sao?
Sau khi thực hiện chương trình setuid, nó sẽ có id thực của bạn (vì bạn là chủ sở hữu quy trình) và id người dùng có hiệu lực của chủ sở hữu tệp (ví dụ root) vì nó được thiết lập.

Chương trình thực hiện bất kỳ phép thuật nào cần thực hiện với đặc quyền superuser và sau đó muốn thực hiện điều gì đó nhân danh bạn. Điều đó có nghĩa là, cố gắng làm điều gì đó mà bạn không nên làm sẽ không thành công. sao làm được vậy? Vâng, rõ ràng bằng cách thay đổi id người dùng hiệu quả của nó thành id người dùng thực sự!

Hiện tại chương trình setuid không có cách nào để chuyển đổi vì tất cả hạt nhân biết là id của bạn và ... id của bạn. Bang, bạn đã chết.

Đây là những gì mà id người dùng đã đặt được lưu.

+0

Để biết rõ hơn về điểm cuối cùng về id người dùng đã lưu, hãy xem [Wikipedia.] (Https://en.wikipedia.org/wiki/User_identifier#Saved_user_ID) – GDP2

+0

Bạn có thể chỉ cho tôi một số bài đọc nơi tôi có thể tìm thấy cuộc gọi nào kiểm tra Real uid thay thế không? cảm ơn bạn – mik1904

+0

@ mik1904: Điều quan trọng nhất mà bạn có khả năng sử dụng mà thực sự _checks_ UID thực là 'truy cập'. Đó là 99,9% của nó. Ngoài ra 'setfsuid' (nhưng hiếm khi cần), và một số funcs cấp rất thấp, và bạn cần (nhưng không được kiểm tra) ID người dùng thực để nhận/thiết lập các ưu tiên hoặc lên lịch, và các ID được chuyển tới các trình xử lý tín hiệu hoặc trả về 'wait' et al. _are_ ID thực. 'execve'không kiểm tra, nhưng _can fail_ nếu bạn đã thay đổi id người dùng thực. Ngoài ra 'fork' không kiểm tra, nhưng _can fail_ nếu bạn đạt đến hạn ngạch tối đa của quá trình trên UID thực. Google với 'site: man7.org' là bạn của bạn ở đây. – Damon

Các vấn đề liên quan