はじめに
本稿では、Windows Azure SDK 1.3によって追加された権限昇格(Elevated Privileges)機能について概要と使用方法について紹介します。権限昇格機能によって、従来のWindows Azureでは利用できなかった管理者権限を利用できるようになり、より柔軟にWindows Azureを構成できるようになります。
対象読者
- Windows Azureの新機能に興味のある方。
- Windows Azureのサブスクリプションを持っており、Azureを利用したことがある方。
必要な環境
- Windows Azureサブスクリプション
- Visual Studio 2010もしくは、Visual Web Developer 2010 Express
- Windows Azure Tools for Microsoft Visual Studio November 2011以降 (Windows Azure SDK 含む)
権限昇格とは
権限昇格(Elevated Privileges)機能とは、PDC10発表以前は管理者モード(Admin Mode)と呼ばれていたもので、一時的に管理者権限を得ることができる機能です。従来のWindows Azureは、管理者権限が必要な操作は一切許可されていませんでしたが、Windows SDK 1.3以降を利用することによって特定のタイミングで利用可能となりました。
管理者権限が得られることで、Windows Azureに対して以下のような操作が可能となります。これらの操作は、通常のWindows OSから見ればどれも普通に実現できることばかりです。Windows Azureだからといって特別な操作が可能となるわけではありません。したがって通常のWindows OSを構成するように各種コマンドを駆使し、カスタマイズが可能となります。
- ソフトウェアのインストール
- OSやIISの構成変更
- レジストリの書き込み
- COMコンポーネントの登録
管理者権限は、以下の2つのタイミングにおいて利用することができます。いずれも常に管理者権限で実行されるわけではなく、利用者が明示的に指定した場合にのみ、権限が昇格され管理者権限での操作が可能になります。
- スタートアップタスク
ロールインスタンス起動前に任意のコマンドを実行できます。 - ランタイム
RoleEntryPointクラスを管理者権限で実行できます。RoleEntryPointクラスとは、OnStart/Run/OnStopメソッドが定義されているロールインスタンスの起動クラスです。
いずれの場合においても対話的な操作はできません。たとえば、UIベースのインストーラは起動しても操作ができないため、ソフトウェアのインストールを継続することができません。サイレントインストールが可能なものに限定されます。
OSの構成変更もUIを使って行うことはできないため、コマンドラインベース、プログラムベースの処理を記述する必要があります。
Windows Azureは、Windows 2008 ServerベースOSです。OS管理コマンド群は充実しており、PowerShellも搭載されています。UIが使えないデメリットは少ないでしょう。
スタートアップタスク
スタートアップタスクとは、ロールインスタンス起動時に任意のコマンドを実行するための仕組みです。この時、実行権限を指定することができます。実行権限には、管理者または標準ユーザーのどちらかを選択することが、実行制御の仕組みとして、同期実行や非同期実行など指定することが、それぞれ可能です。
スタートアップタスクは、サービス定義ファイル(ServiceDefinition.csdef)のStartup要素に記述します(リスト1)。
<WebRole name="WebRole1" /> <Startup> <Task commandLine="<実行ファイル名>" executionContext="[limited|elevated]" taskType="[simple|foreground|background]"> <Environment> <Variable name="<variable-name>" value="<variable-value>"/> </Environment> </Task> </Startup> ... </WebRole1>
実行権限は、executionContext属性で指定します。elevatedなら管理者権限で実行し、limitedなら標準ユーザー権限で実行されます。taskTypeは実行制御の方法を指定し、simpleはコマンドの実行が終了するまで待ち合わせを行う同期実行を、backgroundは待ち合わせをしない非同期実行を意味します。
また、Task要素の子要素としてEnvironment要素とその子要素であるVariable要素を指定することができます。これらの要素により環境変数の指定が可能です。
Task要素の各属性については以下の表を参照してください。
属性 | 型 | 説明 |
commandLine | string | 実行形式ファイル(EXE)や、バッチファイルを指定します。 |
executeContext | string | コマンドを実行する権限を指定します。 ・limited デフォルト。ロールのホストプロセスと同一権限(標準ユーザ)で実行します。 ・elevated 管理者権限で実行します。 |
taskType | string | コマンドの動作を指定します。 ・simple デフォルト。システムはすべてのタスクが終了するまで待ち合わせします。(同期) ・background システムは、タスクが終了するのを待ちません。(非同期) ・foreground システムはすべてのタスクが終了するまで再起動しないことを除けば、backgroundと同様です。 |
Variable要素の各属性については以下の表を参照してください。
属性 | 型 | 説明 |
name | string | 環境変数の名前です。 |
value | string | 環境変数の値です。 |
スタートアップタスクの構成例を以下に示します。リスト2の例では、task1.cmdが標準ユーザー権限で実行され、実行完了後にtask2.cmdが管理者権限で実行されます。
<Startup> <Task commandLine="task1.cmd" executionContext="limited" taskType="simple" /> <Task commandLine="task2.cmd" executionContext="elevated" taskType="simple" /> </Startup>
リスト3の例では、taks1.cmdのtaskTypeにbackgroundが指定されているため非同期に実行されます。したがって、task2.cmdはtask1.cmdの実行完了を待たずに実行されます。
<Startup> <Task commandLine="task1.cmd" executionContext="limited" taskType="backgroup" /> <Task commandLine="task2.cmd" executionContext="limited" taskType="simple" /> </Startup>
スタートアップタスクは、管理者権限の有無にかかわらず、ロールの起動に先立って定型的なタスクを処理するのに役立ちます。
ランタイム
ランタイムの権限昇格とは、RoleEntryPointクラスを管理者権限で実行する仕組みです。ランタイムの権限昇格は、サービス定義ファイル(ServiceDefinition.csdef)のRuntime要素に記述します(リスト4)。
実行権限は、executionContext属性で指定します。elevatedなら管理者権限で実行し、limitedなら標準ユーザー権限で実行します。Runtime要素を指定しない場合は、limitedが既定値です。また、スタートアップタスクと同様にEnvironment/Variable要素で環境変数を指定することが可能です。
ランタイムにおける管理者権限が必要な操作は、OnStart/Run/OnStopメソッドにコードとして記述する必要があります。
<WebRole name="WebRole1" /> <Runtime executionContext="[limited|elevated]"> <Environment> <Variable name="<variable-name>" value="<variable-value>"/> </Environment> </Runtime> ... </WebRole>
Runtime要素の各属性については以下の表を参照してください。Variable要素の各属性については、スタートアップタスクと同様です。
属性 | 型 | 説明 |
executeContext | string | コマンドを実行する権限を指定します。 ・limited デフォルト。ロールのホストプロセスと同一権限(標準ユーザ)で実行します。 ・elevated 管理者権限で実行します。 |
ただし、Webロール上に展開されたWebアプリケーションは、SDK 1.3のフルIIS機能によってワーカープロセスで実行されます。このためWebアプリケーション自身は、管理者権限で動作するわけではありません。このあたりの詳細は、次回以降のフルIISの解説で紹介したいと思います。
ここまで説明を読んで、このような権限昇格機能を利用しなくても、同様のことをVMロールで実現できるのではないかと思われた方もいるかもしれません。確かにVMロールを使えば、権限昇格機能を使う以上にWindows Azureをカスタマイズし、自由にソフトウェアをインストールできます。しかし、Windows Azure最大の特徴であるPaaSプラットフォームの運用管理の自動化やスケールアウトのメリットを受けたいのなら、できるだけWeb/Workerロール + 権限昇格でアプリケーションを構成したほうが良いでしょう。
VMロールの選択は、対話的な操作を必要とするソフトウェアのインストールが必要な場合や、複雑なOSの構成変更が必要な場合などに限定すべきだと考えます。