sudo/suの使い分け - 権限昇格の安全な方法
この記事で解決できること
sudoとsuの正しい使い分けが分かる- なぜ
suよりsudoが推奨されるのか、セキュリティ観点で理解できる sudoersの基本設定が自分でできる- よくある事故パターンと回避策が分かる
結論(実務の型)
- 1コマンドだけ root 権限が必要 →
sudo command - root として複数操作する(やむを得ない場合のみ) →
sudo -i - 別ユーザーとして1コマンド実行 →
sudo -u username command su -は root パスワードが必要。Ubuntu のデフォルトでは root パスワードが無効なため使えない
前提(対象環境)
- OS:Ubuntu(または Debian 系)
- 作業ユーザーが
sudoグループに追加済み
1. sudo と su の違いは何か?
sudo(substitute user do)と su(switch user)は、どちらも権限昇格のためのコマンドだが、仕組みが根本的に異なる。
| 項目 | sudo | su |
|---|---|---|
| 認証 | 自分のパスワード | 切り替え先のパスワード |
| root パスワード | 不要 | 必要(su - の場合) |
| 操作ログ | /var/log/auth.log に記録 |
記録が弱い |
| 権限範囲 | /etc/sudoers で細かく制御 |
root に全権限を渡す |
| Ubuntu デフォルト | 使用可能 | root パスワード無効で使えない |
sudo はユーザーごとに許可コマンドを限定できる点がセキュリティ上の強みだ。root パスワードをチームで共有する必要もない。
2. sudo の使い方
2-1. 基本形:1コマンドだけ実行
$ sudo command
例:
$ sudo apt update $ sudo systemctl restart nginx
2-2. root のログインシェルを起動する
$ sudo -i
sudo -i は root の環境変数と .profile を読み込んだ状態でシェルを起動する。長時間の root 作業が必要な場合に使う。
root シェルを起動したままにしないこと。作業が終わったら exit で抜ける。
2-3. 別ユーザーとして実行する
$ sudo -u username command
例:www-data ユーザーとしてコマンドを実行:
$ sudo -u www-data php /var/www/html/artisan cache:clear
2-4. 権限昇格の持続時間
sudo は初回認証後、デフォルト 15 分間はパスワードなしで再実行できる。タイムアウトを即座にリセットする場合:
$ sudo -k
現在の自分の sudo 権限を確認する:
$ sudo -l
3. su の使い方
3-1. su - でログインシェルを起動
$ su - [username]
- オプション(-l / --login と同義)は、切り替え先ユーザーのログイン環境(ホームディレクトリ・環境変数・PATH)を再現する。
$ su - deploy # deploy ユーザーのログインシェルを起動
3-2. su と su - の違い
$ su username # NG:現在の環境変数をそのまま引き継ぐ $ su - username # OK:ログイン時と同じ環境を再現
su username(- なし)は現在の環境変数を引き継ぐため、切り替え先のユーザー環境が正しく再現されない。特に PATH が混在して command not found になる事故が多い。
3-3. Ubuntu で su が使えない理由
Ubuntu のデフォルトでは root アカウントのパスワードが無効化されている。su - で root に切り替えようとすると認証に失敗する。
$ su - Password: su: Authentication failure # root パスワードが無効
Ubuntu で root シェルが必要な場合は sudo -i を使う。
4. なぜ sudo が推奨されるのか?
sudo が推奨される理由はセキュリティモデルの違いにある。
操作ログが残る: sudo を実行するたびに /var/log/auth.log に「誰が・何時・何のコマンドを実行したか」が記録される。
$ sudo grep sudo /var/log/auth.log | tail -3 May 31 10:30:01 hostname sudo: alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/usr/bin/apt update
最小権限の原則: sudoers でコマンドを個別に許可できるため、特定ユーザーに必要最低限の権限だけを付与できる。
root パスワード不要: チームメンバーに root パスワードを教える必要がない。個人の資格情報で認証が完結する。
5. sudoers の設定(visudo)
5-1. visudo で安全に編集する
/etc/sudoers は必ず visudo コマンドで編集する。visudo はファイルを保存する前に構文チェックを行い、設定ミスでシステムにアクセスできなくなる事故を防ぐ。
$ sudo visudo
/etc/sudoers を vi や nano で直接編集しないこと。構文ミスで sudo が動作不能になると、root パスワードが無効な Ubuntu ではリカバリが困難になる。
5-2. 基本的な書式
# ユーザー ホスト=(実行ユーザー) コマンド alice ALL=(ALL) ALL # NOPASSWD:パスワードなしで特定コマンドを許可 deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
5-3. グループに対して許可する
# %グループ名 で指定 %admin ALL=(ALL) ALL %deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl
5-4. drop-in ファイルで管理する(推奨)
大規模環境では sudoers 本体を直接編集せず、/etc/sudoers.d/ 配下にファイルを置く方法が推奨される。
$ sudo visudo -f /etc/sudoers.d/deploy
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
6. よくある事故パターン
NOPASSWD を全コマンドに設定する
# 危険:何でもパスワードなしで実行できる alice ALL=(ALL) NOPASSWD: ALL
開発環境の「楽さ」のために設定したまま本番に持ち込むと深刻なリスクになる。特定コマンドのみに限定すること。
visudo を使わずに sudoers を編集する
直接 vi /etc/sudoers で編集して構文ミスを起こすと、sudo が動作不能になる。visudo は保存時に構文チェックを行うため、必ず使うこと。
su username で環境変数が混在する
# NG:PATH が現在のシェルの設定を引き継ぐ $ su deploy # OK:deploy のログイン環境を再現 $ su - deploy