CentOS 6.5でsudo-1.8.6を実行しています。私の質問は非常に単純です。SHELLがユーザーの環境からsudo環境に伝播するのを防ぐにはどうすればよいですか?
通常、人々は逆の方向に進んでいます-彼らは環境変数を保存したいのです。しかし、シェルが/sbin/nologin
sudo経由でコマンドを実行しようとするユーザー「zabbix」という問題が発生しています。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
。ただし、この時点では、スクリプトは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_discovery
Pythonスクリプトです。私はこれを単に行うように変更しました:
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のセットを提供?