2 sudo #
ファイルの変更やスーパユーザのみが許可されているタスクを実行するために、多くのコマンドとシステムユーティリティは、root
として実行する必要があります。セキュリティ上の理由のため、および危険なコマンドが偶発的に実行されるのを回避するため、通常はroot
として直接ログインしないことをお勧めします。代わりに、通常の特権のないユーザとして、sudo
コマンドを使用し、昇格された特権付きでコマンドを実行することをお勧めします。
SUSE Linux Enterprise Serverでは、sudo
は、suと同様に機能するようデフォルトで設定されています。ただし、sudo
を使用することで、ユーザは、他のユーザの特権を自由に設定し、それらの特権を使用してコマンドを実行できるようになります。このコマンドを使用して、指定の特権を持つ役割を特定のユーザとグループに割り当てることができます。たとえば、users
グループのメンバーが、wilber
の特権でコマンドを実行できるようにすることができます。コマンドへのアクセス権は、コマンドオプションの指定を禁止するなどしてさらに制限できます。suでは、PAMを使用した認証で常にroot
パスワードを必要としますが、sudo
では、ユーザの資格情報を使用して認証するように設定できます。これにより、セキュリティがより強化されます。root
パスワードを共有する必要がなくなるからです。たとえば、users
グループのメンバーが、wilber
としてfrobnicate
コマンドを実行することを許可できますが、その際に、引数の指定を禁止する制限を付けることができます。このコマンドを使用して、指定の機能を持つ役割を特定のユーザとグループに割り当てることができます。
2.1 sudo
の基本的な使用方法 #
sudo
は簡単に使用できて、非常に強力なコマンドです。
2.1.1 単一コマンドの実行 #
標準ユーザとしてログインしている場合、コマンドの前にsudo
を追加することで、任意のコマンドをroot
として実行できます。その際、rootパスワードの入力が要求され、認証に成功すると、コマンドがroot
として実行されます。
tux >
id -un
1 tuxtux >
sudo id -un
root's password:2 roottux >
id -un
tux3tux >
sudo id -un
4 root
| |
入力時には、パスワードは表示されません(クリアテキストとしてだけでなく、黒丸としても表示されません)。 | |
| |
限られた時間に、 |
I/Oリダイレクトは、多くのユーザが期待している動作と異なります。
tux >
sudo echo s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission deniedtux >
sudo cat < /proc/1/maps bash: /proc/1/maps: Permission denied
昇格された特権で実行されるのはecho
/cat
バイナリのみで、リダイレクトは、ユーザのシェルでユーザ特権を使用して実行されます。2.1.2項 「シェルの起動」で説明しているようにシェルを起動することも、dd
ユーティリティを使用することもできます。
echo s | sudo dd of=/proc/sysrq-trigger sudo dd if=/proc/1/maps | cat
2.1.2 シェルの起動 #
すべてのコマンドの前にsudo
を追加するのは煩わしい場合があります。シェルはsudo bash
コマンドとして指定できますが、組み込まれたメカニズムのいずれかを使用してシェルを起動することをお勧めします。
sudo -s (<command>)
SHELL
環境変数で指定したシェル、またはターゲットユーザのデフォルトのシェルを起動します。コマンドを指定した場合は、コマンドが(-c
オプション付き)でシェルに渡されます。そうでない場合は、シェルが対話モードで実行されます。tux:~ >
sudo -i root's password:root:/home/tux #
exittux:~ >
sudo -i (<command>)
-s
と同様ですが、シェルをログインシェルとして起動します。つまり、シェルの起動ファイル(.profile
など)は処理され、現在の作業ディレクトリはターゲットユーザのホームディレクトリに設定されます。tux:~ >
sudo -i root's password:root:~ #
exittux:~ >
2.1.3 環境変数 #
デフォルトでは、sudo
は環境変数を伝達しません。
tux >
ENVVAR=test env | grep ENVVAR ENVVAR=testtux >
ENVVAR=test sudo env | grep ENVVAR root's password: 1tux >
空白の出力は、 |
この動作は、env_reset
オプションで変更できます。表2.1「有用なフラグとオプション」を参照してください。
2.2 sudo
の設定 #
sudo
は、さまざまな設定が可能な、柔軟なツールです。
誤ってsudo
からロックアウトした場合は、su -
とroot
パスワードを使用してルートシェルを取得してください。エラーを修正するには、visudo
を実行します。
2.2.1 設定ファイルの編集 #
sudo
向けの主なポリシー設定ファイルは、/etc/sudoers
です。ポリシー設定ファイル内のエラーが原因で、システムからロックアウトされてしまう可能性があるため、編集にvisudo
を使用することを強くお勧めします。このコマンドは、開いているファイルが同時に変更されるのを防ぎ、構文エラーがないかどうかも変更の保存前に確認します。
その名前が示唆するのとは異なり、EDITOR
環境変数を次のように設定して、vi以外のエディタを使用することもできます。
sudo EDITOR=/usr/bin/nano visudo
ただし、/etc/sudoers
ファイル自体はシステムパッケージで提供されるため、アップデート時に変更内容が失われてしまう可能性があります。そのため、カスタム設定は、/etc/sudoers.d/
ディレクトリ内のファイルに対して行うことをお勧めします。そこにあるファイルは自動的にインクルードされるからです。対象のサブディレクトリでファイルを作成または編集するには、次のコマンドを実行します。
sudo visudo -f /etc/sudoers.d/NAME
または、別のエディタ(nano
など)を使用します。
sudo EDITOR=/usr/bin/nano visudo -f /etc/sudoers.d/NAME
/etc/sudoers.d
内の無視されるファイル
/etc/sudoers.d
をインクルードするために使用される/etc/sudoers
の#includedir
コマンドでは、~
(チルダ)で終わるファイルや.
(ドット)を含むファイルが無視されます。
visudo
コマンドの詳細については、man 8 visudo
を実行してください。
2.2.2 基本的なsudoersの設定構文 #
sudoersの設定ファイルには、2種類のオプション(文字列とフラグ)があります。文字列には任意の値を含めることができますが、フラグはONかOFFのいずれかのみです。sudoersの設定ファイルの最も重要な構文構造を次に示します。
# Everything on a line after a # gets ignored 1 Defaults !insults # Disable the insults flag 2 Defaults env_keep += "DISPLAY HOME" # Add DISPLAY and HOME to env_keep tux ALL = NOPASSWD: /usr/bin/frobnicate, PASSWD: /usr/bin/journalctl 3
例外が2つあります。 | |
指定のフラグをONに設定するには、 | |
詳細については、2.2.3項 「sudoersのルール」を参照してください。 |
オプション名 |
説明 |
例 |
---|---|---|
targetpw
|
このフラグは、呼び出し元のユーザが、ターゲットユーザのパスワード(ON)( |
Defaults targetpw # Turn targetpw flag ON |
rootpw
|
設定すると、 |
Defaults !rootpw # Turn rootpw flag OFF |
env_reset
|
設定すると、 |
Defaults env_reset # Turn env_reset flag ON |
env_keep
|
|
# Set env_keep to contain EDITOR and PROMPT Defaults env_keep = "EDITOR PROMPT" Defaults env_keep += "JRE_HOME" # Add JRE_HOME Defaults env_keep -= "JRE_HOME" # Remove JRE_HOME |
env_delete
|
|
# Set env_delete to contain EDITOR and PROMPT Defaults env_delete = "EDITOR PROMPT" Defaults env_delete += "JRE_HOME" # Add JRE_HOME Defaults env_delete -= "JRE_HOME" # Remove JRE_HOME |
Defaults
トークンを使用することで、ユーザ、ホスト、およびコマンドのコレクションのエイリアスを作成することもできます。さらに、一連のユーザのみを対象としてオプションを適用することができます。
/etc/sudoers
設定ファイルの詳細については、man 5 sudoers
を参照してください。
2.2.3 sudoersのルール #
sudoersの設定のルールは非常に複雑な場合があるため、このセクションでは、基本的なルールのみを説明します。各ルールは、基本的なスキームに従います([]
はオプション部分を示しています)。
#Who Where As whom Tag What User_List Host_List = [(User_List)] [NOPASSWD:|PASSWD:] Cmnd_List
User_List
1つ以上の(
,
で区切られた)識別子。ユーザ名、%GROUPNAME
形式のグループ、#UID
形式のユーザIDを指定します。否定は、!
接頭辞で示せます。Host_List
1つ以上の(
,
で区切られた)識別子。(完全修飾された)ホスト名またはIPアドレスのいずれかを指定します。否定は、!
接頭辞で示せます。通常、Host_List
にはALL
を選択します。NOPASSWD:|PASSWD:
NOPASSWD:
の後に、CMDSPEC
と一致するコマンドを実行すると、パスワードは要求されません。デフォルトは、
PASSWD
です。NOPASSWDとPASSWDの両方が同じ行に存在する場合にのみPASSWDを明示的に指定する必要があります。tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_List
1つ以上の(
,
で区切られた)指定子。実行ファイルへのパスの後に、使用可能な引数を指定するか、何も指定しません。/usr/bin/foo # Anything allowed /usr/bin/foo bar # Only "/usr/bin/foo bar" allowed /usr/bin/foo "" # No arguments allowed
ALL
は、User_List
、Host_List
、およびCmnd_List
としても使用できます。
パスワードを入力しなくても、tux
がすべてのコマンドをrootとして実行できるようにするルールは次のとおりです。
tux ALL = NOPASSWD: ALL
tux
がsystemctl restart apache2
を実行できるようにするルールは次のとおりです。
tux ALL = /usr/bin/systemctl restart apache2
tux
がwall
をadmin
として引数なしで実行できるようにするルールは次のとおりです。
tux ALL = (admin) /usr/bin/wall ""
次のような構造は、
ALL ALL = ALL
Defaults targetpw
なしでは使用できません。そうしないと、だれでもroot
としてコマンドを実行できるようになってしまいます。
2.3 一般的な用途 #
簡単なセットアップやデスクトップ環境では、たいていの場合はデフォルトの設定でも十分ですが、カスタム設定を使用すると便利な場合もあります。
2.3.1 root
パスワードなしのsudo
の使用 #
これは、特殊な制限(「ユーザXは、root
」としてのみコマンドYを実行できる)がある場合は不可能なことです。それ以外の場合も、コマンドの実行権限にある程度の区別を付けることが推奨されます。慣例では、wheel
グループのメンバーは、すべてのコマンドをrootとしてsudo
で実行できます。
wheel
グループに自分自身を追加します。自分のユーザアカウントがまだ
wheel
グループのメンバーでない場合は、sudo usermod -a -G wheel USERNAME
を実行してログアウトした後、再度ログインして追加します。groups USERNAME
を実行して、変更が成功したことを確認します。呼び出し元のユーザのパスワード(デフォルト)を使用して認証します。
visudo
(2.2.1項 「設定ファイルの編集」を参照)を使用して/etc/sudoers.d/userpw
ファイルを作成し、次の文を追加します。Defaults !targetpw
新しいデフォルトのルールを選択します。
ユーザにパスワードの再入力を求めるかどうかによって、
/etc/sudoers
の特定行のコメントを解除し、デフォルトのルールをコメントアウトします。## Uncomment to allow members of group wheel to execute any command # %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL
デフォルトのルールにより厳しい制約を設けます。
/etc/sudoers
の、すべてを許可するルールをコメントアウトするか、削除します。ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!
警告: sudoersの危険なルールこのステップは忘れないでください。忘れると、「すべての」ユーザが「すべての」コマンドを
root
として実行できるようになってしまいます。設定をテストします。
sudo
を、wheel
のメンバーとして、またはメンバー以外として実行してみてください。tux:~ >
groups users wheeltux:~ >
sudo id -un tux's password: rootwilber:~ >
groups userswilber:~ >
sudo id -un wilber is not in the sudoers file. This incident will be reported.
2.3.2 X.Orgアプリケーションでのsudo
の使用 #
グラフィカルアプリケーションをsudo
で起動すると、次のエラーが発生します。
tux >
sudo xterm
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not set
YaSTによって、グラフィカルインタフェースの代わりにncursesインタフェースが選択されます。
sudo
で開始したアプリケーションでX.Orgを使用するには、DISPLAY
環境変数およびXAUTHORITY
環境変数を伝達する必要があります。これらの環境変数を設定するには、/etc/sudoers.d/xorg
ファイル(2.2.1項 「設定ファイルの編集」を参照)を作成して、次の行を追加します。
Defaults env_keep += "DISPLAY XAUTHORITY"
まだ設定されていない場合は、XAUTHORITY
変数を次のように設定します。
export XAUTHORITY=~/.Xauthority
これで、X.Orgアプリケーションを通常どおり実行できます。
sudo yast2
2.4 詳細情報 #
使用可能なコマンドラインスイッチに関する簡単な概要は、sudo --help
を実行して参照できます。解説およびその他の重要な情報はman 8 sudo
マニュアルページ、設定に関する説明はman 5 sudoers
マニュアルページで参照できます。