Khả năng cho một tập lệnh trên Linux


8

Nếu tôi muốn đặt một khả năng ( capabilities(7)), chẳng hạn như CAP_NET_BIND_SERVICEtrên tệp thực thi và tệp đó là tập lệnh , tôi có phải đặt khả năng ( setcap(8)) trên trình thông dịch bắt đầu tập lệnh đó không hoặc có đủ để đặt nó trên tệp tập lệnh không chinh no?

Lưu ý: câu hỏi liên quan đến Khoa học Linux 6.1 nói riêng, nhưng tôi nghĩ nó có thể được trả lời một cách khái quát.

Câu trả lời:


8

Khả năng thiết lập trên tập lệnh sẽ không hiệu quả. Đó là tình huống tương tự như không hoạt động setuidtrên kịch bản. Tương tự như trong trường hợp sau, đó là cách thực hiện cách execvexử lý shebang và lý do bảo mật đằng sau nó (để biết chi tiết, xem: Cho phép setuid trên các tập lệnh shell ).

Tôi nghĩ bạn có những lựa chọn này

  1. thiết lập các khả năng trên chính trình thông dịch (thực ra là một bản sao của nó)

    • bạn có một vấn đề ở đây là bất kỳ ai có khả năng thực thi nó đều sẽ chạy với các khả năng nâng cao đó (có thể thực thi một số tập lệnh tùy ý hoặc khởi động nó một cách tương tác)
  2. viết một trình bao bọc thực thi sẽ có logic mã hóa cứng để thực thi tập lệnh của bạn và đặt các khả năng mong muốn trên tệp thực thi này

    • đảm bảo rằng không ai có thể sửa đổi cũng như xóa / thay thế tập lệnh
    • vẫn bằng cách làm chrootngười ta có thể bỏ lỡ bao bọc như vậy

Trong cả hai trường hợp, bạn sẽ phải đảm bảo bộ khả năng sẽ tồn tại execvebằng cách đặt inheritablecờ. Bạn cũng có thể sử dụng pam_capphân phối libcapthường, để thực sự kích hoạt các khả năng mong muốn chỉ bằng cấu hình cho người dùng đã chọn.

Và nói chung, bạn muốn đảm bảo không ai có thể sửa đổi hành vi của trình thông dịch của bạn bằng cách thay đổi môi trường, vd. PYTHON_PATHhoặc một cái gì đó tương tự.

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.