Windows Azure の Adminモード

じつは 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よりはわかりやすい気がしますけど)

気力が尽きたので今日はこのへんで。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中