@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/06/09/002-windows-impersonation-token/#article>
    schema:about <https://comcomponent.com/knowledge/impersonation-token/> ;
    schema:mentions <https://comcomponent.com/knowledge/primary-token/>, <https://comcomponent.com/knowledge/impersonation-level/>, <https://comcomponent.com/knowledge/revert-to-self/>, <https://comcomponent.com/knowledge/runimpersonated-dotnet/>, <https://comcomponent.com/knowledge/logonuser-api/>, <https://comcomponent.com/knowledge/double-hop-problem/>, <https://comcomponent.com/knowledge/executioncontext-dotnet/>, <https://comcomponent.com/knowledge/lingering-impersonation-risk/>, <https://comcomponent.com/knowledge/safeaccesstokenhandle/>, <https://comcomponent.com/knowledge/handle-leak/>, <https://comcomponent.com/knowledge/kerberos-delegation/>, <https://comcomponent.com/knowledge/spn/>, <https://comcomponent.com/knowledge/domain-controller/>, <https://comcomponent.com/knowledge/admin-rights/>, <https://comcomponent.com/knowledge/aspnet-core-windows-auth/>, <https://comcomponent.com/knowledge/createprocessasuser/>, <https://comcomponent.com/knowledge/windows-service/> .

<https://comcomponent.com/knowledge/impersonation-token/> a skos:Concept ;
    skos:prefLabel "偽装トークン"@ja ;
    skos:definition "スレッドに付き、そのスレッドが別のセキュリティコンテキストでアクセスチェックを受けるために使われるアクセストークン。権限昇格ではない。"@ja ;
    skos:altLabel "Impersonation Token" ;
    ks:requires <https://comcomponent.com/knowledge/impersonation-level/> ;
    ks:uses <https://comcomponent.com/knowledge/logonuser-api/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/admin-rights/> .

<https://comcomponent.com/knowledge/impersonation-level/> a skos:Concept ;
    skos:prefLabel "偽装レベル"@ja ;
    skos:definition "偽装トークンが持つAnonymous・Identification・Impersonation・Delegationの4段階の区分で、サーバーがクライアントの権限としてどこまで動作できるかを決める。"@ja ;
    skos:altLabel "Impersonation Level" ;
    skos:altLabel "SECURITY_IMPERSONATION_LEVEL" .

<https://comcomponent.com/knowledge/revert-to-self/> a skos:Concept ;
    skos:prefLabel "RevertToSelf"@ja ;
    skos:definition "現在のスレッドの偽装を終了し、プロセスのセキュリティコンテキストへ戻すWin32 API。try/finallyで確実に呼ぶ必要がある。"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/lingering-impersonation-risk/> .

<https://comcomponent.com/knowledge/runimpersonated-dotnet/> a skos:Concept ;
    skos:prefLabel "WindowsIdentity.RunImpersonated / RunImpersonatedAsync"@ja ;
    skos:definition ".NETで偽装スコープをラムダ式の範囲に閉じ込めて表現できるAPIで、内部では偽装トークンをAsyncLocalに載せて管理する。"@ja ;
    skos:altLabel "RunImpersonated" ;
    skos:altLabel "RunImpersonatedAsync" ;
    ks:uses <https://comcomponent.com/knowledge/impersonation-token/> ;
    ks:uses <https://comcomponent.com/knowledge/executioncontext-dotnet/> ;
    ks:requires <https://comcomponent.com/knowledge/safeaccesstokenhandle/> .

<https://comcomponent.com/knowledge/executioncontext-dotnet/> a skos:Concept ;
    skos:prefLabel ".NETのExecutionContext"@ja ;
    skos:definition "AsyncLocalの値を保持しスレッド間を伝播する.NETの実行コンテキストで、Task.Runは呼び出し時点のExecutionContextを捕まえてプールのスレッドで復元する。"@ja ;
    skos:altLabel "ExecutionContext" ;
    skos:altLabel "AsyncLocal" .

<https://comcomponent.com/knowledge/lingering-impersonation-risk/> a skos:Concept ;
    skos:prefLabel "偽装スコープを超えて継続する偽装"@ja ;
    skos:definition ".NETのRunImpersonatedが偽装トークンをAsyncLocalに載せているため、Task.Runに投げた処理がExecutionContextの伝播によって偽装されたまま動き続け、コード上の偽装スコープより長く偽装が続く状態。"@ja .

<https://comcomponent.com/knowledge/logonuser-api/> a skos:Concept ;
    skos:prefLabel "LogonUser"@ja ;
    skos:definition "ユーザー名・ドメイン・パスワードといった資格情報からアクセストークンを取得するWin32 APIで、ログオン種別によって返るトークンの性質が変わる。"@ja ;
    skos:altLabel "LogonUser API" .

<https://comcomponent.com/knowledge/double-hop-problem/> a skos:Concept ;
    skos:prefLabel "ダブルホップ問題"@ja ;
    skos:definition "Webサーバーなどで偽装した利用者の資格情報を、さらに別のサーバー(ファイルサーバー等)へ再委任できずアクセスに失敗する問題。"@ja ;
    skos:altLabel "Double Hop Problem" .

