はじめに
Linuxで特権作業を行う際、私たちは当たり前のように sudo を使います。Windowsでそれに相当するのが「管理者として実行」であり、画面が暗転して現れる「ユーザーアカウント制御(UAC)」のダイアログです。
しかしこの2つは、「権限を昇格させる」という目的は同じでも、その仕組み(アーキテクチャ)は全く異なります。 この違いを理解していないと、Windowsのプロセス管理やセキュリティ設計の場面で確実に躓きます。
1. 概念の違い:ID の切り替え vs トークンのフィルタリング
最も重要な違いは 「誰として実行しているか」 です。
Linux の sudo:ID のスイッチ
sudo は一時的に別のユーザー(通常は root)に なりすます 仕組みです。
- プロセスの実効ユーザーID(EUID)が
0に書き換わります。 - 「自分」から「root」へ、アイデンティティそのものが切り替わります。
-
whoamiを実行するとrootと返ります。
Windows の UAC:トークンのフィルタリング
Windows の管理者アカウントは、ログインした瞬間に 2種類のアクセストークン を発行されます。
| トークン種別 | 用途 | 特権の状態 |
|---|---|---|
| 標準ユーザートークン | 通常操作(ブラウザ、エディタ等) | 特権が無効化(フィルタリング済み) |
| 管理者トークン | 特権が必要な操作 | 特権が有効 |
通常、アプリケーションは「標準トークン」で起動します。UAC ダイアログで「はい」を押した瞬間、OS は保持していた「管理者トークン」をそのプロセスに割り当てます。
ユーザー SID(誰であるか)は変わらず、持っている権限の範囲だけが変わる——これが UAC の本質です。
【Linux: sudo の動作】
一般ユーザー (EUID=1001) ──sudo──▶ root (EUID=0)
↑ ID 自体が切り替わる
【Windows: UAC の動作】
管理者 alice ──通常起動──▶ 標準トークン(特権OFF)
管理者 alice ──UAC 承認──▶ 管理者トークン(特権ON)
↑ SID は alice のまま、権限スコープだけ変わる
2. UAC は「セキュリティ境界」ではない
Linuxエンジニアにとって重要な事実があります。Microsoft は公式に 「UAC はセキュリティ境界(Security Boundary)ではない」 と明言しています。
| 比較項目 | Linux(sudo) | Windows(UAC) |
|---|---|---|
| 位置づけ | セキュリティ境界 | 誤操作防止の通知機能 |
| 認証 | パスワード入力(設定による) | 管理者はクリックのみで承認可能 |
| バイパス | 困難(権限昇格は明確な脆弱性) | 多数の手法が存在し、一部はMS非対象 |
| 分離強度 | 強(root と一般ユーザーは明確に隔離) | 弱(同一セッション内でトークンを切替) |
UAC バイパス手法が数多く存在するにもかかわらず、Microsoft はそれ自体を脆弱性として扱わないケースがあります。これは UAC が「セキュリティ境界」ではなく「利便性のための通知機能」という設計思想に基づいているためです。
なぜ境界でないのか?
同一ユーザーセッション内でトークンを切り替える構造上、標準トークンで動くプロセスと管理者トークンで動くプロセスがメモリ空間を共有しやすく、悪意のあるプログラムが昇格済みプロセスを悪用できる余地が生まれます。
3. 「デスクトップの暗転」の正体:Secure Desktop
UAC ダイアログが表示されるとき、画面が暗転して他の操作ができなくなります。これは単なる演出ではなく、「Secure Desktop」 という重要なセキュリティ機能です。
Windows には複数の「デスクトップ」が存在します。
┌─────────────────────────────────┐
│ Windows Desktop 管理 │
│ │
│ ┌───────────────┐ │
│ │ User Desktop │ ← 通常操作の場所。マルウェアも存在できる。
│ └───────────────┘ │
│ │
│ ┌───────────────┐ │
│ │Secure Desktop │ ← UAC ダイアログはここに表示される。
│ │ (UAC / ログ │ User Desktop とプロセス空間が分離されており、
│ │ オン画面) │ User Desktop 側のプログラムはここを操作できない。
│ └───────────────┘ │
└─────────────────────────────────┘
UAC ダイアログを Secure Desktop 上に表示することで、User Desktop で動くマルウェアが プログラム的に「はい」ボタンをクリックする(UIPI 迂回) ことを防いでいます。
注意: UAC の設定を「デスクトップを暗転させない(Secure Desktop を使用しない)」モードに変更すると、この保護が失われます。利便性のためにこの設定を変更している環境では、UAC バイパスのリスクが大幅に高まります。
4. 実践:コマンドラインから権限昇格する
GUI の右クリックではなく、コマンドラインから昇格操作を行う方法を押さえましょう。
Start-Process -Verb RunAs(基本)
# 管理者として新しい PowerShell ウィンドウを開く
Start-Process powershell -Verb RunAs
# 管理者として特定のコマンドを実行する
Start-Process powershell -Verb RunAs -ArgumentList "-Command", "Get-Service | Stop-Service -Name XYZ"
sudo command のように 同一ウィンドウ内で1コマンドだけ昇格させることはネイティブではできません。新しいプロセスが起動します。
現在のプロセスが管理者権限かどうか確認する
# 現在のセッションが管理者トークンで動いているか確認する
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator
)
# True なら管理者トークン、False なら標準トークン
runas コマンド(別ユーザーとして実行)
sudo の -u オプション相当、つまり 別ユーザーとして実行 したい場合は runas を使います。UAC とは異なり、対象ユーザーのパスワードを要求します。
:: Linux の "sudo -u bob command" に相当
runas /user:DOMAIN\bob "powershell.exe"
ただし、現代のセキュリティ設計(特権アクセスワークステーション、Tier モデル)では runas による横断的な認証情報の利用は推奨されない場面が増えています。
gsudo(オープンソース)
Linux の sudo の使い勝手をそのまま再現したい場合は、コミュニティ製の gsudo が有効です。
# インストール(winget 使用)
winget install gerardog.gsudo
# 使い方は sudo とほぼ同じ
gsudo Get-Service
gsudo Stop-Service -Name "XYZ"
5. 運用上の注意:UAC を無効化してはいけない
サーバー運用や自動化スクリプトの都合で「UAC を無効にしたい」と感じる場面があります。しかしこれは Linux で常に root でログインするのと同義 です。
| UAC の状態 | リスク |
|---|---|
| 有効(推奨) | 管理者操作のたびに確認が入る。誤操作・マルウェアの抑止になる。 |
| 無効 | すべてのプロセスが管理者トークンで起動。マルウェアも即座に最高権限を取得。 |
特に管理端末(Jump Server)や AD 管理サーバーでは、UAC は最後の防衛線として必ず有効にしておきましょう。自動化が必要な場合はサービスアカウントと最小権限原則で対処するのが正解です。
まとめ
| 観点 | Linux(sudo) | Windows(UAC) |
|---|---|---|
| 動作原理 | EUID を root(0) に切り替え | 管理者トークンをアンロック |
| 実行中の ID | root に変わる | ユーザー SID は変わらない |
| セキュリティ境界 | ○(明確な境界) | ✕(通知機能であり境界ではない) |
| 同一セッション内の別ユーザー実行 | sudo -u |
runas |
| コマンドラインからの昇格 | sudo command |
Start-Process -Verb RunAs(新プロセス) |
「sudo は変身、UAC はカードの使い分け」——この比喩でアーキテクチャの差を整理すると、Windowsのプロセス・セキュリティモデルがぐっと見えやすくなります。