Разрешить сложную команду sudo в Debian Linux

13

Мне нужно разрешить определенную команду в окне Debian Linux для одного пользователя. Я пробовал это в /etc/sudoersфайле:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

Это не работает, как ожидалось. Если я запускаю команду как пользователь zabbix с sudo, она запрашивает пароль (хотя я указал эту NOPASSWDопцию).

Тем не менее, это работает:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get

Но имеет тот недостаток, что все подкоманды apt-getразрешены. Есть ли способ, как я могу это исправить, чтобы разрешить только определенную команду?

Даниил
источник

Ответы:

10

Я не согласен с Лейн. Хотя это будет работать, вам не нужно awkзапускаться от имени пользователя root. Мне было бы неудобно с этим, потому что вы могли бы атаковать awkкаким-то образом. В конце концов, это полный переводчик языка программирования.

Когда кто-то работает sudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}', они на самом деле работают, sudo /usr/bin/apt-get --print-uris -qq -y upgradeа затем отправляют / перенаправляют как вызывающий пользователь.

Попробуй это: zabbix ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade

Кстати, нет ничего плохого в том, чтобы поместить это в скрипт, как это делает Lain, и вы все равно можете это сделать. Я бы просто избегал запуска awk от имени root, если это возможно.

user606723
источник
1
Вы правы, но если сценарий небезопасен, тогда не имеет значения, что в нем, он может быть перезаписан, и мир - ваша устрица. Если сценарий безопасен, то и его содержимое тоже безопасно.
user9517 15.02.13
25

Вы, вероятно, недовольны тем, как перенаправление взаимодействует с sudo. Перенаправление выполняется у вызывающего пользователя, а не привилегированного пользователя. Возможно, вам будет проще заключить команду в сценарий, а затем разрешить пользователю zabbix запускать этот сценарий, например:

#!/bin/bash
/usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

набор sudoers как

zabbix  ALL=NOPASSWD: /path/to/script

Теперь весь сценарий будет запускаться от имени привилегированного пользователя, а не только от конкретной команды apt-get. Убедитесь, что пользователь zabbix не может писать в скрипт.

user9517
источник
1
Кто-то, возможно, может исправить меня, если sudo уже позаботится об этом (я, кажется, вспоминаю о проблемах с непередаваемыми переменными env), но я бы посоветовал сделать awk и wc их полными путями в качестве общей лучшей практики для сценариев, чтобы пользователь мог не экспортируйте PATH = ~ user / bin: $ PATH и вставляйте все команды, которые хотите, в скрипт под названием awk (или wc) в ~ user / bin
Foon
@Foon: я думаю, ты путаешь sudo с cron.
user9517 15.02.13
1
Это не смущает, но superuser.com/questions/232231/… действительно указывает на то, что sudo предотвращает манипуляции с PATH (и LD_LIBARRAY_PATH по умолчанию)
Foon
Я сделал что-то похожее только для suid'd вызывающий скрипт и сделал его доступным для записи только root. Проверьте, работает ли он для пользователя с разрешениями 711, и они даже не увидят, что он делает, чтобы попытаться обойти его.
Крис К