Một tập tin muốn thuộc về hai người dùng. Làm sao? Liên kết cứng không thành công


32

Hai chương trình setuid /usr/bin/bar/usr/bin/bazchia sẻ một tệp cấu hình foo. Chế độ của tệp cấu hình là 0640, vì nó chứa thông tin nhạy cảm. Một chương trình chạy như bar:bar(nghĩa là, như thanh người dùng , thanh nhóm ); cái khác như baz:baz. Thay đổi người dùng không phải là một lựa chọn và thậm chí thay đổi nhóm sẽ không được ưa thích.

Tôi muốn liên kết cứng các tập tin cấu hình duy nhất như /etc/bar/foo/etc/baz/foo. Tuy nhiên, điều này không thành công vì tập tin phải, theo như tôi biết, thuộc hoặc root:barhoặc root:baz.

Giải pháp tiềm năng: Tạo một nhóm mới barbazcó thành viên barbaz. Hãy foothuộc về root:barbaz.

Đó trông giống như một giải pháp khá nặng tay với tôi. Không có cách nào gọn gàng hơn, đơn giản hơn để chia sẻ tập tin cấu hình foogiữa hai chương trình?

Hiện tại, tôi đang duy trì hai bản sao giống hệt của tệp. Điều này hoạt động, nhưng rõ ràng là sai. Điều gì sẽ đúng?

Để biết thông tin: Tôi có ít kinh nghiệm với các nhóm Unix và không có nhóm nào với setgid (2).


Câu hỏi thường được thực hiện theo từng giai đoạn. Trong trường hợp cụ thể của tôi, hai chương trình tình cờ là Exim4 và Dovecot, các chương trình xử lý thư có thể chia sẻ mật khẩu và chứng chỉ TLS.
THB

8
giải pháp Ubuntu (& tôi nghĩ Debian) cho ssl-certnhóm này là nhóm, barbaznhóm của bạn khá nhiều . Tiêu chuẩn là đặt tất cả các khóa riêng được sở hữu bởi ssl-certnhóm và đặt các UID được liên kết với các chương trình cần truy cập chúng vào nhóm đó.
abligh

1
@ableigh: Thú vị. Hệ thống của tôi là Debian 8 jessie. Rõ ràng, tồn tại một gói ssl-certcó tập lệnh postinst, khi cài đặt, tạo ra nhóm mà bạn nói. Tôi đã không nhận thức được ssl-cert. Apache2 (được cài đặt trên máy chủ của tôi) khuyến nghị ssl-cert . Các gói Exim và Dovecot khác nhau thì không, nhưng Postfix (không được cài đặt trên máy chủ của tôi) phụ thuộc vào ssl-cert. Do Apache, máy chủ của tôi không có nhóm ssl-cert , nhưng nhóm này chưa có thành viên. Cảm ơn vì lời khuyên.
THB

5
Làm cho các chương trình setgid, không setuid. Các chương trình Setuid là một ý tưởng tồi bởi vì nếu chúng bị xâm phạm, nhị phân có thể được thay thế, tạo ra một con ngựa trojan. (Ngoại lệ: gốc setuid, vì ở đó bạn không có lựa chọn nào khác.)
Gilles 'SO- ngừng trở nên xấu xa'

1
Liệu wiki.dovecot.org/HowTo/EimumAndDovecotSASL có giải quyết được tình huống cụ thể của bạn không?
MvG

Câu trả lời:


50

Bạn có thể sử dụng ACL để mọi người trong cả hai nhóm có thể đọc được tệp.

chgrp bar file
chmod 640 file
setfacl -m g:baz:r-- file

Bây giờ cả hai barbazcác nhóm có thể đọc các tập tin.

Ví dụ: đây là một tệp thuộc sở hữu của bin: bin với chế độ 640.

$ ls -l foo
-rw-r-----+ 1 bin bin 5 Aug 17 12:19 foo

+nghĩa là có một bộ ACL, vì vậy hãy xem nó.

