これは、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
私が知る限り、Sudo
はPATH
をそのままにしておくことになっています。どうしたの?これを変更するにはどうすればよいですか? (これはUbuntu 8.04にあります)。
更新:私が見る限り、ルート変更PATH
として開始されたスクリプトはありません。
man Sudo
から:
コマンドのスプーフィングを防ぐために、Sudoは、ユーザーのPATHでコマンドを検索するとき(一方または両方がPATHにある場合)、最後に ``。 ''および `` ''(両方とも現在のディレクトリを示す)をチェックします。 ただし、実際のPATH環境変数は変更されず、Sudoが実行するプログラムに変更されずに渡されることに注意してください。
これは 迷惑な機能機能 多くのディストリビューションでのSudoの。
Ubuntuでこの「問題」を回避するには、〜/ .bashrcで以下を実行します。
alias Sudo='Sudo env PATH=$PATH'
上記は$ PATH自体をリセットしないコマンドで機能することに注意してください。ただし、「su」は$ PATHをリセットするため、-pを使用して通知しないようにする必要があります。 I.E .:
Sudo su -p
他の誰かがこれを横切って実行し、すべてのユーザーのすべてのパス変数の変更を無効にしたい場合。
コマンド:visudo
を使用して、sudoersファイルにアクセスします。次の行がどこかに表示されるはずです。
デフォルトenv_reset
次の行に次を追加する必要があります
デフォルト!secure_path
secure_pathはデフォルトで有効になっています。このオプションは、sudoing時に$ PATHを何にするかを指定します。感嘆符は機能を無効にします。
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}"
このバグはかなり前から存在しているようです!役立つと思われるバグの参照を以下に示します(サブスクライブ/投票、ヒント、ヒント...)。
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でコマンドを実行するときにコマンドが見つからないというエラーが表示されたときは驚きました。
私はこれを無事に修正するために以下を試しました:
「
Sudo -E
」オプションの使用-動作しませんでした。私の既存のPATHはまだSudoによってリセットされました/ etc/sudoersで「
Defaults env_reset
」を「Defaults !env_reset
」に変更します-動作しませんでした(Sudo -Eと組み合わせた場合でも)/ etc/sudoersの
env_reset
(たとえば、「#Defaults env_reset
」)のコメントを外します-動作しませんでした。'
Defaults env_keep += "PATH"
'を/ etc/sudoersに追加しました-動作しませんでした。明らかに-男のドキュメントにもかかわらず-SudoはPATHに関して完全にハードコーディングされており、ユーザーのPATHを保持することに関して柔軟性がありません。 Sudoを使用してルート権限でデフォルト以外のソフトウェアを実行できないため、非常に迷惑です。
これは私のために働いたようだ
Sudo -i
これは、非須藤PATH
を引き継ぎます
実際には、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"
# 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"
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"
ターミナルを閉じてから再度開きます。
/ etc/sudoersの「Defaults env_reset」をコメントアウトするだけです
Secure_pathはあなたの友達ですが、secure_pathを免除したい場合は
須藤visudo
そして追加
デフォルト値exempt_group = your_goup
多数のユーザーを除外する場合は、グループを作成し、すべてのユーザーを追加して、exempt_groupとして使用します。もっと多くの男5 sudoers。
Sudoersが使用するディレクトリにファイルを移動することもできます。
Sudo mv $HOME/bash/script.sh /usr/sbin/
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"
/ etc/sudoersファイルの「Default env_reset」と「Defaults secure_path ...」の両方をコメントアウトしてください
$ 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$
という訳だ。あなたには明らかだと思います。
ENV_SUPATHの定義によりsuまたはSudoを使用すると、PATHはリセットされます。ENV_PATHは/etc/login.defsで定義されます
えー、パスに何かを追加しないと、実際にはテストではありません。
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#