[WMI基礎] トラブルシュートの基礎知識 (4)/n : アクセス拒否発生!WMIPrvSEの実行ユーザの権限を確認しよう!

皆さんごきげんよう。ういこです。

今日は WMI のトラブルシュートの続き、"アクセス拒否系 - WMI プロバイダの実行権限は適切に割り当てられているか?" をお送りします。
WMI のアクセス拒否系でよくひっかかるのが、WMI をコールしたプロセスの実行権限が適切なはずなのに、なぜかアクセス拒否が返るというところです。実は、このとき WMI の呼び出し側の他、その先の WMI のプロバイダ ホストと呼ばれるプロセス実行アカウントの権限も同時に考慮する必要があります。

以下、これまでのあらすじです。

************************************************
[WMI基礎] トラブルシュートの基礎知識 (1)/n : WMI の動作基盤のテストから始めよう
https://blogs.technet.com/jpilmblg/archive/2010/04/04/wmi-1-n-wmi.aspx

[WMI基礎] トラブルシュートの基礎知識 (2)/n : WMI 詳細ログと WMIDiag ダイジェスト
https://blogs.technet.com/jpilmblg/archive/2010/04/05/wmi-2-n-wmi-wmidiag.aspx

[WMI基礎] トラブルシュートの基礎知識 (3)/n : DCOM の既定の構成であるか確認し、動作するか確かめてみよう
https://blogs.technet.com/jpilmblg/archive/2010/04/10/wmi-3-n-dcom.aspx
************************************************

WMI を使用すると、WMIPrvSE.exe というプロセスが WMI を呼び出したプロセスとは別に立ち上がります。この WMIPrvSE は、"WMI プロバイダ ホスト" とよばれ、実際の WMI の処理の仲介を行い、その先の実際のシステムからの情報取得などを行うモジュールとやり取りなどを行います。

 
一般的には、WMI プロバイダは、NETWOK SERVICE アカウントや、SYSTEM などのアカウントで実行されることが多いです。
アクセス拒否系の問題の場合は、この "WMI プロバイダを実行するユーザが実行するに足る権限をもたされているか" を確認することも有効なことがあります。

実は、NETWORK SERVICE 等のアカウントが WMI の処理を実施するためには、"認証後にクライアントを偽装 (impersonate a client after authentication)" 特権を必要とします。既定では Windows XP Service Pack 2 以降では NETWORK SERVICE および NT AUTHORITY\SERVICE は、この "認証後クライアント偽装" 特権を持っています。しかし、なぜかこの特権が彼らから取っ払われてしまった結果、アクセスが拒否られるという悲劇がしばしば報告されています。(ちなみに、我々サポートのところにお問い合わせ頂いた時点ですでに発生してしまっているため、なぜ特権が取り上げられてしまうのかは不明です)

[1] まずは特権を持っているか確認しよう
もし、以下の手順で WMIPrvSE.exe を実行していそうなユーザの特権が無くなっている場合は、改めて付与してあげてから念のため再起動をかけます。(XP / Windows Server 2003 では必須)

1. [スタート] - [ファイル名を指定して実行] を選択するか、Vista 以降の既定のテーマの場合は普通にスタートボタンを押し、"ファイルのプログラムと検索" テキスト ボックスを開きます。
2. テキストボックス上で gpedit.msc と入力して [OK] を押します。
3. グループ ポリシー エディタが開きますので、以下の通り展開します。

(日本語版)
ローカル コンピューター ポリシー
+ コンピュータの構成
+ Windows の設定
+ セキュリティの設定
+ ローカル ポリシー
+ 監査ポリシー
- ユーザー権利の割り当て
⇒ "認証後にクライアントを偽装" を確認

image

(英語版)
Local Computer Policy
+ Computer Configration
+ Windows Settings
+ Security Settings
+ Local Policies
+ User Rights Assignment
⇒ "Impersonate a client after authentication"

image

SERVICE アカウントなどが特権を割り当てられているか確認します。割り当てられていない場合は、以下の既定値に戻してみてください。

既定値 :
Administrators
Local Service
Network Service
Service

[おまけ 1] "認証後にクライアントを偽装" の説明をグループポリシーエディタからコピってきた

