じつは Windows Azure の Adminモードですが、Full IISとStartup Tasksと勘違いしてて、実装されてるよ的な話を聞いて切腹する勢いでございました。申し訳ございませぬ。
ということで、Adminモードで何が変わるのか、というところを今回はWeb Roleで簡単に調べたいと思います。
Adminモードの設定ですが、現時点のMSDNにはおいらが見る限りぜんぜん記述ありませんでした。スキーマファイルをVisual Studioで弄ってたらインテリセンスで教えてくれるぐらいのレベル。
今日報告されてた方がいらっしゃったので、そのうち反映されると思われますがまずは設定方法から。
- Runtime 要素
- 対象スキーマ:ServiceDefinition
- 親要素:WebRole または WorkerRole
- 子要素:Environment
- 属性:executionContext
- 値:limited … 既定の権限で動作(既定値) elevated … 特権で動作
設定例は以下のようになります。
また、せっかくなので Full IIS と Hosted Web Core でどうなるかも見てみようと思います。
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="WindowsAzureProject3" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1"> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Imports> <Import moduleName="Diagnostics" /> <Import moduleName="Connect" /> <Import moduleName="RemoteAccess" /> <Import moduleName="RemoteForwarder" /> </Imports> <Runtime executionContext="elevated" /> </WebRole> </ServiceDefinition>
Windows Azure SDK 1.3 でWeb Roleを新規作成すると既定でFull IISなコンフィグになっています。
Full IIS + Adminモードのコンフィグ例
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="WindowsAzureProject3" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1"> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Imports> <Import moduleName="Diagnostics" /> <Import moduleName="Connect" /> <Import moduleName="RemoteAccess" /> <Import moduleName="RemoteForwarder" /> </Imports> <Runtime executionContext="elevated"> </Runtime> </WebRole> </ServiceDefinition>
Hosted Web Core の場合は Sites要素を消せばよい(複数のサイトをホストしない/できない)ので、以下のようになります。
HWC + Adminモードのコンフィグ例
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="WindowsAzureProject3" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1"> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Imports> <Import moduleName="Diagnostics" /> <Import moduleName="Connect" /> <Import moduleName="RemoteAccess" /> <Import moduleName="RemoteForwarder" /> </Imports> <Runtime executionContext="elevated"> </Runtime> </WebRole> </ServiceDefinition>
さて、 Full IIS か Hosted Web Core (HWC)、 AdminモードかLimitedモードかで計4種類で実行してみます。
Full IIS + Admin モードの場合
| CurrentPrincipal.Identity.Name | N/A |
| WindowsIdentity.GetCurrent().Name | NT AUTHORITY\NETWork SERVICE |
| WaIISHost.exe の WebRole1.dllの場所 | E:\approot\bin\WebRole1.dll |
| w3wp.exe の WebRole1.dll の場所 | D:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\809d7cfc\c8de04b0\assembly\dl3\a47c167503a815d_bf9bcb01\WebRole1.DLL |
| WaIISHost.exe の動作アカウント | NT AUTHORITY\SYSTEM |
| w3wp.exe の動作アカウント | NT AUTHORITY\NETWORK SERVICE |
Full IIS + Limited モードの場合
| CurrentPrincipal.Identity.Name | N/A |
| WindowsIdentity.GetCurrent().Name | NT AUTHORITY\NETWork SERVICE |
| WaIISHost.exe の WebRole1.dllの場所 | E:\approot\bin\WebRole1.dll |
| w3wp.exe の WebRole1.dll の場所 | D:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\809d7cfc\c8de04b0\assembly\dl3\a47c1675\6547ca0d_729bcb01\WebRole1.DLL |
| WaIISHost.exe の動作アカウント | CIS\<GUID> |
| w3wp.exe の動作アカウント | NT AUTHORITY\NETWORK SERVICE |
HWC + Admin モードの場合
| CurrentPrincipal.Identity.Name | N/A |
| WindowsIdentity.GetCurrent().Name | NT AUTHORITY\SYSTEM |
| WaWebHost.exe の WebRole1.dllの場所 | C:\Resources\aspNetTemp\a16b73bf4c274caebe7ba33b930f037f.WebRole1\root\70054715\70b1af42\assembly\dl3\220170d6\6547ca0d_729bcb01\WebRole1.DLL |
| WaWebHost.exe の動作アカウント | NT AUTHORITY\SYSTEM |
HWC + Limited モードの場合
| CurrentPrincipal.Identity.Name | N/A |
| WindowsIdentity.GetCurrent().Name | CIS\<GUID> |
| WaWebHost.exe の WebRole1.dllの場所 | C:\Resources\aspNetTemp\b7a878505a164ad39d84b262f8a30fb1.WebRole1\root\70054715\70b1af42\assembly\dl3\d1d67c6a\6547ca0d_729bcb01\WebRole1.DLL |
| WaWebHost.exe の動作アカウント | CIS\<GUID> |
結果は…
ざっくり纏めるとこんな感じでしょうか。
| Full IIS + Admin | Full IIS + Limited | HWC + Admin | HWC + Limited | |
| ホストするプロセス | WaIISHost.exe w3wp.exe |
WaIISHost.exe w3wp.exe |
WaWebHost.exe | WaWebHost.exe |
| Webアプリ内の権限 | NETWORK SERVICE | NETWORK SERVICE | LocalSystem | 既定の制限アカウント |
| RoleEntlyPoint内での権限 | LocalSystem | 既定の制限アカウント | LocalSystem | 既定の制限アカウント |
Full IIS と Hosted Web Core の違い
Full IISではIISの全機能が利用できるようになりました。さてこれはどういう事かというと、なんのことはない、IIS上で動作するようになっただけですね。
Full IISではない Windows Azure Web Roleアプリケーションは、Hosted Web Core (WaWebHost.exe)が Web Roleをホストします。(SDK 1.2以前はこのタイプしかありませんでした)
Full IISでは w3wp.exe (IIS)がWeb Roleをホストします。但し、RoleEntryPoint の OnStart 等を処理するのに同じWeb Roleのアセンブリが WaIISHost.exe という別のプロセスでホストされます。
Full IIS時の実行結果を見ると、Web Roleのアセンブリである WebRole1.dll がそれぞれのプロセスで別々にロードされていることがわかります。特に実際にWebアプリとして動作する部分(IIS/w3wp.exeでホストされる部分)は通常のIISと同じくASP.NETのテンポラリフォルダにロードされています。
ということで、ホストするプロセスが異なればAppDomainもかわるわけで、下記Blogに記載があるようなRoleEntryPointのOnStartで設定を読み込んでもASP.NET Webアプリケーションに引き継がれないといった問題になるわけですね。
Admin モードと Limited モードの違い
Admin モード(Elevated指定)の場合、WaIISHost.exe もしくは WaWebHost.exe が LocalSystem(NT AUTHORITY\SYSTEM)アカウントで動作するようになります。
Hosted Web Core の場合は WaWebHost.exe だけで動作するので単純ですが、Full IIS の場合は IIS(w3wp.exe)も動作するので注意が必要です。
というのも Full IIS の場合、Adminモード/Limitedモード関係なしにIISが NT AUTHORITY\NETWORK SERVICE アカウントで動作するので、ASP.NET Webアプリケーションの動作もこちらになります。
まとめ
Full IISの場合、Adminモードを指定しても特権が維持できるのはRoleEntryPoint内までで、ASP.NET Webアプリケーションでは異なる権限でプロセスがホストされます。
Hosted Web Coreの場合はAdminモードならLocalSystem、Limitedなら既定の制限されたアカウントでプロセスがホストされます。(ASP.NET Webアプリケーションもその権限になります)
ということで、特権を利用したい場合はWebアプリケーションのホスト方法(Full IISか否か)等とよく相談して決めましょう。
ちなみにWorkler Roleもきっと同じような感じで動くと思います。(IIS絡んだWeb Roleよりはわかりやすい気がしますけど)
気力が尽きたので今日はこのへんで。



