Tôi có thể tạo một tệp chỉ có thể truy cập được vào tập lệnh chứ không phải người dùng không?


11

Tôi có một người dùng có quyền truy cập hạn chế trên hệ thống (nghĩa là anh ta không phải là người sudoer); Hãy gọi anh ta là Bob .

Tôi có một tập lệnh hoặc tệp nhị phân mà tôi, người quản trị hệ thống tin tưởng và sẽ không gặp vấn đề gì khi chạy nó dưới quyền root; Hãy gọi kịch bản get-todays-passphrase.sh. Công việc của tập lệnh này là đọc dữ liệu từ tệp "riêng tư" (thuộc sở hữu của người dùng / nhóm không phải là Bob hoặc thậm chí root) /srv/daily-passphrasesvà chỉ xuất một dòng cụ thể từ tệp: dòng tương ứng với ngày hôm nay .

Người dùng như Bob không được phép biết mật khẩu của ngày mai, mặc dù nó được liệt kê trong tệp. Vì lý do này, tệp /srv/daily-passphrasesđược bảo vệ bởi quyền hạn Unix, vì vậy người dùng không phải root như Bob không được phép truy cập tệp trực tiếp. Tuy nhiên, chúng được phép chạy get-todays-passphrase.shtập lệnh bất cứ lúc nào, trả về dữ liệu "đã lọc".


Để tóm tắt ( phiên bản TL; DR ):

  1. Bob không thể đọc tệp được bảo vệ
  2. Kịch bản có thể đọc tệp được bảo vệ
  3. Bất cứ lúc nào, Bob có thể chạy tập lệnh có thể đọc tệp

Có thể làm điều này trong các quyền của tệp Unix? Hoặc nếu Bob bắt đầu một tập lệnh, tập lệnh sẽ luôn luôn phải chịu số lần chạy với cùng một quyền như Bob?

Câu trả lời:


13

Điều này thực sự phổ biến và khá đơn giản. sudocho phép bạn giới hạn các ứng dụng cụ thể mà người dùng có thể gọi. Nói cách khác, bạn không cần phải cung cấp cho họ tất cả gốc hoặc không có gì; bạn có thể cấp cho họ sudoquyền để chạy một lệnh cụ thể . Đây chính xác là những gì bạn muốn và là thông lệ rất phổ biến cho những việc như cho phép người dùng đẩy kho Git thông qua SSH và những thứ tương tự.

Để làm điều này, tất cả những gì bạn phải làm là thêm một dòng vào /etc/sudoersđó trông giống như

bob ALL=(root) NOPASSWD: /path/to/command/you/trust

(Phần NOPASSWD:này không bắt buộc, nhưng rất phổ biến trong tình huống này.) Tại thời điểm đó, bobcó thể gọi /path/to/command/you/trustqua sudo, nhưng không có gì khác.

Điều đó nói rằng, mang lại cho ai đó gốc rễ những gì chúng ta đang làm ở đây, có thể không hoàn toàn như những gì bạn muốn. Đáng chú ý, nếu có bất kỳ lỗ hổng nào trong kịch bản của bạn, bạn có nguy cơ để cho hộp của mình được root. Vì lý do đó, bạn thay vì có thể thích để tạo một người dùng đặc biệt để sở hữu tệp-tiếng nói đặc biệt, specialuser-Sau đó chowncác tập tin với họ, và có /etc/sudoerslàm bobđược mà người dùng đặc biệt. Trong trường hợp đó, dòng bạn thêm vào sudoerschỉ đơn giản là

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust

7
Tôi khuyên bạn không nên đi theo cách "root" - tạo một người dùng / nhóm đặc biệt cho mục đích này.
guntbert

Điểm tốt; Tôi sẽ gửi câu trả lời.
Benjamin Pollack

7

Lời nói đầu:

Như đã được chỉ ra trong các bình luận và vì những lý do được giải thích trong câu trả lời này , hạt nhân linux bỏ qua bit setuid / setguid khi xử lý một tập lệnh. Tôi sẽ không lặp lại câu trả lời của Benjamin mà thay vào đó sẽ thay thế tập lệnh bằng execabe để làm cho câu trả lời của tôi chính xác.


Câu trả lời ngắn: sử dụng setgid

Các bước chi tiết:

  1. Tạo một nhóm mới (ví dụ: readpass)
  2. Biến nhóm đó thành chủ sở hữu của tệp mật khẩu sudo chown :readpass thatfile
  3. Làm cho tập tin chỉ có thể đọc được bởi nhóm của nó sudo chmod g=r,o= thatfile
  4. Hãy thực thi của bạn sgid readpass:sudo chmod g+s thatfile

Bằng cách đó, tệp thực thi của bạn sẽ chạy với sự cho phép của nhóm sở hữu và do đó có thể đọc tệp.


2
Setgid và setuid không dễ thực hiện trên các tập lệnh, phải không?
muru

1
Bạn không thể tạo tập lệnh setgid trên Linux: bit setgid sẽ bị bỏ qua. Thay vào đó, thêm quy tắc sudo cho phép bob chạy thatfilevới nhóm readpass.
Gilles 'SO- ngừng trở nên xấu xa'
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.