<https://comcomponent.com/knowledge/kerberos-delegation/> a skos:Concept ;
    skos:prefLabel "Kerberosの委任"@ja ;
    skos:definition "サービスがクライアントの代理として別のサービスへ接続する仕組み。無制約の委任・制約付き委任・リソースベースの制約付き委任(RBCD)がある。NTLMが提供するのはローカルでの偽装に必要な認可情報まで。"@ja ;
    skos:altLabel "Delegation" ;
    skos:altLabel "制約付き委任"@ja ;
    skos:altLabel "リソースベースの制約付き委任"@ja ;
    skos:broader <https://comcomponent.com/knowledge/kerberos/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/domain-controller/> .

<https://comcomponent.com/knowledge/spn/> a skos:Concept ;
    skos:prefLabel "SPN"@ja ;
    skos:definition "KDCが接続先のサービスアカウントを特定するために使う名前。登録されていなければ、KDCはそのサービスのサービスチケットを発行できない。"@ja ;
    skos:altLabel "サービスプリンシパル名"@ja ;
    skos:altLabel "Service Principal Name" .

<https://comcomponent.com/knowledge/domain-controller/> a skos:Concept ;
    skos:prefLabel "ドメインコントローラー"@ja ;
    skos:definition "Active Directoryのディレクトリサービスを提供し、KDCの機能やNTLMのパススルー認証の相手を担うサーバー。"@ja ;
    skos:altLabel "DC" .

<https://comcomponent.com/knowledge/safeaccesstokenhandle/> a skos:Concept ;
    skos:prefLabel "SafeAccessTokenHandle"@ja ;
    skos:definition "トークンというカーネルオブジェクトへのハンドルを、usingでスコープ管理して確実に閉じるための.NETの安全なハンドル型。"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/handle-leak/> .

<https://comcomponent.com/knowledge/handle-leak/> a skos:Concept ;
    skos:prefLabel "ハンドルリーク"@ja ;
    skos:definition "参照カウントやハンドルカウントの数え違いなどにより、不要になったハンドル(ファイル・イベント・スレッド・GDIオブジェクト・アクセストークンなどカーネルオブジェクトへの参照)が解放されずに積み上がっていく状態。"@ja ;
    skos:altLabel "Handle Leak" .

<https://comcomponent.com/knowledge/primary-token/> a skos:Concept ;
    skos:prefLabel "プライマリトークン"@ja ;
    skos:definition "プロセスのセキュリティコンテキストを表すアクセストークンで、CreateProcessAsUserなどのプロセス起動に使う。"@ja ;
    skos:altLabel "Primary Token" ;
    skos:altLabel "プライマリアクセストークン"@ja ;
    ks:uses <https://comcomponent.com/knowledge/createprocessasuser/> .

<https://comcomponent.com/knowledge/admin-rights/> a skos:Concept ;
    skos:prefLabel "管理者権限"@ja ;
    skos:definition "コンピューター全体の設定を変更できる権限。"@ja ;
    skos:altLabel "昇格"@ja .

<https://comcomponent.com/knowledge/aspnet-core-windows-auth/> a skos:Concept ;
    skos:prefLabel "ASP.NET CoreのWindows認証"@ja ;
    skos:definition "ASP.NET CoreでWindows認証を使う構成で、認証されたHttpContext.UserはWindowsIdentityを表す一方、プロセス自体はアプリケーションプールIDなどのアカウントで動作し続ける。"@ja .

<https://comcomponent.com/knowledge/createprocessasuser/> a skos:Concept ;
    skos:prefLabel "CreateProcessAsUser"@ja ;
    skos:definition "指定したトークンのセキュリティコンテキストで新しいプロセスを起動するWin32 APIで、渡すトークンには原則としてプライマリトークンが必要になる。"@ja .

