Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

管理者権限を手に入れろ! Windows Azure権限昇格編

Windows Azure新機能チュートリアル(2)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2011/04/25 14:00

 本稿では、Windows Azure SDK 1.3によって追加された権限昇格(Elevated Privileges)機能について概要と使用方法について紹介します。権限昇格機能によって、従来のWindows Azureでは利用できなかった管理者権限を利用できるようになり、より柔軟にWindows Azureを構成できるようになります。

目次

はじめに

 本稿では、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つのタイミングにおいて利用することができます。いずれも常に管理者権限で実行されるわけではなく、利用者が明示的に指定した場合にのみ、権限が昇格され管理者権限での操作が可能になります。

  1. スタートアップタスク
    ロールインスタンス起動前に任意のコマンドを実行できます。
  2. ランタイム
    RoleEntryPointクラスを管理者権限で実行できます。RoleEntryPointクラスとは、OnStart/Run/OnStopメソッドが定義されているロールインスタンスの起動クラスです。

 いずれの場合においても対話的な操作はできません。たとえば、UIベースのインストーラは起動しても操作ができないため、ソフトウェアのインストールを継続することができません。サイレントインストールが可能なものに限定されます。

 OSの構成変更もUIを使って行うことはできないため、コマンドラインベース、プログラムベースの処理を記述する必要があります。

 Windows Azureは、Windows 2008 ServerベースOSです。OS管理コマンド群は充実しており、PowerShellも搭載されています。UIが使えないデメリットは少ないでしょう。

スタートアップタスク

 スタートアップタスクとは、ロールインスタンス起動時に任意のコマンドを実行するための仕組みです。この時、実行権限を指定することができます。実行権限には、管理者または標準ユーザーのどちらかを選択することが、実行制御の仕組みとして、同期実行や非同期実行など指定することが、それぞれ可能です。

 スタートアップタスクは、サービス定義ファイル(ServiceDefinition.csdef)のStartup要素に記述します(リスト1)。

[リスト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要素の各属性については以下の表を参照してください。

Task要素の属性
属性 説明
commandLine string 実行形式ファイル(EXE)や、バッチファイルを指定します。
executeContext string コマンドを実行する権限を指定します。

limited デフォルト。ロールのホストプロセスと同一権限(標準ユーザ)で実行します。
elevated 管理者権限で実行します。
taskType string コマンドの動作を指定します。

simple デフォルト。システムはすべてのタスクが終了するまで待ち合わせします。(同期)
background システムは、タスクが終了するのを待ちません。(非同期)
foreground システムはすべてのタスクが終了するまで再起動しないことを除けば、backgroundと同様です。

 Variable要素の各属性については以下の表を参照してください。

Variable要素の属性
属性 説明
name string 環境変数の名前です。
value string 環境変数の値です。

 スタートアップタスクの構成例を以下に示します。リスト2の例では、task1.cmdが標準ユーザー権限で実行され、実行完了後にtask2.cmdが管理者権限で実行されます。

[リスト2]スタートアップ例1
<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の実行完了を待たずに実行されます。

[リスト3]スタートアップ例2
<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メソッドにコードとして記述する必要があります。

[リスト4]ランタイム要素
<WebRole name="WebRole1" />
  <Runtime executionContext="[limited|elevated]">
    <Environment>
      <Variable name="<variable-name>" value="<variable-value>"/>
    </Environment>
  </Runtime>
  ...
</WebRole>

 Runtime要素の各属性については以下の表を参照してください。Variable要素の各属性については、スタートアップタスクと同様です。

Runtime要素の属性
属性 説明
executeContext string コマンドを実行する権限を指定します。

limited デフォルト。ロールのホストプロセスと同一権限(標準ユーザ)で実行します。
elevated 管理者権限で実行します。

 ただし、Webロール上に展開されたWebアプリケーションは、SDK 1.3のフルIIS機能によってワーカープロセスで実行されます。このためWebアプリケーション自身は、管理者権限で動作するわけではありません。このあたりの詳細は、次回以降のフルIISの解説で紹介したいと思います。

権限昇格とVMロール

 ここまで説明を読んで、このような権限昇格機能を利用しなくても、同様のことをVMロールで実現できるのではないかと思われた方もいるかもしれません。確かにVMロールを使えば、権限昇格機能を使う以上にWindows Azureをカスタマイズし、自由にソフトウェアをインストールできます。しかし、Windows Azure最大の特徴であるPaaSプラットフォームの運用管理の自動化やスケールアウトのメリットを受けたいのなら、できるだけWeb/Workerロール + 権限昇格でアプリケーションを構成したほうが良いでしょう。

 

 VMロールの選択は、対話的な操作を必要とするソフトウェアのインストールが必要な場合や、複雑なOSの構成変更が必要な場合などに限定すべきだと考えます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

  • WINGSプロジェクト statemachine(statemachine)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2012年2月時点での登録メンバは37名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂き...

バックナンバー

連載:Windows Azure新機能チュートリアル

もっと読む

All contents copyright © 2006-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5