web-dev-qa-db-ja.com

SudoコマンドでPATHがリセットされるのはなぜですか?

イライラする頭とレンガの壁の接触の後、私はこれを発見しました:

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/steve/bin

$ Sudo bash
# echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

だが

$ Sudo bash -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin

$ Sudo bash -Ec 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin

私は 別の投稿 から収集し、Sudoパスは/etc/sudoers - しかし、なぜ?設定$PATH/root/.profile意味をなさないか、または上記の混乱のレシピだけです(つまり、実際のシェルを生成すると別の$PATHカジュアルなSudoコマンドで使用されているものから...)?

RHEL 6.4でbashを使用しています。

20
Steve Bennett

保護

Sudoには、これらのコマンドのいくつかを実行したときに気づく組み込みの保護機能があります。これらの保護は、安全な$PATHの実施など、多くのことを行っています。

/etc/sudoersファイルから:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

これは、Sudo -c ....コマンドを実行すると表示されます。この動作を無効にするには、-EスイッチをSudoに切り替えます。

注:一部のセットアップでは、-Eスイッチは機能しません。 「回避策」として、Sudo env "PATH=$PATH" bashを使用できます。これにより、現在の$PATHSudo環境に転送されます。

インタラクティブとログイン

このコマンドを実行すると:

$ Sudo bash

インタラクティブbashシェルとログインbashシェルを実行しました。これは、bashが構成ファイルをどのようにソースするかと関係があります。

  • インタラクティブ、別名bashまたはbash -i、ソース$HOME/.bashrc
  • ログイン、別名bash -l、ソース$HOME/.bash_profile

では、なぜ-Eが機能しないのですか?

これに対するTylerRickの回答SO質問 (SudoがPATHを変更する-理由?) は、理由に関する多くの理由をカバーしています。主なのは、通常Sudoは、Ubuntuの場合と同様にコンパイルされ、これらのスイッチは役に立たないものになります。Launchpadにはこれらに関して長い未解決の問題があり、これらは修正されていないため、Canonicalの方が優れていると認識しています。この動作をデフォルトのままにします。

14
slm

sudoersのルールがユーザーに特定のコマンドwibbleを実行することを許可する場合、PATHを安全な値に設定する必要があることがよくあります。彼自身のプログラムを植えることはできません。 wibbleが外部コマンドfooを呼び出し、PATHがリセットされなかった場合、ユーザーは~/bin彼のPATHの前に、リンク/bin/shから~/bin/fooを実行してからSudo wibble 呼び出す ~/bin/fooこれにより、任意のシェルコマンドを入力できます。

したがって、PATHのリセットは安全なデフォルトです。すべての場合に必要なわけではありませんが、デフォルト設定にすることははるかに簡単で安全です。

sudoersのルールがユーザーに任意のコマンドの実行を許可する場合、PATHをリセットしても直接的なセキュリティ上の利点はありません。間接的な利点があります。つまり、ユーザーが誤って有害な可能性のあるプログラムを含むPATHを設定した可能性があり、PATHをリセットすると、これらのプログラムが誤って呼び出されるリスクを回避できます。機能的な利点もあります。/usr/local/sbin/usr/sbinおよび/sbinコマンドをrootとして実行するが、通常のユーザーとしては実行しない場合。

Sudoを実行したときにパスがリセットされないようにするには、sudoersの除外グループに自分を追加します。

Defaults exempt_group+=stevebennet

ログインシェル(Sudo -IまたはSudo bash -lまたは他のメソッド)、シェルは通常.profileターゲットユーザーのホームディレクトリにあります。そのファイルはPATHを変更する可能性があります。

これはセキュリティ上の理由によるものです。 PATHは明確に定義されたものに設定され、ソースユーザーが持つ可能性のあるハッキングされたPATHには設定されません。

回避策の種類については https://superuser.com/questions/98686/passing-path-through-Sudo を参照してください。

1
jlliagre