Назад | Перейти на главную страницу

SUDO NOPASSWD не работает с определенной командой

У меня сложная ситуация. Мне нужен пользователь nagios для выполнения определенной команды от имени другого пользователя jenkins - Однако эта команда работает, только если jenkins среда полностью загружена. В противном случае команда, которую я выполняю, не будет работать, поэтому мне нужно выполнить su - user введите команду.

Команда отлично работает при запуске от root:

/bin/su - -c "pm2 show proxy" jenkins

(Я получаю ожидаемый результат)

При запуске от пользователя nagios:

nagios@srv01:~$ sudo /bin/su -c "pm2 show proxy" jenkins
[sudo] password for nagios:

записи visudo, которые я пробовал:

nagios  ALL=(root) NOPASSWD: /bin/su - -c "pm2 show proxy" jenkins

nagios  ALL=(jenkins) NOPASSWD: /bin/su - -c "pm2 show proxy" jenkins

Ни одно из вышеперечисленных действий не работает, он все равно запрашивает пароль.

ЭТО РАБОТАЕТ, если я просто предоставлю nagios пользователь полный su разрешения:

nagios ALL=(root) NOPASSWD: /bin/su

^^ это работает, но НЕТ, не дает этому пользователю полных разрешений su.

Поскольку он работает, когда глобально разрешен su Я предполагаю, что это где-то в моем синтаксисе.

Редактировать - Чтобы обойти эту проблему, я просто ввел команду, которую хочу запустить в скрипте, и предоставил скрипту sudo. Однако это не идеально и добавляет дополнительный шаг в этот рабочий процесс. Лучше бы иметь возможность запускать команду напрямую с помощью sudo.

В качестве альтернативы вы можете использовать пакет python pudo: https://pypi.org/project/pudo

Монтаж:

user$ sudo -H pip3 install pudo # you can install using pip2 also

Ниже приведен фрагмент кода для использования в автоматизации Python для запуска cmds с правами root:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

Ниже приведен пример cmd для запуска cmd с правами root.

user$ pudo ls /root
Desktop  Downloads  Pictures  Music

Некоторые сложные команды не работают в файлах sudoers, по крайней мере, мне это никогда не удавалось. Для чего-то сложного я помещаю команду в сценарий оболочки и разрешаю ее в файле sudoers.

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

Если вам нужна среда входа в систему для jenkins, попробуйте использовать -i переключиться на sudo

-i [команда] Параметр -i (имитировать начальный вход в систему) запускает оболочку, указанную в записи базы данных паролей целевого пользователя, в качестве оболочки входа. Это означает, что файлы ресурсов для входа в систему, такие как .profile или .login, будут прочитаны оболочкой. Если команда указана, она передается в оболочку для выполнения с помощью параметра -c оболочки. Если команда не указана, выполняется интерактивная оболочка. sudo пытается перейти в домашний каталог этого пользователя перед запуском оболочки. Политика безопасности должна инициализировать среду минимальным набором переменных, аналогичным тому, который присутствует при входе пользователя в систему. В разделе Command Environment в руководстве sudoers (5) описано, как параметр -i влияет на среду, в которой выполняется команда. запускается, когда используется политика sudoers.

Так что-то вроде

sudo -u jenkins -i pm2 show proxy

Делай, что хочешь.