Có thể kiểm tra khả năng sudo trước khi sudo'ing?


11

Tôi đang viết một chương trình tiện ích nhỏ. Tôi muốn nó cố gắng vượt qua sudomột cái gì đó nếu được yêu cầu.

Đó là: nếu quyền của tệp không cho phép người dùng hiện tại hoạt động trên một tệp cụ thể (và sudocác quy tắc sẽ cho phép nó) Tôi muốn tiện ích của tôi chuyển sang sudothứ gì đó với tư cách là chủ sở hữu của tệp.

Tôi hy vọng sẽ kiểm tra khả năng này trước đó, vì tôi thích rằng nhật ký hệ thống không lấp đầy tiếng ồn từ sudonhững lần thử thất bại . Như sudochính nó báo cáo khi thất bại: "Sự cố này sẽ được báo cáo".

Vì vậy, tôi hy vọng kiểm tra theo chương trình: có thể user <x>chạy command <y>qua sudo?

Đây là vấn đề: trong khi /etc/sudoerschứa ánh xạ đó, nó thuộc sở hữu gốc và không thể đọc được bởi người dùng thông thường.

Tôi đã xem xét việc sinh ra một quy trình con để chạy sudo -l(trong đó đưa ra các lệnh mà người dùng hiện tại có thể chạy sudo). Sau đó tôi sẽ phân tích đầu ra của điều này. Tuy nhiên, điều này có vẻ hơi mong manh. Đầu ra chứa thông tin tôi muốn, nhưng có vẻ như nó được thiết kế để con người đọc (không phải để tiêu thụ theo chương trình). Tôi không biết liệu có đảm bảo rằng đầu ra sẽ theo cùng một định dạng trong tương lai hoặc trên các nền tảng khác nhau hay không.

Là phân tích chương trình sudo -lđầu ra được coi là an toàn? Nếu không, có lựa chọn nào tốt hơn, để xác định trước liệu lệnh sudo có thành công không?


(nền tảng trên X / Y: Tiện ích này được sử dụng bởi tài khoản vai trò truy cập hạn chế. Tôi hy vọng một số người dùng khác chọn tham gia hiệu quả để cho phép tài khoản truy cập giới hạn hoạt động trên các tệp của họ thông qua quy tắc sudo. Tuy nhiên, tôi đã thắng Không biết trước những người dùng khác có quy tắc sudo phù hợp ở đâu)


3
Tôi khuyên bạn nên có một cách tiếp cận hơi khác. Thay vì có các quy tắc cho mỗi người dùng, tại sao không có một nhóm được phép làm bất cứ điều gì bạn muốn nó làm. Bằng cách đó, bạn chỉ cần kiểm tra xem người dùng có ở trong nhóm không. Đó sẽ là một sự thay thế tốt?
terdon

Câu trả lời:


13

Theo trang sudo man:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

vì vậy điều này sẽ sôi xuống

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Như đã chỉ ra bởi Muru, sử dụng một trong hai -U $USERhoặc -U $USERTOTESThoặc không có gì, tùy thuộc vào nhu cầu của bạn.


Nếu bạn dự định $USERcó nghĩa là người dùng hiện tại, bạn có thể làm sudo -l <command>mà không cần -U $USER.
muru

Cảm ơn - điều này rất hữu ích. Một điều tôi đã nhận thấy khi thử nghiệm phương pháp này là nó dường như không quan tâm đến các trường hợp quy tắc sudo đã được thiết lập để cho phép TẤT CẢ các lệnh với các ngoại lệ cụ thể, chẳng hạn như (targetUser) ALL, !/usr/bin/foo .. trong trường hợp đó sudo -l -u targetUser /usr/bin/foovẫn xuất hiện đầu ra /usr/bin/foovà thoát với trạng thái 0. Tuy nhiên, về cơ bản, nó đủ để kiểm tra đơn giản của tôi và đánh bại phân tích cú pháp sudo -lđầu ra dài dòng hơn .
Peter Martin
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.