Можливо перевірити здатність до судо перед судоінгом?


11

Я пишу невелику корисну програму. Я хотів би, щоб спробувати sudoщось запустити, якщо потрібно.

Тобто: якщо дозволи на файл не дозволяють поточному користувачеві працювати з певним файлом (і sudoправила дозволяють це), я хотів би, щоб моя утиліта sudoщось запустила як власника файлу.

Я сподіваюся заздалегідь перевірити цю здатність, тому що я вважаю за краще, щоб журнали системи не заповнювали шум від невдалої sudoспроби. Як sudoсам повідомляє про помилку: "Про цей інцидент буде повідомлено".

Отже, я сподіваюся програмно перевірити: чи можна user <x>запустити command <y>через sudo?.

Ось проблема: хоча воно /etc/sudoersмістить це відображення, воно є кореневою власністю і не читається звичайними користувачами.

Я розглядав нерест для запуску підпроцесу sudo -l(який видає команди, які поточний користувач може запустити). Тоді я б проаналізував вихід цього. Однак це здається трохи крихким. Вихід містить інформацію, яку я хочу, але, схоже, вона була розроблена для того, щоб люди читали (не для програмного споживання). Я не знаю, чи є якась гарантія, що вихід буде дотримуватися того самого формату в майбутньому або на різних платформах.

Чи sudo -lвважається програмним розбір результатів безпечним? Якщо ні, чи є кращі варіанти, щоб заздалегідь визначити, чи вдасться команда sudo?


. не знаю заздалегідь, хто з цих інших користувачів має відповідне правило sudo)


3
Я рекомендую вам скористатися дещо іншим підходом. Замість того, щоб мати правила для кожного користувача, чому б не було групи, якій дозволяється робити все, що ви хочете, щоб це зробити. Таким чином, ви можете просто перевірити, чи є користувач у групі. Це було б гідною альтернативою?
terdon

Відповіді:


13

Згідно зі сторінкою 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.

так що це зводиться до

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

Як вказував Муру, використовуйте або -U $USERабо, -U $USERTOTESTабо нічого, залежно від ваших потреб.


Якщо ви призначені $USERдля позначення поточного користувача, ви можете просто зробити sudo -l <command>без -U $USER.
муру

Спасибі - це корисно. Одне, що я помітив під час тестування такого підходу, це те, що він, схоже, не піклується про випадки, коли правило sudo було встановлено, щоб дозволити ВСІ команди з особливими винятками, наприклад, (targetUser) ALL, !/usr/bin/foo .. у цьому випадку sudo -l -u targetUser /usr/bin/fooвсе ще видається /usr/bin/fooі виходить зі статусом 0. Все-таки цього в основному достатньо для моєї простої перевірки, і б'є синтаксичний аналіз більш багатослівного sudo -lвиводу.
Пітер Мартін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.