Я использую 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
).
источник
sudo env SHELL=/bin/sh sh
Предоставляет ли в вашей системе приглашение / bin / sh, установленное в качестве переменной SHELL?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
не должно быть сохранено; у нас должен быть пользователь rootSHELL
.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
есть ошибка. Во-первых, обходной путь: я положил это в моем/etc/sudoers.d/zabbix file
:и теперь подкоманды вызваны с
zabbix_raid_discovery
работы.Патч для исправления этого будет в sudo 1.8.15. От сопровождающего Тодда Миллера:
источник
Provide default values for $SHELL, $TERM and $PATH if not set.
это:... if not set.
. Любое установленное значение будет сохранено с помощью sudo. Кто настраивает SHELL?Вопрос был в том, где, по моему мнению, была проблема, но оказалось, что проблема не в том, что происходит с переменной SHELL, а в том, что на самом деле делает sudo. Например:
Все идет нормально. ... но проблема в том, что sudo использует оболочку вызывающей стороны вместо вызываемой, в отличие от документации. Действительно, если я изменю свою оболочку, отредактировав / etc / passwd, вы увидите, что sudo следует за оболочкой вызывающей стороны, а не
SHELL
:Я не могу использовать,
sudo -i
потому что я не хочу имитировать начальный логин.sudo -s
будет работать, пока у меня есть правильная команда в файле sudoers. Тем не менее, ожидаемое поведение (как отражено в справочной странице: "The new environment contains the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_* variables
") для оболочки должно быть вызываемым. Если вы посмотрите наPATH
,HOME
,LOGNAME
иUSER
переменные для Судо ENV вы увидите вещи суперпользователя.SHELL
также должна быть оболочкой root.источник