Windows基礎

【図解】UACの仕組み ~整合性レベル, MIC, アクセストークン~

UAC (User Account Control) とは

Windows Vista 以降ではセキュリティの機能として UAC (User Account Control) が実装されました。

これは簡単に言うと、ユーザが起動したアプリケーションが管理者権限を使うときに、そのアプリケーションが介在できない別のデスクトップセッションにボックスが表示され、ユーザが承諾のクリック、もしくは資格情報を入力しないと処理が進まない、というものです。

UAC が機能する OS (Vista 以降) では、管理者アカウントでログインしても、アプリを起動する際は標準ユーザ権限で起動します

アプリを管理者権限で動作させる場合は、UAC によって「管理者権限で動作させてよいかどうか」を人間に委ねるため、通常のデスクトップセッションとは異なるセキュアデスクトップセッションにより承認を要求します。

この仕組みにより、悪意あるアプリケーションが、ユーザの知らぬ間に管理者権限で動作することが少し難しくなりました。

管理者権限ユーザでの UAC の動作

管理者権限 (Local Administrators グループのメンバー) のユーザー myadmin がログイン認証に成功すると、管理者権限アクセストークン [Full administratoraccess token] と標準ユーザートークン [Standard User token] の 2 つが与えられ、おなじみ『Explorer』が実行ユーザ myadmin としてメモリ上に展開・起動します。

この Explorer には管理者権限アクセストークンは割り当てられず、標準のアクセストークンのみが割り当てられます。

Explorer はログインした後にデスクトップから起動するようにも思えますが、実際にはログイン直後から起動しています。Explorer のウィンドウは見えてなくても、例えばデスクトップにあるファイルの操作は Explorer プロセスが管理しています。

ログイン後、myadmin が Explorer 上に表示されている .exe ファイルを実行したらどのようなことが起こるのでしょうか?

このとき .exe ファイルはメモリ上に「プロセス」として展開されますが、Explorer の子プロセスとなるため、実行ユーザーやアクセストークンは親プロセスから引き継がれます。つまり、実行ユーザ myadmin、アクセストークン=標準ユーザートークンとなります。

では『管理者権限』のプロセスはどのようにして生成されるのでしょうか?主流のパターンは 2 つあります。

1 つは、exe やそのショートカットを右クリックして『管理者として実行』をクリックするパターン、もう 1 つはアプリ開発者が必要なタイミングで『資格情報を要求する』ようにプログラミングされているパターンです。

この資格情報要求時に出る画面が、UAC の特徴の 1 つである「セキュアデスクトップ」です。管理者権限でログインしている場合は既に管理者権限のアクセストークンがありますので、資格情報 (ID/Password) は求められず、単に昇格してよいかどうかの承認が求められるのみです。

なお、この動作を「管理者承認モード」と呼びます。後述しますが、ビルトイン Administrator についてはこの動作にはならず、最初の Explorer に Full administrator access token が与えられて起動し、承認を求められず管理者権限を実行できます。

一般ユーザでの UAC の動作

一般ユーザの場合はアクセストークンは標準アクセストークンのみが割り当てられます。なのでもし管理者として実行、もしくは資格情報を要求された場合は「セキュアデスクトップ」の画面で (同意ではなく) 資格情報の入力を求められます。

なお、この昇格の要求はデフォルト設定であり、後述のローカル/グループポリシー設定のところで「標準ユーザーに対する昇格時のプロンプトの動作」設定で「拒否する」設定も可能です。

管理者権限と整合性レベル

ところで、管理者権限とは具体的には何なのでしょうか?

実は管理者権限でのアクセス制御の軸は 2 つあります。

DACL による管理者権限

1 つは通常の『DACL』により実現するものです。ファイル共有サーバ等でよくみられる、フォルダを右クリックでプロパティを表示し「セキュリティ」タブで表示される以下のやつです。

Windows はあらゆるものが「オブジェクト」としてプログラミングされており、ファイルやフォルダもオブジェクトの 1 つです。DACL ではファイル・フォルダに限らずあらゆるオブジェクトで DACL によるアクセス制御が可能です。

つまり、管理者権限の 1 つの意味とは、DACL による『Local Administrators』に対して許可されているオブジェクトへの操作のことです。

SACL の整合性レベルによる管理者権限

もう 1 つの軸は『整合性レベル (Integrity Level)』です。これはプロセスが内包するアクセストークンに内包されるもので、整合性レベルの低いプロセスから整合性レベルの高いオブジェクトへのアクセスがブロックされる、というものです。

オブジェクトの整合性レベルは SACL に記述されています。

このようなアクセス制御を『必須整合性コントロール (MIC: Mandatory Integrity Control)』と呼びます。

必須整合性コントロール - Win32 apps
セキュリティ保護可能なオブジェクトへのアクセスを制御するためのメカニズムを提供します。

UAC で要求される「管理者権限」というのはどちらかというと、こちらのことです。

UAC により管理者権限が得られた場合、Full administrator access token が与えられ、すなわち整合性レベル「High」になることができます。

