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

8

Я настраиваю 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, что мешало плагину работать.

Я покопался в man-странице для 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 за ответ.

Крис Либ
источник

Ответы:

7

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

Это должно работать и позволять аргументы.

Майк Маккуэйд
источник
Это не сработало. Смотрите мое редактирование для деталей.
Крис Либ
@Chris Lieb: вам придется изменить свой вызов с "sudo -s ..." на "sudo / bin / bash -c ...". Тогда это должно работать. У меня есть аналогичная установка, работающая здесь (не nagios, но похоже).
Мартин С.
Я исправил это, попробуйте сейчас (со звездочкой для подстановочных знаков).
Майк МакКуэйд
2

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

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

$@это магия Из справочной страницы bash,

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

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

derobert
источник
Этот плагин является единственным, который вызвал какие-либо проблемы. Ни один из других, которые я настроил до сих пор, не требует root-доступа, поэтому мне не нужно было использовать sudo для них. Из-за этого я не уверен, что проблема вызвана тем, что sudo не создает оболочку, или плагином check_ide_smart, требующим запуска оболочки.
Крис Либ
1

Вместо того, чтобы использовать 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 tho, просто поменяйте nagios на nrpe. :)

~ томми

TommyTheKid
источник
0

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

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin "$@"
pjz
источник
-1

Я не думаю, что возможно использовать -s без порождения корневой оболочки (при условии, что вам нужны привилегии root). Опция -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.
Кристофер Кашелл
источник
1
Оболочка выполняется, но его текущая задача - разрешить любой вызов /bin/bash, что также позволяет создавать интерактивную оболочку без каких-либо ограничений и без каких-либо ограничений на то, какие команды можно вызывать.
Мартин С.