(Japanese) ユーザーにこの特権を割り当てると、そのユーザーに代わって実行されるプログラムがクライアントを偽装できるようになります。この種の偽装にこのユーザー権利が必要となるのは、権限のないユーザーが作成したサービスに (リモート プロシージャ コール (RPC) や名前付きパイプなどを使用して) クライアントを接続させ、次にそのクライアントを偽装することによって、管理者レベルまたはシステム レベルなど上位のアクセス許可を得ることを防ぐためです。

注意

このユーザー権利を割り当てると、セキュリティ上の問題が生じる可能性があります。このユーザー権利は、信頼できるユーザーのみに割り当ててください。

既定値:

Administrators Local Service Network Service Service

注意: 既定では、サービス コントロール マネージャーによって開始されるサービスのアクセス トークンにビルトインの Service グループが追加されます。コンポーネント オブジェクト モデル (COM) サーバーが COM インフラストラクチャによって起動され、特定のアカウントで実行するよう構成されている場合も、サーバーのアクセス トークンに Service グループが追加されます。その結果、これらのサービスが開始するときにこのユーザー権利が与えられます。

また、次の条件のいずれかに該当するときは、ユーザーがアクセス トークンを偽装できます。

偽装しようとしているアクセス トークンがそのユーザー用のものである。 このログオン セッションで、明示的な資格情報を使用してネットワークにログオンすることにより、ユーザーがアクセス トークンを作成した。 要求されるレベルが "匿名" や "識別" など、"偽装" より下である。 このような要因があるため、通常はユーザーがこのユーザー権利を必要とすることはありません。

詳細については、Microsoft プラットフォーム ソフトウェア開発キット (SDK) で "SeImpersonatePrivilege" を検索してください。

警告

この設定を有効にすると、以前に偽装の特権があったプログラムはこの特権を失い、実行しなくなる可能性があります。

 

(English) Assigning this privilege to a user allows programs running on behalf of that user to impersonate a client. Requiring this user right for this kind of impersonation prevents an unauthorized user from convincing a client to connect (for example, by remote procedure call (RPC) or named pipes) to a service that they have created and then impersonating that client, which can elevate the unauthorized user's permissions to administrative or system levels.

Default:     Administrators     Service

Caution: Assigning this user right can be a security risk. Only assign this user right to trusted users.

Note: By default, services that are started by the Service Control Manager have the built-in Service group added to their access tokens. Component Object Model (COM) servers that are started by the COM infrastructure and that are configured to run under a specific account also have the Service group added to their access tokens. As a result, these services get this user right when they are started.

In addition, a user can also impersonate an access token if any of the following conditions exist.

1) The access token that is being impersonated is for this user. 2) The user, in this logon session, created the access token by logging on to the network with explicit credentials. 3) The requested level is less than Impersonate, such as Anonymous or Identify.

Because of these factors, users do not usually need this user right.

For more information, search for "SeImpersonatePrivilege" in the Microsoft Platform SDK.

Warning: If you enable this setting, programs that previously had the Impersonate privilege may lose it, and they may not run.

[おまけ 2] ドメイン グループ ポリシーの "認証後にクライアントを偽装" の初期値は?
"Default Domain Policy" および "Default Domain Controller Policy" 上の "認証後にクライアントを偽装" の初期値は "未定義 (not defined)" です。

image

image 

[おまけ 3] Windbg で確認してみよう
さて、GUI なんて触らないでプロセスから確認してやる!という漢気溢れる WinDbg 大好きな方は、手間がかかるので正直お勧めしませんが、以下のような方法もあります。

1. なんでもいいからタスク マネージャ上で権限を確認したいアカウントで実行されているプロセスを見つけて Windbg をアタッチしてやります。なお、Vista 以降は、Windbg は [管理者として実行(A)..] で権限昇格して実行します。 さらにタスクマネージャは "全ユーザのプロセスを表示する(S)" にしてあげてください。 (※)

(※) 警告!
svchost や、WMIPrvSE などのプロセスにやたらにデバッガをアタッチしないでください。実施されている処理によっては、システムの動作にとんでもない影響を及ぼす可能性がありますので、どうしてもやってみたい方は、タスク スケジューラで NT AUTHORITY\SERVICE で起動させるタスクを作ってタスクを実行し、起動されたプロセスに対して実施することをお勧めします。

2. Windbg のコマンド上で、!token コマンドを実行します。

image
3. どばっとでてくる中で、[Ctrl] + F キーで "Privs: " という文字列を検索します。

