Làm thế nào để các quyền Linux hoạt động khi một tiến trình đang chạy như một nhóm cụ thể?


12

Đây là điều mà tôi chưa thể tìm thấy nhiều thông tin vì vậy mọi sự trợ giúp đều được đánh giá cao.

Sự hiểu biết của tôi là như vậy. Lấy tập tin sau:

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1

Người dùng philkhông thể truy cập tệp này:

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied

Nếu philđược thêm vào admnhóm, nó có thể:

root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014

Tuy nhiên, nếu một quá trình được bắt đầu khi thiết lập một cách rõ ràng user:groupđể phil:philnó không thể đọc được file. Quá trình bắt đầu như thế này:

nice -n 19 chroot --userspec phil:phil / sh -c "process"

Nếu quá trình được bắt đầu như phil:adm, nó có thể đọc tệp:

nice -n 19 chroot --userspec phil:adm / sh -c "process"

Vì vậy, câu hỏi thực sự là:

Điều gì đặc biệt khi chạy một quy trình với một tổ hợp người dùng / nhóm cụ thể ngăn quá trình có thể truy cập các tệp thuộc sở hữu của các nhóm bổ sung của người dùng đó và có cách nào khác không?


Lưu ý shell không có gì để làm với nó: Quyền không được xử lý bởi shell. Nếu họ có thể lấy root bằng cách viết shell mới.
ctrl-alt-delor

Câu trả lời:


9

Một quá trình được chạy với một uid ang a gid. Cả hai đều có quyền được gán cho họ. Bạn có thể gọi chroot với userpec của người dùng và nhóm, trong đó thực sự người dùng không thuộc nhóm đó. Quá trình sau đó sẽ được thực hiện với người dùng uid và các nhóm gid đã cho.

Xem một ví dụ. Tôi có một người dùng được gọi uservà anh ta thuộc nhóm student:

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)

Tôi có một tập tin như sau:

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file

Anh ta không thể đọc nó:

user@host:~$ cat file
cat: file: Permission denied 

Bây giờ, tôi có thể thực hiện catquy trình trong ngữ cảnh của người dùng userVÀ nhóm root. Bây giờ, quá trình mèo có các quyền cần thiết:

root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents

Thật thú vị khi xem những gì idnói:

root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)

Hừm, nhưng người dùng userkhông thuộc nhóm đó ( root). Trường hợp nào idcó được thông tin của nó từ đâu? Nếu được gọi mà không có đối số, idsử dụng các cuộc gọi hệ thống getuid(), getgid()getgroups(). Vì vậy, bối cảnh quá trình của idchính nó được in. Bối cảnh đó chúng tôi đã thay đổi với --userspec.

Khi được gọi với một đối số, idchỉ cần xác định các bài tập nhóm của người dùng:

root@host:~$ chroot --userspec user:root / sh -c "id user"
uid=10298(user) gid=20002(student) groups=20002(student)

Cho câu hỏi của bạn:

Điều gì đặc biệt khi chạy một quy trình với một tổ hợp người dùng / nhóm cụ thể ngăn quá trình có thể truy cập các tệp thuộc sở hữu của các nhóm bổ sung của người dùng đó và có cách nào khác không?

Bạn có thể đặt bối cảnh quy trình bảo mật cần thiết để giải quyết bất kỳ nhiệm vụ nào mà quy trình cần thực hiện. Mọi quy trình đều có một bộ uid và gid mà anh ta điều hành. Thông thường quá trình "lấy" người dùng gọi uid và gid làm bối cảnh của mình. Với "takes" tôi có nghĩa là kernel, nếu không nó sẽ là một vấn đề bảo mật.

Vì vậy, thực sự không phải là người dùng, không có quyền đọc tệp, đó là quyền của quy trình ( cat). Nhưng quá trình chạy với uid / gid của người dùng gọi.

Vì vậy, bạn không cần phải ở trong một nhóm cụ thể để có một quy trình chạy với uid của bạn và gid của nhóm đó.


2
Một quy trình thường chỉ có thông tin đăng nhập của nhóm chính. Nó có thể đạt được thông tin đăng nhập của các nhóm thứ cấp, EUIDmột phần của cuộc gọi initgroups(3). Tuy nhiên, initgroups(3)là một hoạt động tương đối tốn kém, vì nó cần liệt kê tất cả các nhóm. Vì lý do này, các quy trình chỉ gọi initgroups(3)nếu họ có lý do cụ thể để làm điều đó.
lcd047

6

Sử dụng --userspectùy chọn trên chrootchỉ định người dùng và một nhóm duy nhất sẽ sử dụng khi chạy chroot. Để xác định các nhóm bổ sung, bạn cần phải sử dụng --groupstùy chọn là tốt.

Theo mặc định, các quy trình kế thừa các nhóm chính và nhóm bổ sung của người dùng đang chạy chúng, nhưng bằng cách sử dụng --userspecbạn đang nói chmodđể ghi đè lên đó bằng cách sử dụng nhóm duy nhất được chỉ định.

Tài liệu chi tiết về các quyền trong Linux có sẵn trong credentials(7)trang.


2

Khi bạn đăng nhập vào Linux, quá trình đăng nhập - sau khi xác minh bạn có thể đăng nhập với tư cách là phil - lấy uid của phil và các nhóm mà nó thuộc về, đặt chúng thành một quy trình bắt đầu làm vỏ của bạn. Các nhóm uid, gid và bổ sung là một tài sản của quá trình.

Bất kỳ chương trình nào sau đó bắt đầu sau đó, là hậu duệ của lớp vỏ đó và chỉ cần nhận một bản sao của các thông tin đó. * Điều này giải thích tại sao việc thay đổi quyền của người dùng không ảnh hưởng đến các quy trình đang chạy. Tuy nhiên, những thay đổi sẽ được chọn vào lần đăng nhập tiếp theo.

* Ngoại lệ là các chương trình có bit setuid hoặc setgid được đặt, sẽ có id người dùng hiệu quả khác nhau . Ví dụ này được sử dụng trong su (1) để nó có thể chạy với các rootđặc quyền ngay cả khi được thực thi bởi phil.

Sau khi bạn thêm philvào admnhóm, anh có thể chạy su phil, và susẽ -running như root- xác minh rằng ông thực sự cung cấp mật khẩu phil và sau đó hạ cánh anh ta vào một vỏ với uid, gid và các nhóm bổ sung phil thuộc về. Và vì điều này được thực hiện sau khi thêm người dùng vào nhóm, lớp vỏ đó đã có trong admnhóm.

Tôi không coi chroot (1) chương trình phù hợp nhất để chạy như một người dùng khác , nhưng chắc chắn nó đã hoàn thành công việc. Tham số --userspec phil:phillàm cho nó chạy với uid của philvà gid của phil. Không có nhóm bổ sung nào được đặt (mà bạn sẽ cung cấp --groups). Vì vậy, quá trình trẻ em không nằm trong admnhóm.

Một cách bình thường hơn để chạy quá trình của bạn như phil su phil -c "process". Khi sutải các nhóm uid, gid và bổ sung từ thông tin cơ sở dữ liệu người dùng, processsẽ có cùng thông tin đăng nhập mà người dùng hiện có.

Đây có thể là đăng nhập (1) , sshd, su, gdb hoặc các chương trình khác. Ngoài ra, nó có khả năng được quản lý thông qua các mô-đun pam.

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.