Я использую 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?