maehachi08 Anything Blog

2013年06月09日
/etc/sudoersのenv_resetオプションについて少し勉強してみた

sudo、sudoersについてちょっと調べてみたでは、sudoについて自分なりに少し調べ、特定のユーザにsudo権限を持たせるための/etc/sudoersファイルへの記述方法について勉強しました

今回は、sudo実行時の環境変数に関わるenv_resetオプションとenv_keepオプション、env_checkオプションについて勉強します。

今回、勉強した内容としては、

env_resetオプションはsudo実行ユーザの環境変数を引き継がずに変身ユーザの環境変数を設定し直す。その後で、sudoを起動するユーザの環境にある変数のうち、env_checkやenv_keepオプションで指定された環境変数のリストにマッチするものが追加される

ということです。

env_resetオプションについて

CentOS6.4ではenv_resetオプションはデフォルトで有効です。
env_resetオプションはsudo実行ユーザが保持する環境変数を破棄し、変身ユーザのLOGNAME, SHELL, USER, USERNAME, SUDO_*環境変数を設定し直します。その後でさらに、sudoを起動するユーザの環境にある変数のうち、env_keepやenv_checkのリストにマッチするものが追加される。
sudoコマンドに-uオプションで変身ユーザを指定しない限り、変身ユーザはrootになります。

以下がCentOS6.4の/etc/sudoersの設定です。

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

env_keepオプションに環境変数を追加してsudo実行時に環境変数を引き継ぐ

sudo実行権限を持ったユーザの環境変数でsudo実行時にも引き継ぎたい場合はenv_keepオプションに記述します。既存行ではなく、新たにDefaults env_keep += "[ Valiable Name ... ]"として追記させた方が可読性がいいですね。

例えば、pachiユーザがANSWER環境変数を持つとしましょう。

$ id
uid=5000(pachi) gid=1000(worker) 所属グループ=1000(worker)

$ export ANSWER="0"

$ env | grep ANSWER
ANSWER=0

この状態でsudo権限でenvコマンドを実行してもANSWER環境変数は引き継がれていません。

$ sudo env | grep ANSWER

これはenv_resetオプションでsudo実行ユーザの環境変数は引き継がないので当然の結果です。
では、visudoコマンドで/etc/sudoersにsudo実行ユーザのANSWER環境変数を引き継ぐようにenv_keepオプションを追記します。

# visudo
Defaults    env_keep += "ANSWER"

そして、もう一度、pachiユーザでsudo権限でenvコマンドを実行すると、ANSWER環境変数が引き継がれています。

$ sudo env | grep ANSWER
ANSWER=0

これはenv_keepオプションによってANSWER環境変数が引き継がれたということです。

PATH環境変数はsecure_pathオプションでを引き継ぐ

sudo権限でコマンドやスクリプト等を実行する場合、パスが通っているかどうかということが気になりますよね

CentOS6.4ではデフォルトで、secure_pathオプションが有効です。secure_pathオプションが有効な場合、指定された値がsudo実行時にPATH環境変数として使用されます。この場合、env_keepオプションにPATHを追加しても効果はありません。もし、sudo実行時にsudo実行ユーザのPATH環境変数を引き継ぎたい場合は、secure_pathオプションを無効にすることでそれは可能です。
しかし、そうすると、どのユーザがsudo権限を行使してもsudo実行ユーザのPATH環境変数が引き継がれてしまいます。PATH環境変数はsecure_pathオプションで最低限のPATHを指定するのがよさそうに思います。