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

Ограничение использования `sudo -s`

Я настраиваю Nagios на некоторых своих серверах Linux и столкнулся с небольшой проблемой. В check_ide_smart плагину требуется root-доступ к системе для запуска. Чтобы запустить его, я использую check_by_ssh плагин для ssh в учетную запись nagios на удаленном хосте, затем запустите check_ide_smart используя sudo.

Сначала я добавил следующие строки в /etc/sudoers чтобы программа работала:

nagios  ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_smart

Хотя это отлично работало при локальном запуске, у меня возникала проблема, когда он запускался из Nagios: TTY не создавался, что мешало работе плагина.

Я покопался на странице руководства для sudo и нашел параметр -s, который порождает оболочку и запускает там программу. Когда я пытался использовать sudo -s, У меня возникли проблемы с разрешениями, поскольку -s, по-видимому, изменяет команду на /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart, что запрещено файлом sudoers. Я попытался изменить файл sudoers, чтобы вместо этого использовать эту команду, но это не сработало, а использование кавычек является синтаксической ошибкой.

В конце концов я заставил его работать, используя следующую строку в /etc/sudoers:

nagios ALL=/bin/bash

Мне это кажется неправильным, поскольку я разрешаю пользователю nagios создавать корневую оболочку, с которой они могут делать что угодно.

На данный момент я подумал, что, возможно, если поместить команду в сценарий оболочки, для которой пользователь nagios имеет права только для чтения, это сработает, поэтому я создал сценарий оболочки:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin $@

К сожалению, мне так и не удалось получить переданные параметры ($@) для правильной работы с плагином, поэтому я не знаю, сработает ли это. Редактировать: Мне нужно было процитировать $@ чтобы он работал. Спасибо @derobert и @pjz. Я до сих пор не знаю, сработает ли это, так как я заставил его работать с помощью решения @Mike Arthur.

Есть ли способ получить sudo -s работать, не позволяя порождать корневую оболочку?

Ответ:

Добавлена ​​следующая строка в /etc/sudoers:

nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *

Обратите внимание на звездочку в конце; без него это не работает. Спасибо @Mike Arthur за ответ.

nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *

Это должно работать и допускать аргументы.

К вашему сведению, вам нужно указать $ @ в сценарии оболочки, чтобы он работал правильно:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin "$@"

$@ это волшебство. На странице руководства bash

@ Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, каждый параметр заменяется отдельным словом. То есть «$ @» эквивалентно «$ 1» «$ 2» ... Если раскрытие в двойных кавычках встречается внутри слова, расширение первого параметра соединяется с начальной частью исходного слова, а раскрытие последнего параметра присоединяется к последней части исходного слова. Когда нет позиционных параметров, «$ @» и $ @ заменяются на ничего (т. Е. Удаляются).

Кроме того, запуск bash не будет порождать pty; хотя я не понимаю, зачем вашему плагину nagios нужен терминал для работы. Не должно. Может быть, настоящая проблема заключается в дезинфекции среды sudo?

Вместо того, чтобы использовать sudo -s и запустив корневую оболочку, просто позвольте вашему пользователю nagios использовать sudo без tty, используя !requiretty. Ваш /etc/sudoers должно быть следующее:

# Allow Nagios extra privs
Defaults:nagios !requiretty
nagios ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_plugin

... что обеспечит прямой доступ к sudo без пароля и без tty. Вы можете оставить "check_ide_plugin" выключенным, если хотите, чтобы sudo доступ ко всем плагинам.

Мы также используем NRPE, который кажется немного безопаснее, чем check_by_ssh, но требует немного дополнительных настроек. Та же идея в / etc / sudoers, но просто поменяйте местами nagios с nrpe. :)

~ Томми

Попробуйте выполнить сценарий еще раз, но заключите $ @ в двойные кавычки:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin "$@"

Я не думаю, что можно использовать -s без создания корневой оболочки (при условии, что вам нужны привилегии root). Параметр -s предназначен специально для создания оболочки. Вот что означает -s. Из sudo (8):

-s [command]
    The -s (shell) option runs the shell specified by the SHELL
    environment variable if it is set or the shell as specified
    in passwd(5).  If a command is specified, it is passed to
    the shell for execution.  Otherwise, an interactive shell
    is executed.