41016


**環境**  
・CentOS7

* * *

**Q1. sudoコマンドで実行ユーザのPATHは、デフォルトではどうして引き継がれないのですか？**  
・sudoは「一般ユーザー」に対して「root権限」を付与するものだと思うのですが、デフォルトでPATHを引き継がない仕様になっている理由としては、何が挙げられるでしょうか？

**Q2. sudoコマンドで実行ユーザのPATHを引き継がない場合**  
・どういった不都合が発生する可能性があるのでしょうか？

**Q3. suコマンドの場合**  
・デフォルトでPATHを引き継ぐ、という認識で合っているでしょうか？  
・suコマンドを使っておけば問題ない？


CC BY-SA 3.0
2018-01-16T03:10:13.837
40988
2018-10-10T01:54:16.707
2018-10-10T01:54:16.707
3060
7886
question
linux centos sudo
sudoコマンドで実行ユーザのPATHを引き継がない場合、どういった不都合が起こる可能性があるか


PATHがと言うよりは、環境変数を引き継ぐかどうかになります。

su はデフォルトで環境変数を引き継ぐのに対し、sudo はデフォルトで引継ぎません。  
理由はよりセキュアな動作をデフォルトにしているためだと思います。

PATHが通らない場合の不具合は、コマンドが見つからないことだと思います。  
PATHを通すか、フルパスでコマンドを呼び出す必要があります。

suを使えば問題ないかどうかは、何を問題にしているか次第なので答えにくいですが、むかしは su が主流でしたので
そんな大きな問題はないと思います。ただ、パスワードをメンバー同士で共有する必要があるので それがセキュリティポリシー的にどうか？という話だとおもます。


CC BY-SA 3.0
2018-01-16T04:27:23.333
40991
2018-01-16T04:27:23.333
5008
40988
answer


何をもって不具合と呼ぶか、その定義次第なところがあります。それはセキュリティポリシーと言うか運用上の取り決めと言うか、その辺を「自分の属する組織で」決める必要があります。

普通、非特権ユーザの `PATH` にはシステム管理者専用のディレクトリは含めないものです。  
`/sbin` とか `/usr/sbin` とか `/usr/local/sbin` とか。  
一方で `sudo` なり `su` なり使うときは管理用コマンドが使いたいから、だと思われます。

例：  
ユーザー `john` の標準 `PATH` が `/usr/local/bin:/usr/bin:/bin`  
ユーザー `root` の標準 `PATH` が `/usr/bin:/bin:/usr/sbin:/sbin`  
であるとして

`john` が `sudo` したとき `/usr/local/bin/foo` を `sudo foo` で起動できるか否か  
`john` が `sudo` したとき `/sbin/fsck` を `sudo fsck` で起動できるか否か  
あたりの挙動がそういう設定で変化します。

A1. 管理用コマンド `/sbin/fsck` や `/usr/local/bin/visudo` を `sudo`
経由で起動したいのであれば、非特権ユーザの `PATH` には `/sbin` 等が通っていないのが普通なので、「引き継がない」＝特権ユーザの `PATH`
を使うほうが便利だからです。

A2. ウチの hpux では野良ビルドしたソフトを `/usr/local/bin` とか `/opt/なんとか/bin`
とかに入れています。そういうソフトはバグっていたり、悪意があるコードが混入しているかもしれません。そういうソフトを [フルパス入力なしで]
特権ユーザ権限で起動してよいかどうか？で決めることになります。非特権ユーザーの `PATH`
を引き継がない＝特権ユーザーがそういうコマンドを使いたいときはフルパスを入力する必要がある＝誤って起動させる可能性が低い＝安全、ということでしょう。

A3. `su` を使うべきか否かは先に書いたとおりポリシーで決めることです。


CC BY-SA 3.0
2018-01-16T04:50:04.870
40992
2018-01-16T04:50:04.870
8589
40988
answer


回答ではないのですが、環境変数 PATH の引き継ぎについて少し。

「デフォルト」という言葉の捉え方の問題かもしれませんが、`sudoers(5)` には以下の様に記述されています。

> **sudoers(5)**
>
> **env_reset**  
>  If set, sudo will run the command in a minimal environment containing the
> TERM, **PATH** , HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_*
> variables. Any variables in the caller's environment that match the env_keep
> and env_check lists are then added, followed by any variables present in the
> file specified by the env_file option (if any). The default contents of the
> env_keep and env_check lists are displayed when sudo is run by root with the
> -V option. **If the secure_path option is set, its value will be used for
> the PATH environment variable**. **This flag is on by default**.

おそらく、ほぼ全てのシステム・ディストリビューションで `secure_path` を設定しているので PATH
変数が引き継がれない様に見えているのではないかと思います(これを「デフォルト」と呼ぶのかもしれませんが）。

[code]

    $ lsb_release -d
    Description:    CentOS release 6.9 (Final)
    $ grep secure_path /etc/sudoers
    Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
    $ sudo sudo -V
            :
    
    Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
    
    $ echo $PATH
    /home/nemo/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/sbin:/usr/sbin
    $ sudo sh -c 'echo $PATH'
    /sbin:/bin:/usr/sbin:/usr/bin
    $ sudo PATH="$PATH" sh -c 'echo $PATH'
    /home/nemo/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/sbin:/usr/sbin
    
[/code]


CC BY-SA 3.0
2018-01-16T06:38:59.137
40999
2018-01-16T06:38:59.137
2020-06-17T08:14:45.997
-1
40988
answer


PATHを気にしない場合、

  * su/sudoを利用できるユーザーが不適切なPATHを設定している(またはさせられている)
  * 悪意あるユーザーがそのディレクトリにファイルを配置できる

という条件が揃うと、root権限で悪意のプログラムを実行させられる可能性があります。簡単な例だと、

  * `PATH`に/tmpを追加する
  * /tmp/shutdownという(悪意の)実行ファイルを用意する
  * sudo shutdownすると死ぬ

こうなります。

suは今どき使うべきではないというのがコンセンサスです。suはユーザーそのものを成り代わらせるためのものなので、

  * パスワードを共有することになる
  * シェルを明け渡すことになる(何でもできる)
  * suを実行したということしかログに残らない

などいろいろ不都合があります。頑張ればある程度制御できないこともないですが、sudo使う方が安全で確実です。


CC BY-SA 3.0
2018-01-16T14:15:58.700
41016
2018-01-16T14:15:58.700
5793
40988
answer