2009-09-30 38 views
9

Trên một hộp Linux, tôi muốn chạy tập lệnh Python làm người dùng khác.Chạy tập lệnh python với tư cách người dùng khác

Tôi đã thực hiện chương trình trình bao bọc trong C++ gọi tập lệnh, vì tôi đã nhận ra rằng quyền sở hữu chạy tập lệnh được quyết định bởi quyền sở hữu trình thông dịch python. Sau đó tôi thay đổi chương trình C++ thành một người dùng khác và chạy chương trình C++.

Thiết lập này dường như không hoạt động. Bất kỳ ý tưởng?

+0

Những người dùng khác của bạn không có quyền chạy 'python'? – Arkady

+2

Nó không phải là vấn đề chạy Python. Kịch bản lệnh cần làm những thứ cần có quyền nhất định. Tôi không muốn cung cấp cho tất cả người dùng những quyền đó. Kịch bản này hoạt động giống như một người cho phép kiểm soát, nhưng trước tiên kịch bản cần quyền truy cập ... – johannix

+0

@johannix Tôi cũng đã gặp vấn đề chính xác. Bạn có tìm thấy cách giải quyết nào không? – Anubis

Trả lời

4

Có vẻ như bạn muốn sử dụng setuid chút

+0

Hãy nhớ rằng điều này sẽ không thay đổi tất cả các biến môi trường của bạn. tức là '~ /' sẽ vẫn mở rộng thành '/ home/old_user /', điều này có thể gây ra một số rắc rối nữa trên đường. –

0

Sử dụng lệnh sudo.

Để chạy chương trình với tư cách người dùng, hệ thống phải "xác thực" người dùng đó.

Rõ ràng, root có thể chạy bất kỳ chương trình nào với bất kỳ người dùng nào và bất kỳ người dùng nào cũng có thể su cho người dùng khác có mật khẩu.

Chương trình sudo có thể được định cấu hình để cho phép một nhóm người dùng sudo một lệnh cụ thể làm người dùng cụ thể. Ví dụ, bạn có thể tạo một nhóm scriptUsers và một người dùng scriptRun. Sau đó, hãy định cấu hình sudo để cho phép bất kỳ người dùng nào trong số scriptUsers trở thành chỉ scriptRun CHỈ để chạy tập lệnh của bạn.

+0

Không thể sử dụng sudo, vì tập lệnh cần được người khác sử dụng. – johannix

1

Cung cấp cho những người dùng đó khả năng sudo su $dedicated_username và điều chỉnh các quyền trên hệ thống của bạn để $dedicated_user có đủ, nhưng không quá nhiều, quyền truy cập.

11

Bạn có thể thiết lập cho người dùng os.setuid(), và bạn có thể lấy uid với pwd. Giống như vậy:

>>> import pwd, os 
>>> uid = pwd.getpwnam('root')[2] 
>>> os.setuid(uid) 

Rõ ràng điều này chỉ hoạt động nếu người dùng hoặc thực thi có quyền làm như vậy. Chính xác làm thế nào để thiết lập mà tôi không biết. Rõ ràng nó hoạt động nếu bạn là root. Tôi nghĩ rằng bạn có thể cần đến cờ setuid trên Python thực thi, và điều đó sẽ để lại một lỗ hổng bảo mật WHOPPING. có thể đó là không thể chấp nhận nếu người dùng bạn thiết lập cũng là người dùng bị hạn chế chuyên dụng không thể làm bất cứ điều gì ngoại trừ bất cứ điều gì bạn cần làm.

Bảo mật Unix, dựa trên người dùng và thiết bị và công cụ, không phải là rất tốt hoặc thực tế và dễ dàng để lại lỗ hổng bảo mật lớn. Một tùy chọn an toàn hơn là thực sự làm kiểu máy khách-máy chủ này, vì vậy bạn có một con quỷ làm mọi thứ, và khách hàng nói chuyện với nó. Con quỷ sau đó có thể chạy với độ bảo mật cao hơn người dùng, nhưng người dùng sẽ phải cung cấp tên và mật khẩu khi họ chạy tập lệnh hoặc xác định chính họ bằng một số khóa công khai/riêng tư hoặc somesuch.

+0

Tôi đã sử dụng mã này trong tập lệnh chạy từ tập lệnh init của Ubuntu và không yêu cầu bit setuid trên tệp thực thi python. – EarlCrapstone

+0

Nó hoạt động mà không cần bit setuid nếu bạn là gốc hoặc sudo kịch bản. –

Các vấn đề liên quan