いい質問です。sudoは「管理者権限で実行できる便利コマンド」以上に、Unix系OSの権限モデルそのものを体現しています。
表の使い方 → 内部処理 → セキュリティ設計、の順で整理します。
1. sudoとは何か(仕様の要点)
sudo(superuser do)は、
一般ユーザーが、限定された範囲で、別ユーザー(主にroot)の権限でコマンドを実行する仕組み
です。
重要なのは:
rootに昇格しているわけではない
「そのコマンドだけ」別ユーザー権限で実行
2. 基本仕様(表の挙動)
sudo command
意味:
commandを root権限で実行
実行者はあくまで元のユーザー
よくあるオプション
| オプション | 意味 |
|---|
-u user | 指定ユーザーとして実行 |
-k | 認証キャッシュを無効化 |
-l | 実行可能なコマンド一覧 |
-i | rootのログインシェル |
3. sudoは裏で何をしているか(核心)
全体フロー(簡略)
sudoコマンド実行
実行者を特定
sudoersルールを確認
認証(パスワード)
権限切り替え
コマンド実行
ログ記録
4. ステップごとの内部処理
① sudoは「setuid root」の実行ファイル
$ ls -l /usr/bin/sudo-rwsr-xr-x 1 root root ...
s = setuidビット
実行時、一時的に 実効UID = root
重要:
sudo自体は最初からroot権限で動く
だから権限チェックが可能
② 実行ユーザーの特定
sudoは以下を取得します:
実UID(誰が実行したか)
実行TTY
実行コマンド
環境変数(制限付き)
これらは 監査ログ にも使われます。
③ sudoersファイルの評価
通常:
/etc/sudoers/etc/sudoers.d/*
例:
user ALL=(root) /bin/systemctl restart nginx
意味:
userは
全ホストで
rootとして
指定コマンドだけ実行可能
この評価は 厳密に順序付き で行われます。
④ 認証(なぜrootのパスワードではない?)
sudoは通常:
理由:
rootパスワードの拡散を防ぐ
誰が実行したかを保証
認証は:
⑤ 認証キャッシュ(5分ルール)
sudo lssudo systemctl restart nginx
内部的には:
⑥ 権限切り替えの瞬間
認証・許可後:
setresuid(target_uid, target_uid, target_uid)setresgid(...)
親シェルは影響を受けない。
⑦ コマンド実行
execve()で指定コマンドを起動
環境変数は sanitize される
⑧ ログ記録
以下が記録されます:
通常:
/var/log/auth.log/var/log/secure
5. sudoとsuの本質的な違い
| 項目 | sudo | su |
|---|
| 認証 | 自分のPW | 対象ユーザーのPW |
| 権限 | コマンド単位 | シェル全体 |
| ログ | 詳細 | 乏しい |
| 制御 | 細かい | 粗い |
sudoは 「最小権限の原則」 を実装した仕組み。
6. セキュリティ設計上の思想
sudoは:
root権限を「貸す」のではない
root権限で“実行を代行”する
というモデルです。
そのため:
権限昇格攻撃が起きにくい
誰が何をしたか追跡可能
権限範囲を極小化できる
7. よくある誤解
❌ sudo = rootになる
→ ❌違う
→ ⭕ root権限で1コマンド実行
❌ sudoは安全だから何でも許可していい
→ ❌
→ NOPASSWD: ALL はほぼ root配布と同義
8. まとめ(要点だけ)
sudoは setuid root プログラム
実行時だけ 一時的に権限切替
ルール・認証・ログがセット
「管理を安全に分配する」ための仕組み
この記事へのコメント