Làm thế nào để cơ chế ID-user-ID hoạt động trong Unix?


12

Ai đó có thể vui lòng giải thích cơ chế ID người dùng-set trong Unix không? Lý do đằng sau quyết định thiết kế này là gì? Nó khác với cơ chế id người dùng hiệu quả như thế nào?

Câu trả lời:


10

Bạn có thể biết các quyền đọc, ghi và thực thi thông thường đối với các tệp trong unix.

Tuy nhiên, trong nhiều ứng dụng, loại cấu trúc quyền này - ví dụ: cung cấp cho người dùng nhất định toàn quyền đọc một tệp nhất định hoặc không có quyền nào để đọc tệp - quá thô. Vì lý do này, Unix bao gồm một bit quyền khác, set-user-IDbit. Nếu bit này được đặt cho một tệp thực thi, thì bất cứ khi nào người dùng không phải là chủ sở hữu thực thi tệp, người dùng đó sẽ có được tất cả các đặc quyền đọc / ghi / thực thi của chủ sở hữu khi truy cập vào bất kỳ tệp nào khác của chủ sở hữu!

Để đặt bit ID người dùng đã đặt cho một tệp, hãy nhập

 chmod u+s filename

Hãy chắc chắn rằng bạn cũng đã thiết lập quyền thực thi nhóm khác; thật tốt khi có sự cho phép đọc theo nhóm khác. Tất cả điều này có thể được thực hiện với một tuyên bố duy nhất

 chmod 4755 filename

Nó cũng được gọi là UID đã lưu. Một tệp được khởi chạy có bit Set-UID, UID đã lưu sẽ là UID của chủ sở hữu tệp. Nếu không, UID đã lưu sẽ là UID thực.

Uid hiệu quả là gì?

UID này được sử dụng để đánh giá các đặc quyền của quy trình để thực hiện một hành động cụ thể. EUID có thể được thay đổi thành UID thực hoặc UID Superuser nếu EUID! = 0. Nếu EUID = 0, nó có thể được thay đổi thành bất cứ điều gì.

Thí dụ

Một ví dụ về chương trình như vậy là passwd. Nếu bạn liệt kê đầy đủ, bạn sẽ thấy rằng nó có bit Set-UID và chủ sở hữu là "root". Khi một người dùng bình thường, nói "mtk", chạy passwd, nó bắt đầu bằng:

Real-UID = mtk  
Effective-UID = mtk  
Saved-UID = root

Liên kết tham chiếu 1
Liên kết tham khảo 2


5

man credentialslà một nguồn thông tin tốt trong trường hợp này. Xem thêm nhiệm vụ này trên SO . Đối với giải thích lịch sử xem bài lưu trữ này .

Thay vì gọi "set UID" và "UID hiệu quả" là một cơ chế, toàn bộ khái niệm về UID nên được gọi như vậy. Lý do tồn tại của các UID khác nhau là những rắc rối khác nhau với sự phân tách đặc quyền. Ngay cả người dùng thông thường (không có đặc quyền) đôi khi cũng cần phải làm những việc (tài nguyên truy cập) mà chỉ người dùng đặc quyền mới có thể. Để đạt được điều này một cách dễ dàng, các chương trình có thể thay đổi UID của họ. Có 3 loại trong số này:

  • UID thực - UID sở hữu một quy trình

  • UID hiệu quả - UID một quy trình hiện đang chạy - điều này xác định khả năng thực tế của quy trình tại bất kỳ thời điểm cụ thể nào. Đây cũng là những gì pscho thấy bạn trong trường USER.

  • UID đã lưu - giữ chỗ được sử dụng để chuyển đổi qua lại giữa các UID thực và hiệu quả

Nhu cầu cuối cùng xuất phát từ thực tế là người dùng thông thường chỉ có thể chuyển đổi giữa ba thứ này và không có gì khác và một chương trình setuid thường cần biết bằng cách nào đó, ai là người dùng đã tải nó (cộng với UID thật không nên thay đổi vì Điều đó sẽ tạo ra mớ hỗn độn thậm chí còn lớn hơn).


1

mở rộng của mtk là một trong những tốt.

Các passwdví dụ là một trong những đặc quyền leo thang - passwd luôn chạy như là người chủ vì nó phải thay đổi file mà chỉ có root được phép thay đổi. Điều này quan trọng là việc thực thi passwd không dễ bị tràn bộ đệm, v.v., sao cho người dùng bình thường thông minh có thể đưa nó vào sử dụng mà không có ý định.

Một lý do khác là bảo vệ người dùng theo cách tương tự như bạn có thể sử dụng sunếu bạn đã đăng nhập bằng root - để giảm bớt hoặc hạn chế đặc quyền của bạn cho một tác vụ cụ thể, không leo thang chúng. Ví dụ: nếu tôi có quyền bắt đầu dịch vụ daemon không yêu cầu quyền truy cập vào nội dung của tôi và có nội dung riêng, đó là tất cả những gì nó cần (ví dụ: trình ghi nhật ký), chạy nó suid sẽ có nghĩa là nó chỉ có quyền truy cập vào nội dung đó và không phải của tôi hay bất cứ ai elses.

Lưu ý rằng có thể thiết lập uid theo lập trình ngay cả khi bit suid không được đặt trên tệp thực thi , tuy nhiên, điều đó sẽ không hoạt động để leo thang. Tức là, nếu bạn là người dùng bình thường và viết chương trình đặt uid tại một số điểm, chương trình đó không thể chuyển sang root. Apache hoạt động theo cách này, tôi tin. Nó thường được bắt đầu bằng root và có một quy trình sau đó cho phép trẻ em chuyển uid thành người dùng không thuộc quyền sở hữu (ví dụ: "httpd"). Các tiến trình con đó là những gì làm máy chủ web thực sự hoạt động.

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.