image

Privs:
00 0x000000003 SeAssignPrimaryTokenPrivilege Attributes -
01 0x000000005 SeIncreaseQuotaPrivilege Attributes -
02 0x000000013 SeShutdownPrivilege Attributes -
03 0x000000015 SeAuditPrivilege Attributes -
04 0x000000017 SeChangeNotifyPrivilege Attributes - Enabled Default
05 0x000000019 SeUndockPrivilege Attributes -
06 0x00000001d SeImpersonatePrivilege Attributes - Enabled Default
07 0x00000001e SeCreateGlobalPrivilege Attributes - Enabled Default
08 0x000000021 SeIncreaseWorkingSetPrivilege Attributes -
09 0x000000022 SeTimeZonePrivilege Attributes -

 上記は正常な環境での実施例です。SeImpersonatePrivilege が割り当てられているのがわかります。

4. あら !token の結果だと、SID になっちゃって、人間の判るユーザ名がわからないわ!?という方は、"!peb" コマンドを実行してみてください。こんな感じで判ります。

        USERDOMAIN=FAREAST
USERNAME=UIKOU-SEVEN$
USERPROFILE=C:\Windows\ServiceProfiles\NetworkService

image

↓↓↓↓ 実行結果

image

5. 気がすんだら、.detach コマンドでプロセスを開放してから WinDbg を終了するか、そのプロセスが死んでもよければ Windbg のウインドウを何も言わずにぷちっと閉じましょう。タスクマネージャ上で確認してプロセスが死んでいたら終わりです。.detach した場合は、タスクはシステム上で元気に動作し続けます。

[おまけ 3 のさらにおまけ] Vista 以降 / UAC 有の場合の管理者として実行してるかしてないかのプロセスの違い
ちなみに、これは UAC 有無で動作の差異が発生する系のトラブルシュートにも使えます。!token の使い方で、便利なのが UAC ありなしで何が特権として違うかを確認できるです。以下、同じユーザで、[管理者として実行(A)..] をつけてプログラムを起動した場合とそうではない場合での !token の結果です。でてくる数自体もちがう!

・管理者権限昇格済み
Privs:
00 0x000000005 SeIncreaseQuotaPrivilege          Attributes -
01 0x000000008 SeSecurityPrivilege               Attributes -
02 0x000000009 SeTakeOwnershipPrivilege          Attributes -
03 0x00000000a SeLoadDriverPrivilege             Attributes -
04 0x00000000b SeSystemProfilePrivilege          Attributes -
05 0x00000000c SeSystemtimePrivilege             Attributes -
06 0x00000000d SeProfileSingleProcessPrivilege   Attributes -
07 0x00000000e SeIncreaseBasePriorityPrivilege   Attributes -
08 0x00000000f SeCreatePagefilePrivilege         Attributes -
09 0x000000011 SeBackupPrivilege                 Attributes -
10 0x000000012 SeRestorePrivilege                Attributes -
11 0x000000013 SeShutdownPrivilege               Attributes -
12 0x000000014 SeDebugPrivilege                  Attributes -
13 0x000000016 SeSystemEnvironmentPrivilege      Attributes -
14 0x000000017 SeChangeNotifyPrivilege           Attributes - Enabled Default
15 0x000000018 SeRemoteShutdownPrivilege         Attributes -
16 0x000000019 SeUndockPrivilege                 Attributes -
17 0x00000001c SeManageVolumePrivilege           Attributes -
18 0x00000001d SeImpersonatePrivilege            Attributes - Enabled Default
19 0x00000001e SeCreateGlobalPrivilege           Attributes - Enabled Default
20 0x000000021 SeIncreaseWorkingSetPrivilege     Attributes -
21 0x000000022 SeTimeZonePrivilege               Attributes -
22 0x000000023 SeCreateSymbolicLinkPrivilege     Attributes -

image

・管理者権限昇格無し
Privs:
00 0x000000013 SeShutdownPrivilege               Attributes -
01 0x000000017 SeChangeNotifyPrivilege           Attributes - Enabled Default
02 0x000000019 SeUndockPrivilege                 Attributes -
03 0x000000021 SeIncreaseWorkingSetPrivilege     Attributes -
04 0x000000022 SeTimeZonePrivilege               Attributes -

image

では皆さんごきげんよう。

ういこう@キノコパワー