IIS 7.0 の URL 認証とは
はじめに
IIS の旧バージョンではアクセス許可は難題でした。IIS は Windows ID しか使用できないため、ファイル システムに移動してファイルやディレクトリでアクセス制御リストを設定する必要がありました。ACL の管理画面は複雑で、コンピューター間で承認規則をうまくコピーできないため、これは単調でうんざりする作業でした。
IIS 7.0 では URL 承認が導入されました。これにより、基になるファイル システム リソースではなく実際の URL に承認規則を設定できます。また、IIS 7.0 URL 承認構成が web.config ファイルに格納されており、承認規則をアプリケーション コンテンツと共に配布できます。次のチュートリアルで、Windows Server® 2008 および Windows Vista Service Pack 1 の IIS 7.0 URL 承認機能について説明します。
この記事には次のような内容が含まれています。
- 前提条件
- シナリオ
- ASP.NET の URL 承認と IIS 7.0 の URL 承認の相違点
- ドメイン アカウントおよびグループの使用
- Windows 以外の ID の使用
- まとめ
前提条件
このチュートリアルでは、既定インストールのほかに次の IIS 7.0 機能をインストールする必要があります。
- [インターネット インフォメーション サービス] - [World Wide Web サービス] - [アプリケーション開発機能] の下の [ASP.NET]
- [インターネット インフォメーション サービス] - [World Wide Web サービス] - [セキュリティ] の下の [URL 認証]
シナリオ
Alice、Bob および Administrators グループのみがアクセス可能な、セキュリティで保護されたディレクトリのあるシナリオをシミュレートしてみましょう。このディレクトリには、Bob のみがアクセス権を持つ bobsSecret.aspx というファイルがあります。
シナリオの設定
このシナリオには、Alice、Bob、Fred の 3 人のユーザーが必要です。Alice と Bob がメンバーの BobAndFriends という新規グループも必要です。サーバーマネージャー内のローカルユーザーとグループを使用して、または管理者特権のコマンド プロンプトを起動して次のコマンドを入力し、3 つのアカウントとグループを作成します。
net user Alice <password_of_your_choice> /add
net user Bob <password_of_your_choice> /add
net user Fred <password_of_your_choice> /add
net localgroup BobAndFriends /add
net localgroup BobAndFriends Alice /add
net localgroup BobAndFriends Bob /add
1. Explorer を開いて、%systemdrive%\inetpub\wwwroot ディレクトリに移動します。
2. "secure" というディレクトリを作成します。
3. "secure" ディレクトリに移動し、"default.aspx" という新規ファイルを作成します。この作業はメモ帳などのテキスト エディターで実行できます。
4. 次のコードを default.aspx ページに貼り付けます。
<%@Language="C#"%>
<%
string currentUser = Request.ServerVariables["LOGON_USER"];
if (currentUser == "")
currentUser = "anonymous";
Response.Write("<b>Current User:</b> " + currentUser);
%>
5. bobsSecret.aspx という別のファイルを作成し、次のコードを貼り付けます。
<%@Language="C#"%>
<%
string currentUser = Request.ServerVariables["LOGON_USER"];
if (currentUser == "")
currentUser = "anonymous";
Response.Write("<b>Current User:</b> " + currentUser);
Response.Write("
<b>My secret:</b> I used Apache before I discovered IIS7.</b> ");
%>
6. ここで http://localhost/secure/ と http://localhost/secure/bobsSecret.aspx を要求して 2 つの Web ページが機能するかどうかを確認します。
認証の構成
認証は、"誰" がアクセス権を要求しているのか、という問いに答えます。承認は、認証された場合、"誰" が実際にアクセス権を取得するのか、という問いに答えます。このため、URL 承認についてテストする前に、認証を有効にする必要があります。"誰" がアクセス権を要求しているかを知らなければ、"認証された場合" について答えることはできないためです。
1. [検索開始] メニューで「INETMGR」と入力して INETMGR を起動します。
2. 左のツリー ビューでコンピューター ノードを開き、[Default Web Site] ノードを開いて [secure] ディレクトリを選択します。
3. [認証] をダブルクリックします。
4. [匿名認証] を無効にして [基本認証] を有効にします。
5. ここで http://localhost/secure と http://localhost/secure/bobsSecret.aspx を再度要求します。資格情報を求められたら、ユーザー名 "Alice" とそのパスワードを入力します。"Alice" として認証されます。
注 :Internet Explorer を使用する場合、Ctrl キーを押しながら F5 キーを押すと ASP.Net ページのキャッシュされたバージョンが更新されます。
URL 認証の構成
次に、2 つのページをセキュリティで保護して Alice と Bob のみがアクセスできるようにします。
1. [secure] Web ディレクトリを再度ダブルクリックして、[承認規則] を選択します。
2. [すべてのユーザー] 規則を削除します。
3. [許可規則の追加...] をクリックして [役割またはユーザー グループの指定:] ラジオ ボタンを選択し、「BobAndFriends」を追加して [OK] ボタンをクリックします。
4. Internet Explorer は前のステップで入力した資格情報をキャッシュするため、すべての Internet Explorer ウィンドウを閉じます。
5. Internet Explorer を開き、Fred の資格情報を使用してページへのアクセスを試みます。ページにアクセスできません。
6. 次に、Bob または Alice の資格情報でアクセスを試みます。ページにアクセスできます。
単一 Web ページに対する URL 認証の構成
この時点で、Alice が BobsSecret.aspx にアクセスできる、という問題がまだ残っています。この問題を解決する方法を次に示します。
1. [secure] Web ディレクトリを再度ダブルクリックして、ページ下部にある [コンテンツ ビュー] を選択します。
2. [default.aspx] および [bobsSecret.aspx] という名前の [secure] フォルダーに、ファイルのリストが表示されます。
3. [bobsSecret.aspx] を右クリックして [機能ビュー] を選択します。
4. ステータス バーに示すように、bobsSecret.aspx ページに対してのみ変更を加えます。
5. [承認規則] を再度選択します。継承された設定が表示されます。すなわち、BobsAndFriends グループは bobsSecret.aspx にアクセスできます。
6. "BobsAndFriends" 規則を削除します。
7. 次に [許可規則の追加...] をクリックします。
8. [指定されたユーザー:] ラジオ ボタンをクリックして「Bob」と入力し、[OK] をクリックします。
9. すべての Internet Explorer ウィンドウを閉じて、http://localhost/secure/bobsSecret.aspx を要求します。
10. Bob の資格情報を入力した場合のみアクセスできます。
URL 承認に関する高度なトピック
次の段落では、URL 承認に関する高度なトピックについて説明します。
構成
URL 承認の設定にユーザー インターフェイスを使用する必要はありません。URL 承認規則は、web.config ファイルで直接指定できます。IIS 7.0 の <authorization> 構成セクションは既定では委任されています。承認規則を Web コンテンツと共に配布できます。以下に、この手順を実行後の %systemdrive%\inetpub\wwwroot\secure\web.config ファイルを示します。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<security>
<authorization>
<remove users="*" roles="" verbs="" />
<add accessType="Allow" roles="BobAndFriends" />
</authorization>
</security>
</system.webServer>
<location path="bobsSecret.aspx">
<system.webServer>
<security>
<authorization>
<remove users="" roles="BobAndFriends" verbs="" />
<add accessType="Allow" users="Bob" />
</authorization>
</security>
</system.webServer>
</location>
</configuration>
ASP.NET の URL 承認と IIS 7.0 の URL 承認の相違点
ASP.NET の URL 承認と IIS 7.0 の URL 承認には、小さな、しかし重要な相違点があります。両方のモジュールとも、IIS 7.0 セットアップによってインストールできます。IIS 7.0 の URL 承認は、IIS 7.0 セットアップ ユーザー インターフェイスで [URL 承認] 機能をインストールする際にインストールされます。
ASP.NET の URL 承認は、IIS 7.0 の上に ASP.NET をインストールする際にインストールされます。ASP.NET を詳しくご存じの場合は、ASP.NET の URL 承認が System.Web.Security.UrlAuthorizationModule モジュールに実装されていることを思い出してください。対応する構成セクションは system.web/authorization です。次に構成エントリを示します。
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />
IIS 7.0 の URL 承認モジュールは、グローバル モジュール urlauthz.dll に実装されています。
<add name="UrlAuthorizationModule" image="%windir%\System32\inetsrv\urlauthz.dll" />
ASP.NET UrlAuthorization モジュールには managedHandler という必須条件があることを念頭に置く必要があります。この必須条件は、URL 承認モジュールが、要求を処理するコードがマネージ コード (一般に .aspx または .asmx ページ) にマップされるときにのみ起動されることを示しています。他方、IIS 7.0 の URL 承認はすべてのコンテンツに適用されます。必須条件 managedHandler は ASP.NET UrlAuthorization モジュールから削除できます。これは、すべての要求 (.html または .jpg ページに対する要求など) がマネージ コードを実行する場合に起こり得る、パフォーマンスの低下を防ぐためです。
規則の評価
IIS 7.0 と 2 つの URL 承認モジュールが承認規則を評価する順序にも、相違点があります。ASP.NET の URL 承認は開発者中心型であり、開発者が規則を完全に制御できます。IIS 7.0 の URL 承認は管理者を念頭に置いており、管理者が設定した規則を開発者が上書きできないようになっています。
例 :
管理者は、特定サイトのすべてのユーザーを認証する必要があると考えています。それには、サイトのルートで次の構成を設定します。
<authorization lockElements="clear">
<add accessType="Deny" users="*" />
</authorization>
この構成では、匿名ユーザー (* = 匿名ユーザー、? = 認証されたユーザー) へのアクセスを拒否します。lockElements="clear" により、下位レベルのユーザーはこの設定の継承をクリアできなくなります。設定は、このサイトのすべてのアプリケーションおよび仮想ディレクトリに継承されます。下位レベルで <clear/> ステートメントを使用しようとすると、ロック違反になります。
構成のロックの詳細については、http://msdn.microsoft.com/ja-jp/library/ms178693.aspx を参照してください。
ASP.NET の URL 承認では、clear 要素もロックできます。問題は、ASP.NET の URL 承認では下位から上位に承認規則を評価すること、つまり、親規則を評価する前に現在の web.config ファイルの規則を評価することです。一致が見つかり次第、アクセスは許可または拒否されます。上述の例では、セキュリティで保護された web.config ファイルで承認規則として <add users="*"/> を指定することで、依然として匿名ユーザーにアクセス権を付与できます。web.config ファイルの承認規則が最初に評価されるため、匿名ユーザーはアクセス権を付与されます。
IIS 7.0 の URL 承認モジュールでは、最初に拒否規則を評価します。匿名ユーザーへのアクセスは拒否されるため、この規則は上書きできません。その他の大きな相違点は、親規則が最初に評価される点です。上位レベルで Fred へのアクセスを拒否した場合、下位レベルで Fred へのアクセスを許可することはできません。
相違点 :
相違点 |
ASP.NET の URL 承認の動作 |
IIS 7.0 の URL 承認の動作 |
規則の評価 |
順序 : a) 下位レベルから親へ b) 規則のコレクションに表示された順序 |
順序 : a) 拒否規則が最初に評価され、親から評価を開始 b) 許可規則を親から開始 c) 規則のコレクションに表示された順序 |
IIS 7.0 のユーザー インターフェイス |
IIS 7.0 のユーザー インターフェイスなし |
"承認規則" ユーザー インターフェイス |
構成セクション |
system.web/authorization |
system.webServer/security/authorization |
モジュール |
System.Web.Security.UrlAuthorization |
%windir%\system32\inetsrv\urlauthz.dll |
コンテンツ |
マネージ ハンドラーにマップされるコンテンツにのみ適用 (必須条件 managedHandler を使用してオフにできる) |
すべてのコンテンツに適用 |
ドメイン アカウントおよびグループの使用
以下を使用して、ドメイン アカウントおよびグループを指定する必要があります。
<domainname or username>\<user>
この例では machinename を使用しており、アカウントがコンピューター iis7test で作成されたと想定しています。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<security>
<authorization>
<remove users="*" roles="" verbs="" />
<add accessType="Allow" roles="iis7test\BobAndFriends" />
</authorization>
</security>
</system.webServer>
<location path="bobsSecret.aspx">
<system.webServer>
<security>
<authorization>
<remove users="" roles="iis7test\BobAndFriends" verbs="" />
<add accessType="Allow" users="iis7test\Bob" />
</authorization>
</security>
</system.webServer>
</location>
</configuration>
Windows 以外の ID の使用
URL 承認は Windows ID のためだけの機能ではありません。Windows 以外にも使用できます。独自の認証モジュールを記述する場合、ASP.NET メンバーシップとロールと共に、およびカスタム ID に使用してください。
まとめ
URL 承認は Web アプリケーションの承認規則を指定する、新しい強力な方法です。Windows アクセス制御リストを使用せずに XML で規則を指定できるようになりました。