Я настраиваю 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.