<https://comcomponent.com/knowledge/windows-service/> a skos:Concept ;
    skos:prefLabel "Windowsサービス"@ja ;
    skos:definition "ユーザーのサインインと無関係にバックグラウンドで動くWindowsのプロセス。"@ja ;
    skos:altLabel "サービス"@ja ;
    ks:uses <https://comcomponent.com/knowledge/primary-token/> .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/impersonation-token/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/impersonation-level/> ;
    schema:description "偽装トークンにはAnonymous/Identification/Impersonation/Delegationのいずれかの偽装レベルが伴い、そのユーザーの権限で実際にアクセスできるかどうかを左右する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/secauthz/impersonation-levels> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/impersonation-token/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/revert-to-self/> ;
    schema:description "Win32 APIで偽装トークンを直接扱う場合に限り、try/finallyでRevertToSelfを呼び確実にセキュリティコンテキストを元に戻すことが安全な運用の前提となる。.NETのRunImpersonated/RunImpersonatedAsyncを使う場合はスコープを抜ける際にランタイムが内部で戻すため、呼び出し側が明示的にRevertToSelfを呼ぶ必要はない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-reverttoself> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/runimpersonated-dotnet/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/impersonation-token/> ;
    schema:description "RunImpersonated/RunImpersonatedAsyncは偽装トークンを受け取り、ラムダ式の範囲だけを偽装スコープとして表現する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.principal.windowsidentity.runimpersonated> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/runimpersonated-dotnet/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/executioncontext-dotnet/> ;
    schema:description "RunImpersonatedは偽装トークンをAsyncLocalに載せ、その値はExecutionContextと一緒にスレッド間を流れる"@ja ;
    ks:evidence <https://github.com/dotnet/runtime/blob/main/src/libraries/System.Security.Principal.Windows/src/System/Security/Principal/WindowsIdentity.cs> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/executioncontext-dotnet/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/lingering-impersonation-risk/> ;
    schema:description "Task.Runは呼び出し時点のExecutionContextを捕まえてプールのスレッドで復元するため、偽装スコープ内からTask.Runへ投げた処理は偽装されたまま動き続け、呼び出し側が完了も例外も受け取れなくなることがある"@ja ;
    ks:evidence <https://github.com/dotnet/runtime/blob/main/src/libraries/System.Security.Principal.Windows/src/System/Security/Principal/WindowsIdentity.cs> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/impersonation-token/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/logonuser-api/> ;
    schema:description "偽装トークンは、LogonUserのようなユーザー名・パスワードなどの資格情報を渡すAPIから取得できる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-logonusera> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/impersonation-token/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/double-hop-problem/> ;
    schema:description "Impersonationレベルの偽装トークンはローカルでのアクセスチェックには使えても、さらに別のリモートサーバーへ資格情報を再委任するには不十分な場合があり、これがダブルホップ問題として現れる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/secauthz/impersonation-levels> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/double-hop-problem/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/kerberos-delegation/> ;
    schema:description "ダブルホップ問題を解決するには、単なるアプリケーションコードでの偽装では足りず、制約付き委任やリソースベースの制約付き委任を含むKerberosの委任設計が必要になることが多い"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-server/security/kerberos/kerberos-constrained-delegation-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/double-hop-problem/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/spn/> ;
    schema:description "リモートサーバーへの委任を機能させるには、委任先のSPNを明示的に設定するなど、SPNまわりの構成が関わる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-server/security/kerberos/kerberos-constrained-delegation-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/kerberos-delegation/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/domain-controller/> ;
    schema:description "制約付き委任やリソースベースの制約付き委任の設定はアプリケーション側ではなくドメイン側で行うため、ドメインコントローラーが提供するAD DS上のアカウント属性で構成する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-server/security/kerberos/kerberos-constrained-delegation-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/revert-to-self/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/lingering-impersonation-risk/> ;
    schema:description "try/finallyでRevertToSelfを確実に呼ぶことで、戻し忘れによりスレッドが偽装ユーザーのまま後続処理を続けてしまう状態を防ぐ"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-reverttoself> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/safeaccesstokenhandle/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/handle-leak/> ;
    schema:description "トークンハンドルをSafeAccessTokenHandleとusingで管理することで、取り扱い忘れによるハンドルリークを軽減する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.safehandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/primary-token/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/impersonation-token/> ;
    schema:description "スレッド偽装で得た偽装トークンをOpenThreadTokenで取得し、DuplicateTokenExでプライマリトークンを作るという流れでは、プライマリトークンの生成は元の偽装トークンを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-duplicatetokenex> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/impersonation-token/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/admin-rights/> ;
    schema:description "偽装は権限昇格の手段ではなく、管理者アカウントを何にでも通る便利アカウントとして偽装する設計は推奨されない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/secauthz/impersonation-tokens> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/aspnet-core-windows-auth/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/runimpersonated-dotnet/> ;
    schema:description "ASP.NET CoreのWindows認証では、認証されたHttpContext.Userが利用者のWindows IDを表していても処理全体が利用者権限になるわけではないため、利用者本人の権限で特定の操作を行いたい場合に限り、明示的にRunImpersonated/RunImpersonatedAsyncでスコープを作る必要がある。単に認証・認可の判定だけに使うWindows認証アプリではRunImpersonatedは不要である"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/primary-token/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/createprocessasuser/> ;
    schema:description "プライマリトークンは、CreateProcessAsUserのようなプロセス起動APIに渡すために使う"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createprocessasusera> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/windows-service/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/primary-token/> ;
    schema:description "Windowsサービスのプロセスには、そのサービスの実行アカウントを表すプライマリトークンが付く"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/secauthz/access-tokens> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/runimpersonated-dotnet/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/safeaccesstokenhandle/> ;
    schema:description "RunImpersonated/RunImpersonatedAsyncにはSafeAccessTokenHandleを渡し、usingでそのライフタイムを管理することが前提となる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.principal.windowsidentity.runimpersonated> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
