Можно ли проверить способность sudo перед sudo'ing?

11

Я пишу небольшую утилиту. Я хотел бы попытаться sudoзапустить что-нибудь, если потребуется.

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

Я надеюсь проверить эту возможность заранее, потому что предпочел бы, чтобы системные журналы не заполнялись шумом от неудачных sudoпопыток. Как sudoсам сообщает о неудаче: «Об этом инциденте будет сообщено».

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

Вот проблема: хотя оно и /etc/sudoersсодержит это отображение, оно принадлежит пользователю root и не доступно для чтения обычным пользователям.

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

sudo -lСчитается ли программный анализ вывода безопасным? Если нет, есть ли лучшие варианты, чтобы заранее определить, будет ли команда sudo успешной?


(справочная информация по X / Y: эта утилита предназначена для использования учетной записью роли с ограниченным доступом. Я ожидаю, что некоторые другие пользователи будут использовать эту учетную запись, чтобы разрешить учетной записи с ограниченным доступом работать с файлами по правилам sudo. Однако я выиграл заранее не знаю, у кого из этих пользователей есть соответствующее правило sudo)

Питер Мартин
источник
3
Я рекомендую вам использовать немного другой подход. Вместо того, чтобы иметь правила для каждого пользователя, почему бы не иметь группу, которая может делать то, что вы хотите, чтобы она делала. Таким образом, вы можете просто проверить, входит ли пользователь в группу. Это будет достойной альтернативой?
Terdon

Ответы:

13

Согласно странице руководства 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.

так что это будет сводиться к

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

Как указывает Муру, используйте либо -U $USERили, -U $USERTOTESTлибо ничего, в зависимости от ваших потребностей.

Archemar
источник
Если вы намеревались $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вывод.
Питер Мартин