最近、サーバーをUbuntu Server 12.04にアップグレードしました。以前は、11.04を実行していました。
それ以来、私はSudoを介してrootユーザーコマンドを実行するのに苦労しています。この例は次のとおりです。
> Sudo ufw status
Sudo: ufw: command not found
> Sudo su - root
> ufw status
Status: active
To Action From
-- ------ ----
OpenSSH LIMIT Anywhere
Ubuntu 11.04では、プレーンSudo ufw status
は正常に機能しましたが、Ubuntu 12.04ではコマンドが見つかりません。
これは、PATHが設定されていないという問題のようです(ufw
は/usr/sbin/ufw
にあります)。
私が理解しようとしているのは、Sudo <sbin command>
だけでルートのPATHが正しく設定されるように戻す必要があることです。
セキュリティ上の理由( Anders は 参照 である)に加えて、元のユーザーのPATH
を保持することも Least Astonishmentの原則 に準拠しています。
foo
というプログラムを実行するとしますが、root
として実行する必要があることがわかります。したがって、Sudo foo
を実行します。 Sudo foo
で実行されるプログラムがfoo
で実行されるプログラムと異なる場合は、foo
のroot
に異なるPATH
がある場合に発生します。 。これは、Sudo
を除き、root
がその後に置くものと同じことを行うという一般的な仮定と期待に根本的に違反します。
Sudo
prepended root
のPATH
をPATH
に保留すると、それが起こります。しかし、Sudo
appended root
からPATH
へのパスを想定します。これがSudo
の動作である場合、最初のbar
ログインシェル(Sudo -i
)をシミュレートするときにプログラムを実行できる場合(root
と呼ぶ) 、Sudo bar
で実行することもできます。しかし、あなた自身の(つまりbar
'sではない)パスに異なるroot
が存在する可能性があるため、この仮定は間違っています。
UbuntuのリリースごとにSudo
の動作が変化するのではなく、おそらくPATH
が変更された可能性があります。 /sbin
、/usr/sbin
、および/usr/local/sbin
をPATH
に追加すると、問題は解決します。 sbin
としてプログラムを実行するときに、PATHにroot
のみが必要な場合を除きます。その場合は、それについて別の質問を投稿することをお勧めします(ただし、これを達成するための1つの手法は Andersの答え で示唆されています)。
Sudo
のmanページ を調べましたか? セクションセキュリティに関する注意事項 では、Sudo
がPATH
変数をどのように使用するかについて説明しています。
PATH
は/etc/sudoers
で そこで変更されます になるため、 secure_path
を調べることもできます。設定は、ディレクトリ/etc/sudoers.d/
内のファイルでも実行できます。
Sudo
を新しいバージョンにアップグレードするときに発生する可能性のある/etc/sudoers.d/
への変更とは無関係になるため、/etc/sudoers
にファイルを作成してSudo
構成に変更を加えることをお勧めします。 visudo
コマンドを使用して、/etc/sudoers.d/
でファイルを作成および編集する必要があります。