CentOS 6.5でsudo-1.8.6を実行しています。私の質問は非常に単純です。SHELLがユーザーの環境からsudo環境に伝播するのを防ぐにはどうすればよいですか?
通常、人々は逆の方向に進んでいます-彼らは環境変数を保存したいのです。しかし、シェルが/sbin/nologinsudo経由でコマンドを実行しようとするユーザー「zabbix」という問題が発生しています。Sudoは/sbin/nologinrootがサブシェルを実行できないようにを維持しています。(更新:この部分は正しいですが、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。ただし、この時点では、スクリプトはsudoを介してrootとして実行されているため、前のユーザーの環境変数を含めないでください。
ここに私の/ etc / sudoersがあります:
デフォルトは必須です デフォルト!visiblepw デフォルトalways_set_home デフォルトenv_reset デフォルトenv_keep = "COLORS DISPLAY HOSTNAME 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がどこでもコマンドを実行できるようにする ルートALL =(ALL)ALL #includedir /etc/sudoers.d
そしてこれが私の/etc/sudoers.d/zabbixです:
デフォルト:zabbix!requiretty zabbix ALL =(ルート)NOPASSWD:/ tmp / doit
編集:もう少し情報:
sudoを実行するプロセスはzabbix_agentd、Zabbix監視ソフトウェアからのものです。/etc/zabbix/zabbix_agentd.d/userparameter_disk.confファイルには次のようなエントリがあります。
UserParameter = example.disk.discovery、/ usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discoveryPythonスクリプトです。私はこれを単に行うように変更しました:
print subprocess.check_output(['/ usr / bin / sudo'、 '-u'、 'root'、 '/ tmp / doit'])
/tmp/doit 単にこれを行います:
#!/ bin / sh 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 = root SUDO_USER = zabbix SUDO_UID = 497 USERNAME = root PATH = / sbin:/ bin:/ usr / sbin:/ usr / bin:/ usr / local / bin:/ usr / local / sbin MAIL = / var / mail / root PWD = / LANG = en_US.UTF-8 SHLVL = 1 SUDO_COMMAND = / tmp / doit HOME = / root LOGNAME = root SUDO_GID = 497 _ = / bin / env
そのSHELL行は本当に私を悩ませます。ファイルはrootが所有しているので、rootユーザーが作成していることがわかりますが、シェルは呼び出し元ユーザー(zabbix)からのものです。
env_deleteが、私は、問題の核心は、env_resetのデフォルトの動作があることであることに同意し...causes commands to be executed with a new, minimal environment.、我々はそうmanページによると、PAMを持つLinuxシステムを持っています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たが、適切なシェルがあります。おかげで、私は今回避策を持っています。問題は、なぜそれを含める必要があるのかということです。呼び出し元のシェルを渡すのは危険な(そして壊れた)ようですが、sudoを変更するように設定されている場所が見つかりません。私は走りましたfind /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;、そして、赤い旗を見つけません。文字列/etc/sudoersのみが含まれenv_ます。したがって、sudoersフラグが妨害しているとは思いません...
sudo env SHELL=/bin/sh shあなたのシステムのSHELL変数としてプロンプトで/ binに/ shのセットを提供?