最近のsudoと環境変数

sudoの環境変数の扱い方が最近になって変わっていることに気付いた。最近といっても一〜二年はたっているかもしれない。

sudoを介してコマンド実行するとき、あらかじめ決められた環境変数以外は消し去されてしまう。このためたとえば次のようなコマンド実行は意図通りには動かない。

$ GEM_HOME=/tmp/GEM sudo gem install rails

従来、このようなときにはenvを使って回避というのが一つのやり方だったように思う。もちろんsudoersでenvの実行が許可されていなければならない。

$ sudo env GEM_HOME=/tmp/GEM gem install rails

sudo 1.6.9以降になると以下のような記述が可能となり、わざわざenvを使う必要がなくなった(バージョンは多少違うかもしれないが、少なくともDebian/etchの1.6.8p12ではこのような書き方はできない)。

$ sudo GEM_HOME=/tmp/GEM gem install rails

ただし、この書き方によって任意の環境変数を渡せるかどうかには条件がある。一つはsudo 1.6.9p8以降であること。もう一つは全コマンドを実行可能であること。

特定のコマンドの実行だけが許可されているユーザにおいては、通常の環境変数のフィルタリングルールが適用される。許可されない環境変数を与えようとするとエラーが起きてコマンドは実行されない。

もちろん全バージョンに共通してsudoersで明示的な許可があればそれで十分である。ここで述べた動作の変化はほぼデフォルトの設定のままで運用している環境に対して影響がある。