整合性レベルは『System (システム)』『High (高)』『Medium (中)』『Low (低)』『Untrusted』の 5 つのレベルから成り立っており、ログイン時に与えられる Explorer プロセスは『Medium』で起動します。

Medium は特に指定が無い場合の標準的な権限です。標準アクセストークンを保有していることがすなわち Medium 整合性レベルです。なのでコマンドプロンプトを起動すると (親プロセスの Explorer と同じく) Medium となります。

なお、そのコマンドプロンプトプロセスの整合性レベルを見るには whoami /all で確認できます。"Medium Mandatory Level" と表示されます。

C:\Users\test> whoami /all

USER INFORMATION
----------------

ユーザー名           SID
==================== =============================================
desktop-0ieg9fk\test S-1-5-21-4267876713-1678681253-557966893-1001


GROUP INFORMATION
-----------------

グループ名                                                           種類                 SID          属性             
========================================= ==================== ============ ========================================
Everyone                                  よく知られたグループ  S-1-1-0      固定グループ, 既 定で有効, 有効なグループ
~~~
Mandatory Label\Medium Mandatory Level    ラベル               S-1-16-8192
~~~

管理者権限で実行したコマンドプロンプトで whoami /all を見ると、"High Mandatory Level" になっていることが確認できます。

C:\Windows\system32> whoami /all

USER INFORMATION
----------------

ユーザー名           SID
==================== =============================================
desktop-0ieg9fk\test S-1-5-21-4267876713-1678681253-557966893-1001


GROUP INFORMATION
-----------------

グループ名                                                           種類                 SID          属性             
========================================= ==================== ============ ========================================================
Everyone                                  よく知られたグループ  S-1-1-0      固定グループ, 既 定で有効, 有効なグループ
~~~
Mandatory Label\High Mandatory Level      ラベル               S-1-16-12288
~~~

なお、Low や Untrusted はアプリケーションが周りと連携する必要が無い場合に指定します。例えばブラウザが他のアプリと連携が不要な子プロセスを生成したいときは、Untrusted レベルを指定して子プロセスを起動します。必要以上に権限を与えないことで、セキュリティ的な安全弁になっているわけです。

以下は Chrome 本体 (プロセス ID: 17368) が Medium で起動し、子プロセス (プロセス ID: 21520) が Untrusted で起動している様子です。"Process Hacker 2" というツールで見ることができます。

DACL と SACL Integrity Level で保護できるオブジェクト

DACL や SACL でアクセス制御が可能なオブジェクトにはファイルやフォルダ、レジストリ以外にも、プロセスやスレッド、名前付きパイプなど様々です。

具体例としては以下「Securable Objects (セキュリティ保護可能なオブジェクト)」を参照下さい。

Securable Objects - Win32 apps
A securable object is an object that can have a security descriptor.

UAC の設定について

UAC の設定関連は「コントロールパネル」と「ローカルポリシー/グループポリシー」の 2 か所あります。

コントロールパネルの UAC 設定

UAC の設定はコントロールパネルの「システムとセキュリティ」⇒「セキュリティとメンテナンス」にあります。

設定のデフォルトは「アプリがコンピューターに変更を加えようとする場合のみ通知する」です。

このデフォルト設定「アプリがコンピューターに変更を加えようとする場合のみ通知する」では、前述の通り、アプリが権限昇格を要求したタイミングに発動します。(厳密には、32bit OS のインストールと思われる動作を自動検知して UAC を発動する「インストーラ検出テクノロジ」等の例外があります。UAC は 64bit OS アプリで native サポートされているため。)

もう一段階上の設定では「ユーザーがWindows設定を変更する場合」も通知するようになります。これは Windows Vista のデフォルトですが大不評を買い、Windows7 以降では上記設定がデフォルトになりました。例えばコントロールパネルで設定変更しようとするたびに例のセキュリティデスクトップでの同意画面が出てくるような設定です。

一度ご自身の PC でこの設定を上げてみれば「めんどくさい」ことが良くわかるでしょう。

ローカルポリシー/グループポリシーの UAC 設定

ローカル (もしくはグループ) ポリシーの「コンピューターの構成」⇒「Windows の設定」⇒「セキュリティの設定」⇒「ローカルポリシー」⇒「セキュリティオプション」に 10 個の設定があります。

ここで、「ビルトイン Administrator アカウントのための管理者承認モード」という設定で、ビルトイン Administrator が特別扱いされていることが分かります。

デフォルトで未定義になっていますが、未定義の場合は「ビルトイン Administrator に限っては管理者承認モードでは動かず、最初から Full administrator access token (整合性レベル High) が与えられる」動作になっています。

なお、クライアント OS (Windows 10 や 11 等) ではビルトイン administrator はデフォルトで無効になっており、そのまま無効が推奨されます。新たに作成した管理者ユーザーはビルトイン administrator ではないので、UAC が動作します。

一方、サーバ OS (Windows 2019 や 2022 等) ではデフォルトでビルトイン administrator (いわゆるローカル admin) が有効で、最初にパスワードを設定します。このユーザを使う場合は UAC が動作しません。

コメント

タイトルとURLをコピーしました