suとsudo
su で root になったのに /sbin のコマンドが見つからない。ハイフンを付けなかっただけです。ここと、sudoers を直接編集してはいけない理由。この回の中心はこの2つです。
ハイフンの有無で、環境が入れ替わるかが決まる
ターミナル
su
su -
su - alice
su -c "systemctl status ssh" alice引数なしの su は root に切り替わりますが、環境変数は元のユーザーのものを引き継ぎます。カレントディレクトリも変わりません。PATH が一般ユーザーのままなので /sbin 配下のコマンドが見つからず command not found に悩まされる、というのが典型的な症状です。
ハイフンを付けた su - はログインシェルとして起動します。対象ユーザーの .bash_profile や .profile が読み込まれ、PATH も HOME も対象ユーザーのものに切り替わり、カレントディレクトリはそのユーザーのホームになります。su -l や su --login も同じ意味です。管理作業で root になるなら基本は su - です。
su - alice はそのユーザーとしてログインシェルを起動し、su -c "コマンド" は1つのコマンドだけを実行して元のシェルに戻ります。そして su は切り替え先ユーザーのパスワードを要求します。root になりたければ root のパスワードが要ります。
sudo は自分のパスワードで、範囲を限って借りる
sudo は発想が違います。実行者自身のパスワードを入力すると、あらかじめ許可された範囲で他のユーザー、既定では root の権限を借りてコマンドを1つ実行します。root のパスワードを配らずに管理作業を委譲でき、誰がいつ何を実行したかがログに残るのが利点です。
| 書き方 | 意味 |
|---|---|
sudo <cmd> | root の権限で1つのコマンドを実行 |
sudo -u alice <cmd> | alice の権限で実行 |
sudo -l | 自分に許可されているコマンドを一覧表示 |
sudo -i | root のログインシェルを起動する。su - に近い |
sudo -s | root のシェルを起動する。環境は概ね維持される |
sudo -k | パスワードのキャッシュを破棄する |
sudoers は visudo を通す
設定は /etc/sudoers に書きますが、このファイルをエディタで直接開いてはいけません。理由は文法エラーです。sudoers に文法エラーがあると sudo 自体が動かなくなり、root のパスワードを設定していない環境では誰も管理権限を取り戻せなくなります。
visudo はロックを取って一時ファイルを編集させ、保存時に文法検査を通ってからでないと本体に反映しません。エラーがあればその場で警告してやり直させます。visudo -c は文法検査だけを行い、-f でファイルを指定すれば任意のファイルを検査できます。
/etc/sudoers の末尾には通常 #includedir /etc/sudoers.d が書かれていて、/etc/sudoers.d/ 配下が読み込まれます。本体を触らずに設定を足したり消したりできるので、追加はこちらに置きます。追加ファイルを編集するときも visudo -f <パス> を通します。
sudoers の1行は3つに分かれる
プレーンテキスト
alice ALL=(ALL:ALL) ALL
bob ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
%sudo ALL=(ALL:ALL) ALL並びはユーザー、ホスト=(なれるユーザーとグループ)、コマンドの3つです。1つ目が対象で、先頭に % を付けるとグループを指します。2つ目の ALL= はこの設定が有効なホスト名で、単一サーバーなら ALL にします。丸括弧の中は誰の権限になれるかで、最後がその権限で実行できるコマンドです。コマンドは絶対パスで書きます。
NOPASSWD を付けると、そのコマンドに限りパスワード入力を省けます。ただしここを ALL にすると、そのアカウントを取られた時点で無条件に root を取られます。上の例のように、必要な1つのコマンドまで絞ってください。
管理者権限をまとめて与えるときは、Debian と Ubuntu では sudo グループ、Red Hat 系では wheel グループに入れるのが慣習です。
試験で狙われるところ
su は切り替え先のパスワード、sudo は自分のパスワードを要求します。ハイフンを付けない su は環境変数を引き継ぎます。sudoers は visudo を通します。理由は保存時の文法検査です。グループを指定するときは名前の先頭に % が要ります。