Я использую sudo-1.8.6 на CentOS 6.5. У меня очень простой вопрос: как предотвратить распространение SHELL из среды пользователя в среду sudo?
Обычно люди идут другим путем - они хотят сохранить переменную среды. Однако у меня возникла проблема, когда мой пользователь "zabbix", чья оболочка /sbin/nologin
пытается выполнить команду через sudo. Sudo сохраняет /sbin/nologin
так, что root не может запускать подоболочки. (Обновление: эта часть верна, но это не переменная среды SHELL. Проблема заключается в том, что значение оболочки извлекается из / etc / passwd.)
Я включаю тест, который иллюстрирует проблему; это не мой реальный пример использования, но он просто показывает, что ОБОЛОЧКА вызывающего пользователя сохраняется. У меня есть программа, которая работает как пользователь zabbix
. Он вызывает /usr/bin/sudo -u root /tmp/doit
(программа работает как zabbix
демон, поэтому /sbin/nologin
оболочка в файле паролей не мешает этому). /tmp/doit
скрипт оболочки, который просто имеет:
#!/bin/sh
env > /tmp/outfile
(его режим 755, очевидно). В outfile
я могу видеть , что SHELL
есть /sbin/nologin
. Однако в этот момент скрипт запускается с правами root через sudo, поэтому в нем не должно быть переменных окружения предыдущего пользователя, верно?
Вот мой / etc / sudoers:
Значения по умолчанию requiretty Значения по умолчанию! Visiblepw По умолчанию always_set_home По умолчанию env_reset По умолчанию env_keep = "ЦВЕТА ОТОБРАЖЕНИЕ ХОЗЯЙКА HISTSIZE INPUTRC KDEDIR LS_COLORS" По умолчанию env_keep + = "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" По умолчанию env_keep + = "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" По умолчанию env_keep + = "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" По умолчанию env_keep + = "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" По умолчанию secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin ## Разрешить root запускать любые команды где угодно root ALL = (ALL) ALL #includedir /etc/sudoers.d
И вот мой /etc/sudoers.d/zabbix
:
По умолчанию: zabbix! Requiretty zabbix ALL = (root) NOPASSWD: / tmp / doit
Изменить: немного больше информации:
Процесс, запускающий sudo zabbix_agentd
, происходит из программы мониторинга Zabbix. В /etc/zabbix/zabbix_agentd.d/userparameter_disk.conf
файле есть запись, которая выглядит так:
UserParameter = example.disk.discovery, / USR / местные / бен / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discovery
скрипт Python Я изменил это, чтобы просто сделать это:
print subprocess.check_output (['/ usr / bin / sudo', '-u', 'root', '/ tmp / doit'])
/tmp/doit
просто делает это:
#! / Bin / ш env >> / tmp / outfile
Я запускаю следующее на своем Zabbix сервере, чтобы запустить /usr/local/bin/zabbix_raid_discovery
скрипт:
zabbix_get -s client_hostname -k 'example.disk.discovery'
Затем я проверяю /tmp/outfile
и вижу:
SHELL = / SBIN / NOLOGIN TERM = Linux USER = корень SUDO_USER = Zabbix SUDO_UID = 497 USERNAME = корень PATH = / SBIN: / бен: / USR / SBIN: / USR / бен: / USR / местные / бен: / USR / местные / SBIN MAIL = / вар / почта / корень PWD = / ЛАНГ = en_US.UTF-8 SHLVL = 1 SUDO_COMMAND = / TMP / DoIt НАЧАЛО = / корень LOGNAME = корень SUDO_GID = 497 _ = / Bin / окр
Эта SHELL
линия действительно беспокоит меня. Файл принадлежит пользователю root, поэтому я знаю, что он создается пользователем root, но оболочка от вызывающего пользователя ( zabbix
).
env_delete
, но я согласен суть проблемы заключается в том, что поведение по умолчанию env_reset У ...causes commands to be executed with a new, minimal environment.
нас есть система Linux с PAM, поэтому по странице человека, The new environment contains the ... SHELL ... (variable)
. Как вы можете видеть из моего /etc/sudoers
файла выше, мы не разрешаем SHELL
в env_keep
. Так SHELL
не должно быть сохранено; у нас должен быть пользователь root SHELL
.
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *
в свой /etc/sudoers/zabbix
файл, и он имеет надлежащую оболочку. Спасибо, теперь у меня есть обходной путь. Вопрос в том, зачем мне это включать? Передача SHELL вызывающей стороны кажется опасной (и неработающей), но я не могу найти места, где sudo настроен для ее изменения. Я бежал find /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
и не нахожу красных флажков; /etc/sudoers
содержит единственную env_
строку. Так что я не думаю, что есть флаг sudoers, вмешивающийся ...
sudo bash
должен запустить оболочку bash от имени пользователя root, и для него ДОЛЖНА быть установлена переменная SHELL в значение из / etc / password. Вы сообщаете, что SHELL устанавливается (или сохраняется как) /sbin/nologin
. Это проблема безопасности, оболочка, запускаемая root, не должна контролироваться переменной окружения, установленной пользователем. Это то, что вы должны исследовать.
sudo env SHELL=/bin/sh sh
Предоставляет ли в вашей системе приглашение / bin / sh, установленное в качестве переменной SHELL?