web-dev-qa-db-ja.com

SudoがPATHを変更するのはなぜですか?

これは、Sudoを使用しないPATH変数です。

$ echo 'echo $PATH' | sh 
/opt/local/Ruby/bin:/usr/bin:/bin

これは、Sudoを使用したPATH変数です。

$ echo 'echo $PATH' | Sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

私が知る限り、SudoPATHをそのままにしておくことになっています。どうしたの?これを変更するにはどうすればよいですか? (これはUbuntu 8.04にあります)。

更新:私が見る限り、ルート変更PATHとして開始されたスクリプトはありません。

man Sudoから:

コマンドのスプーフィングを防ぐために、Sudoは、ユーザーのPATHでコマンドを検索するとき(一方または両方がPATHにある場合)、最後に ``。 ''および `` ''(両方とも現在のディレクトリを示す)をチェックします。 ただし、実際のP​​ATH環境変数は変更されず、Sudoが実行するプログラムに変更されずに渡されることに注意してください。

278
Michiel de Mare

これは 迷惑な機能機能 多くのディストリビューションでのSudoの。

Ubuntuでこの「問題」を回避するには、〜/ .bashrcで以下を実行します。

alias Sudo='Sudo env PATH=$PATH'

上記は$ PATH自体をリセットしないコマンドで機能することに注意してください。ただし、「su」は$ PATHをリセットするため、-pを使用して通知しないようにする必要があります。 I.E .:

Sudo su -p
232
pixelbeat

他の誰かがこれを横切って実行し、すべてのユーザーのすべてのパス変数の変更を無効にしたい場合。
コマンド:visudoを使用して、sudoersファイルにアクセスします。次の行がどこかに表示されるはずです。

デフォルトenv_reset

次の行に次を追加する必要があります

デフォルト!secure_path

secure_pathはデフォルトで有効になっています。このオプションは、sudoing時に$ PATHを何にするかを指定します。感嘆符は機能を無効にします。

117
Jacob

PATHは環境変数であり、デフォルトではSudoによってリセットされます。

これを行うには、特別な許可が必要です。

man Sudoから

 -E -E (環境の保持)オプションは、sudoers(5)のenv_reset 
オプションを上書きします)。 match-
 ingコマンドにSETENVタグがあるか、sudo-
 ers(5)。
でsetenvオプションが設定されている場合にのみ使用できます。
コマンドに設定する環境変数は、次の形式でコマンドラインに渡すこともできます
 VAR= value、例:
 LD_LIBRARY_PATH=/usr/local/pkg/lib。 command 
行で渡される変数は、1つの重要な例外を除いて、通常の環境変数
の変数と同じ制限に従います。 setenvオプションが
 sudoersに設定されている場合、実行するコマンドにSETENVタグが設定されているか、一致するコマンド
がALLの場合、ユーザーは過度にfor-[.____になる変数を設定できます。]入札。詳細については、sudoers(5)を参照してください。

使用例:

cat >> test.sh
env | grep "MYEXAMPLE" ;
^D
sh test.sh 
MYEXAMPLE=1 sh test.sh
# MYEXAMPLE=1
MYEXAMPLE=1 Sudo sh test.sh 
MYEXAMPLE=1 Sudo MYEXAMPLE=2 sh test.sh 
# MYEXAMPLE=2

更新

 man 5 sudoers:
 
 env_reset設定すると、Sudoは環境をリセットし、
 LOGNAME、Shell、USER、USERNAME、およびSudo_ *バリエーションのみを含むようにします。 
できる。 
がenv_keepおよびenv_checkリストに一致する呼び出し側の環境内の変数が追加されます。
 env_keepおよびenv_check 
リストのデフォルトの内容は、rootでSudoを実行すると表示されます
 -Vオプション。 SudoがSECURE_PATH 
オプションを使用してコンパイルされた場合、その値はPATH環境
変数に使用されます。このフラグはデフォルトでオンになっています。

