Mungkin untuk memeriksa kemampuan sudo sebelum sudo'ing?

11

Saya sedang menulis program utilitas kecil. Saya ingin mencoba- sudomenjalankan sesuatu jika diperlukan.

Itu adalah: jika izin file tidak memungkinkan pengguna saat ini beroperasi pada file tertentu (dan sudoaturan akan mengizinkannya) Saya ingin utilitas saya sudomenjalankan -l sesuatu sebagai pemilik file.

Saya berharap untuk memeriksa kemampuan ini sebelumnya, karena saya lebih suka log sistem tidak mengisi dengan kebisingan dari sudoupaya yang gagal . Seperti sudoitu sendiri melaporkan kegagalan: "Insiden ini akan dilaporkan".

Jadi, saya berharap untuk memeriksa secara program: dapat user <x>dijalankan command <y>melalui sudo?

Inilah masalahnya: sementara /etc/sudoersberisi pemetaan itu, itu dimiliki oleh root dan tidak dapat dibaca oleh pengguna biasa.

Saya sedang mempertimbangkan memunculkan subproses untuk dijalankan sudo -l(yang menampilkan perintah yang dapat dijalankan oleh pengguna saat ini). Saya kemudian akan menguraikan output ini. Namun, ini agak rapuh. Outputnya berisi informasi yang saya inginkan, tetapi sepertinya dirancang untuk dibaca manusia (bukan untuk konsumsi terprogram). Saya tidak tahu apakah ada jaminan bahwa output akan mengikuti format yang sama di masa depan, atau di berbagai platform.

Apakah parsing sudo -loutput terprogram dianggap aman? Jika tidak, apakah ada opsi yang lebih baik, untuk menentukan sebelumnya apakah perintah sudo akan berhasil?


(latar belakang pada X / Y: Utilitas ini untuk digunakan oleh akun peran akses terbatas. Saya berharap beberapa pengguna lain secara efektif memilih untuk memungkinkan akun akses terbatas untuk beroperasi pada file mereka melalui aturan sudo. Namun, saya menang tahu sebelumnya siapa pengguna lain yang memiliki aturan sudo yang relevan)

Peter Martin
sumber
3
Saya sarankan Anda mengambil pendekatan yang sedikit berbeda. Alih-alih memiliki aturan per pengguna, mengapa tidak memiliki grup yang diizinkan untuk melakukan apa pun yang Anda inginkan. Dengan begitu, Anda cukup memeriksa apakah pengguna berada dalam grup. Apakah itu akan menjadi alternatif yang layak?
terdon

Jawaban:

13

Menurut halaman manual sudo:

 -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.

jadi ini akan mendidih

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

Seperti yang ditunjukkan oleh Muru, digunakan baik -U $USERatau -U $USERTOTESTatau tidak, tergantung pada kebutuhan Anda.

Archemar
sumber
Jika Anda bermaksud $USERberarti pengguna saat ini, Anda bisa melakukannya sudo -l <command>, tanpa -U $USER.
muru
Terima kasih - ini berguna. Satu hal yang saya perhatikan dalam menguji pendekatan ini adalah tampaknya tidak menangani kasus-kasus di mana aturan sudo telah diatur untuk memungkinkan SEMUA perintah dengan pengecualian tertentu, seperti (targetUser) ALL, !/usr/bin/foo .. dalam kasus itu sudo -l -u targetUser /usr/bin/foomasih muncul untuk output /usr/bin/foodan keluar dengan status 0. Namun, itu pada dasarnya cukup untuk pemeriksaan sederhana saya, dan mengalahkan parsing sudo -loutput yang lebih verbose .
Peter Martin