知識マップ: Windowsの偽装トークンを正しく扱う ── スレッド単位の権限借用と安全な戻し方

記事「Windowsの偽装トークンを正しく扱う ── スレッド単位の権限借用と安全な戻し方」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Windowsの偽装トークンは、プロセス全体を別ユーザーにする権限昇格ではなく、スレッド単位でアクセスチェックのセキュリティコンテキストを切り替える仕組みで、Identification・Impersonation・Delegationといった偽装レベルによって何ができるかが決まる。Win32 APIで偽装する場合は必ずRevertToSelfで戻す必要があり、.NETのRunImpersonated/RunImpersonatedAsyncは偽装トークンをExecutionContextに載せて運ぶため、偽装スコープの中からTask.Runへfire-and-forgetで処理を投げると、コード上のスコープを超えて偽装されたまま処理が動き続けるという壊れ方をする。プロセスを別ユーザーとして起動したい場合は偽装トークンではなくプライマリトークンが必要で、ネットワーク越しに利用者本人の権限を使いたいダブルホップ問題にはKerberosの委任設計が必要になる。

Windowsの偽装トークンの知識マップ偽装トークンが偽装レベルを伴いRevertToSelfで安全に戻す必要があること、.NETのRunImpersonatedがExecutionContextの伝播を通じてTask.Runに投げた処理を偽装させたまま動かし続けうること、プライマリトークンやダブルホップ問題との関係を示す図前提とする前提とする利用する利用する原因になり得る利用する原因になり得る前提とする前提とするで構成できる防止する軽減する前提とする用いるのは非推奨前提とする利用する利用する前提とする偽装トークン偽装レベルRevertToSelfWindowsIdentity.RunImpersonated / RunImpersonatedAsync.NETのExecutionContext偽装スコープを超えて継続する偽装LogonUserダブルホップ問題Kerberosの委任SPNドメインコントローラーSafeAccessTokenHandleハンドルリークプライマリトークン管理者権限ASP.NET CoreのWindows認証CreateProcessAsUserWindowsサービス

概念間の関係(全18件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

偽装トークン
スレッドに付き、そのスレッドが別のセキュリティコンテキストでアクセスチェックを受けるために使われるアクセストークン。権限昇格ではない。
WindowsIdentity.RunImpersonated / RunImpersonatedAsync
.NETで偽装スコープをラムダ式の範囲に閉じ込めて表現できるAPIで、内部では偽装トークンをAsyncLocalに載せて管理する。
.NETのExecutionContext
AsyncLocalの値を保持しスレッド間を伝播する.NETの実行コンテキストで、Task.Runは呼び出し時点のExecutionContextを捕まえてプールのスレッドで復元する。
ダブルホップ問題
Webサーバーなどで偽装した利用者の資格情報を、さらに別のサーバー(ファイルサーバー等)へ再委任できずアクセスに失敗する問題。
Kerberosの委任
サービスがクライアントの代理として別のサービスへ接続する仕組み。無制約の委任・制約付き委任・リソースベースの制約付き委任(RBCD)がある。NTLMが提供するのはローカルでの偽装に必要な認可情報まで。
RevertToSelf
現在のスレッドの偽装を終了し、プロセスのセキュリティコンテキストへ戻すWin32 API。try/finallyで確実に呼ぶ必要がある。
SafeAccessTokenHandle
トークンというカーネルオブジェクトへのハンドルを、usingでスコープ管理して確実に閉じるための.NETの安全なハンドル型。
プライマリトークン
プロセスのセキュリティコンテキストを表すアクセストークンで、CreateProcessAsUserなどのプロセス起動に使う。
ASP.NET CoreのWindows認証
ASP.NET CoreでWindows認証を使う構成で、認証されたHttpContext.UserはWindowsIdentityを表す一方、プロセス自体はアプリケーションプールIDなどのアカウントで動作し続ける。
Windowsサービス
ユーザーのサインインと無関係にバックグラウンドで動くWindowsのプロセス。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。