$ getfacl foo
# file: foo
# owner: bin
# group: bin
user::rw-
group::r--
group:sweh:r--
mask::r--
other::---

Chúng ta có thể thấy dòng group:sweh:r--: có nghĩa là mọi người trong nhóm swehcó thể đọc nó.

Này, đó là tôi!

$ id
uid=500(sweh) gid=500(sweh) groups=500(sweh)

Và vâng, tôi có thể đọc các tập tin.

$ cat foo
data

23

Bạn có thể muốn xem xét lại các tuyên bố này:

Giải pháp tiềm năng: Tạo một nhóm barbaz mới có thành viên là barbaz. Hãy foothuộc về root:barbaz.

Đó trông giống như một giải pháp khá nặng tay với tôi. Không có cách nào gọn gàng hơn, đơn giản hơn để chia sẻ tập tin cấu hình foogiữa hai chương trình?

Tại sao nó nặng tay để tạo ra một nhóm mới? Làm như vậy có những ưu điểm sau so với ACL:

  • Mặc dù bạn đã đặt ra điều này như một giả thuyết với các lệnh /usr/bin/bar/usr/bin/baz, có liên quan rằng hai chương trình này có thể chia sẻ một tệp cấu hình. Điều này cho thấy rằng các chương trình có liên quan tự nhiên. Tạo một nhóm mới cho họ dường như mô tả mối quan hệ thực sự tồn tại và sẽ kích hoạt hành vi (chẳng hạn như quyền để đọc tệp cấu hình chung).
  • Giải quyết vấn đề này thông qua các nhóm có thể di chuyển tới mọi Unix, nghĩa là bạn có thể dựa vào cùng một cơ chế, hoạt động chính xác theo cùng một cách, trên bất kỳ hệ thống nào giống Unix hoặc Unix. ACL phức tạp hơn nhiều và tính di động có thể là một vấn đề.

Cá nhân tôi thấy ACL là giải pháp nặng tay ở đây và các nhóm là cách Unix truyền thống, đơn giản hơn.


16

Tôi nghĩ rằng đây sẽ là một cách sử dụng điển hình cho Danh sách điều khiển truy cập (ACL). Thêm cả người dùng (hoặc nhóm) vào ACL của tệp cấu hình:

/etc/foo  root:root rw-------  # Traditional Unix ownership and permission for foo
$ setfacl -m user: bar: rw- / etc / foo # Cho phép thanh người dùng đọc và viết foo
$ setfacl -m user: baz: rw- / etc / foo # Cho phép người dùng cũng đọc và viết foo

Bạn có thể phải cài đặt gói acl trước.


3

Tạo chế độ của tệp 0660(hoặc ngay cả 0440khi không cần viết) và quyền sở hữu bar:baz. Sau đó, một quá trình có thể truy cập tệp nhờ vào quyền của người dùng, còn lại nhờ vào quyền của nhóm. Điều này hoạt động ngay cả trên các hệ thống tập tin mà ACL không.


2

Tôi sẽ gửi cái này vì nó chưa được đề cập. Mặc dù đây có thể không phải là điều bạn muốn, nó có thể là câu trả lời cho những người khác có câu hỏi tương tự.

Cách "đám mây" "mới" là xử lý tất cả các cấu hình bởi một hệ thống quản lý cấu hình (chẳng hạn như đầu bếp , con rối hoặc ansible ). Sau đó, không có vấn đề gì khi bạn có hai tệp riêng biệt nhưng giống hệt nhau trên máy chủ, vì cả hai đều là bản sao của tệp duy nhất từ ​​hệ thống quản lý cấu hình.

Ưu điểm chính của việc thực hiện như thế này là cấu hình của bạn được phiên bản (cùng với tất cả các cấu hình còn lại của bạn) và việc triển khai một máy chủ giống hệt hoặc gần như giống hệt nhau trở nên dễ dàng đến mức có thể tự động hóa.

(Đối với bản ghi, vì bạn không sử dụng quản lý cấu hình, tôi sẽ đi với hệ thống nhóm như trong câu trả lời của @ drg).

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.