そのため、これがコンパイルされているかどうかを確認する必要があります。

デフォルトでは ジェンツー

# ( From the build Script )
....
ROOTPATH=$(cleanpath /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin${ROOTPATH:+:${ROOTPATH}})
....
econf --with-secure-path="${ROOTPATH}" 
32
Kent Fredric

このバグはかなり前から存在しているようです!役立つと思われるバグの参照を以下に示します(サブスクライブ/投票、ヒント、ヒント...)。


Debianバグ#85123( "Sudo:SECURE_PATHはまだオーバーライドできません")(2001年から!)

このバージョンのSudoにはBug#20996がまだ存在しているようです。変更ログには、実行時に上書きできると書かれていますが、まだその方法を発見していません。

彼らはあなたのsudoersファイルに次のようなものを置くことに言及しています:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin"

しかし、少なくともUbuntu 8.10でそれを行うと、次のエラーが表示されます。

visudo: unknown defaults entry `secure_path' referenced near line 10

buntuのバグ#50797(「--with-secure-pathでビルドされたSudoには問題があります」)

さらに悪いことに、私が知る限り、sudoersファイルでsecure_pathを再指定することは不可能です。たとえば、ユーザーに/ optの下にあるものへの簡単なアクセスを提供したい場合は、Sudoを再コンパイルする必要があります。


はい。 needsは、再コンパイルせずにこの「機能」をオーバーライドする方法である必要があります。何よりも悪いのは、セキュリティの偏見があなたの環境に最適なものを教えてくれ、それからそれをオフにする方法を与えないことです。


これは本当に迷惑です。セキュリティ上の理由からデフォルトで現在の動作を維持するのが賢明かもしれませんが、ソースコードから再コンパイルする以外にそれをオーバーライドする方法があるはずです!多くの人がPATHの継承を必要としています。なぜメンテナがそれを調べていないのか、それは受け入れられる解決策を考え出すのは簡単だと思います。


私はこのようにそれを回避しました:

mv /usr/bin/Sudo /usr/bin/Sudo.orig

次に、以下を含むファイル/ usr/bin/Sudoを作成します。

#!/bin/bash
/usr/bin/Sudo.orig env PATH=$PATH "$@"

通常のSudoは、非セキュアパスSudoと同じように機能します


buntuバグ#192651(「Sudoパスは常にリセットされる」)

このバグの複製が元々2006年7月に提出されたことを考えると、効果のないenv_keepがどのくらいの期間動作していたかはわかりません。上記のようなトリックをユーザーに強制するメリットが何であれ、Sudoおよびsudoersのマニュアルページには、PATHを変更するオプションが事実上冗長であるという事実が反映されているはずです。

実際の実行を反映するようにドキュメントを変更することは不安定ではなく、非常に役立ちます。


buntuバグ#226595( "PATHを保持/指定できない")

PATHに追加の非stdバイナリフォルダーでSudoを実行できる必要があります。/etc/environmentに既に要件を追加しているので、Sudoでコマンドを実行するときにコマンドが見つからないというエラーが表示されたときは驚きました。

私はこれを無事に修正するために以下を試しました:

  1. Sudo -E」オプションの使用-動作しませんでした。私の既存のPATHはまだSudoによってリセットされました

  2. / etc/sudoersで「Defaults env_reset」を「Defaults !env_reset」に変更します-動作しませんでした(Sudo -Eと組み合わせた場合でも)

  3. / etc/sudoersのenv_reset(たとえば、「#Defaults env_reset」)のコメントを外します-動作しませんでした。

  4. 'Defaults env_keep += "PATH"'を/ etc/sudoersに追加しました-動作しませんでした。

明らかに-男のドキュメントにもかかわらず-SudoはPATHに関して完全にハードコーディングされており、ユーザーのPATHを保持することに関して柔軟性がありません。 Sudoを使用してルート権限でデフォルト以外のソフトウェアを実行できないため、非常に迷惑です。

17
Tyler Rick

これは私のために働いたようだ

Sudo -i 

これは、非須藤PATHを引き継ぎます

13
axsuul

実際には、SudoにPATHをリセットさせることが望ましいと思います。さもないと、ユーザーアカウントを侵害した攻撃者は、あらゆる種類のツールのバックドアバージョンをユーザーのPATHに配置し、Sudoを使用するときに実行されます。

(もちろん、SudoにPATHをリセットさせることは、この種の問題に対する完全な解決策ではありませんが、役立ちます)

これは実際にあなたが使用するときに何が起こるかです

Defaults env_reset

exempt_groupまたはenv_keepを使用せずに/ etc/sudoersで。

ルートにのみ役立つディレクトリ(/sbin/usr/sbinなど)をユーザーのパスに追加せずにSudoパスに追加できるため、これも便利です。 Sudoが使用するパスを指定するには:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"
11
Arnout Engelen
# cat .bash_profile | grep PATH
PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH

# cat /etc/sudoers | grep Defaults
Defaults    requiretty
Defaults    env_reset
Defaults    env_keep = "SOME_PARAM1 SOME_PARAM2 ... PATH"
4
daggerok

env_keep/etc/sudoersを編集するだけです

次のようになります。

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE"

最後にPATHを追加するだけなので、変更後は次のようになります。

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE PATH"

ターミナルを閉じてから再度開きます。

3
temp_sny

/ etc/sudoersの「Defaults env_reset」をコメントアウトするだけです

3
user297612

Secure_pathはあなたの友達ですが、secure_pathを免除したい場合は

須藤visudo 

そして追加

デフォルト値exempt_group = your_goup 

多数のユーザーを除外する場合は、グループを作成し、すべてのユーザーを追加して、exempt_groupとして使用します。もっと多くの男5 sudoers。

2
user378555

Sudoersが使用するディレクトリにファイルを移動することもできます。

    Sudo mv $HOME/bash/script.sh /usr/sbin/ 
1
LeGilles

openSUSEディストリビューションのコメントで推奨される解決策は、変更することを提案しています。

Defaults env_reset

に:

Defaults !env_reset

そして、おそらく次の行はコメントアウトする必要があります:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE    MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L    ANGUAGE LINGUAS XDG_SESSION_COOKIE"
1
inman320

/ etc/sudoersファイルの「Default env_reset」と「Defaults secure_path ...」の両方をコメントアウトしてください

1
user3622173

$ PATHは環境変数であり、$ PATHの値は他のユーザーと異なる場合があることを意味します。

システムにログインするとき、プロファイル設定により$ PATHの値が決定されます。

今、見てみましょう:

User       |        Value of $PATH
--------------------------
root                /var/www
user1               /var/www/user1
user2               /var/www/html/private

これらが異なるユーザーの$ PATHの値であるとします。これで、コマンドをSudoで実行しているとき、実際の意味ではroot userはそのコマンドを実行します。

端末でこれらのコマンドを実行することで確認できます:-

user@localhost$ whoami
username
user@localhost$ Sudo whoami
root
user@localhost$ 

という訳だ。あなたには明らかだと思います。

0
Deepak Dixit

ENV_SUPATHの定義によりsuまたはSudoを使用すると、PATHはリセットされます。ENV_PATHは/etc/login.defsで定義されます

0
Bradley Allen

えー、パスに何かを追加しないと、実際にはテストではありません。

 bill @ bill-desktop:〜$ ls -l /opt/pkg/bin
total 12 
-rwxr-xr-x 1ルートルート28 2009-01-22 18 :58 foo 
 bill @ bill-desktop:〜$ which foo 
/opt/pkg/bin/foo 
 bill @ bill-desktop:〜$ Sudo su 
 root @ bill-desktop:/ home/bill#which foo 
 root @ bill-desktop:/ home/bill#
0
BIll Broadley