2012年12月30日日曜日

sudo した時の PATH

今回は sudo した時の PATH です。

sudo した時の PATH は /etc/sudoers ファイルの secure_path の値で上書きされます。

Ubuntu 12.04 では secure_path は /etc/sudoers ファイルですでに設定されています。
$ sudo cat /etc/sudoers | grep secure_path
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  • sudoers ファイルを変更する場合はもちろん visudo 使います。

Ubuntu 10.04 ではデフォルトの sudoers ファイルには設定されていないので手動で設定します。

secure_path が設定されていない場合は
$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
となります。この値がどこから来てるか調べてみると、
$ man sudo
... snip ...
       To prevent command spoofing, sudo checks "." and "" (both denoting current directory) last when searching for
       a command in the user's PATH (if one or both are in the PATH).  Note, however, that the PATH environment
       variable is further modified in Debian because of the use of the SECURE_PATH build option.
... snip ...
       -V          The -V (version) option causes sudo to print the version number and exit.  If the invoking user
                   is already root the -V option will print out a list of the defaults sudo was compiled with as
                   well as the machine's local network addresses.
... snip ...
Ubuntu を含む Debian 系では sudo をビルドする時に SECURE_PATH ビルドオプションを指定しているようで、sudoers ファイルで secure_path が設定されていない場合は SECURE_PATH ビルドオプションが有効になるっぽいです。
sudo を root ユーザーで -V オプションをつけて実行すると sudo コンパイル時のデフォルト値が表示されるとのことなので確認すると、
$ sudo sudo -V
... snip ...
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
... snip ...
これのようです。

また、sudoers ファイルで
Defaults        exempt_group="mygroup"
とすると、mygroup に属しているユーザーが sudo した場合は secure_path に影響されずに sudo した時のユーザーの PATH が sudo でそのまま使われました。

0 件のコメント:

コメントを投稿