更新日: 2005 年 11 月 1 日

このコンテンツのポイント

  • ネットワークからの配置した場合の、コード アクセス セキュリティの作用
  • コード アクセス セキュリティのポリシー設定

今回紹介するコード

Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
    Dim regTest As RegistryKey
    ' レジストリ キーを作成します
    regTest = Registry.CurrentUser.CreateSubKey("SOFTWARE\Microsoft\TestCAS")

    ' レジストリ キーが作成できた場合は値を設定します
    If (Not regTest Is Nothing) Then
        regTest.SetValue("test", "テスト")
        regTest.Close()
    End If
End Sub
 

目次

はじめに
作成するアプリケーションの概要
クライアントアプリケーションの開発準備
画面のデザイン
コードの実装
実行する
ネットワークからの配置の設定
ネットワークからの配置の実行
セキュリティ ポリシー設定
おわりに

C# の内容はこちらに掲載しています。
10 行でズバリ !! コード アクセス セキュリティ (C#)

 


はじめに

コード アクセス セキュリティとは、不正なコードがシステム リソースに対して攻撃できないよう、セキュリティ ポリシーに従って、コードによるシステム リソースへのアクセスを制限するセキュリティ チェックの仕組みです。デフォルトのポリシー設定では、コード アクセス セキュリティによってシステムが守られているため、インターネットやイントラネットなど、ネットワークからの配置によって実行されたアプリケーションは、システム リソースへのアクセスが制限されています。ここでは、ネットワークからのソフトウェア配置を行い、コード アクセス セキュリティの作用を確認し、また、コード アクセス セキュリティの設定を通じて、その仕組みを理解します。

作成するアプリケーションの概要

今回作成するのは、レジストリ キーを作成し、そのレジストリに値を設定する Windows アプリケーションです。ネットワークからの配置を利用せずに、普通にアプリケーションを起動した場合、処理は正常に行われますが、ネットワークからの配置を利用した場合、レジストリ キーを作成するコードでセキュリティ例外が発生します。

クライアントアプリケーションの開発準備

Visual Studio 2005 を起動して、新規にプロジェクトを作成します([ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします)。ここでは、プロジェクトの種類ペインで [Visual Basic] を選択し、テンプレート ペインで、[Windows アプリケーション] を選択します。[プロジェクト名] ボックスに 「CasAppVB」 を入力します。[場所] ボックスには、任意のパスを入力します。 ここで、[OK] ボタンをクリックして、プロジェクトを作成します。

これでレジストリ キーを作成するアプリケーションの開発準備が完了しました。

図 1. Windows アプリケーションのプロジェクトを新規作成する

画面のデザイン

フォームのデザインは、Windows フォーム デザイナを使用し、ドラッグ アンド ドロップという直感的でビジュアルな手順で行うことができます。フォームのデザインについては「10 行でズバリ !! Windows フォームによるクライアント アプリケーション開発」をご参照ください。

画面左側に表示されているツールボックスの [すべての Windows フォーム] タブの中から、Button コントロールをフォーム デザイナ上にドラッグ アンド ドロップします。

図 2. 画面上に Button コントロールを配置する

コードの実装

画面上に配置された Button コントロールをダブルクリックするとコード エディタが表示されるので、次に必要な処理をコードとして記述していきます。

ソースコードの先頭に、Imports 文を使用して Microsoft.Win32 名前空間の使用を宣言します。この宣言によって、名前空間の修飾を省いたクラス名の表記だけで、Microsoft.Win32 名前空間内のクラス名が使用可能になります。

Visual Basic
Imports Microsoft.Win32;
 

次に自動生成された button1_Click ハンドラ内に以下のコードを記述します。

Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
    Dim regTest As RegistryKey
    ' レジストリ キーを作成します
    regTest = Registry.CurrentUser.CreateSubKey("SOFTWARE\Microsoft\TestCAS")

    ' レジストリ キーが作成できた場合は値を設定します
    If (Not regTest Is Nothing) Then
        regTest.SetValue("test", "テスト")
        regTest.Close()
    End If
End Sub
 

実行する

コードの記述が完了したら、実行します。

アプリケーションを実行させるには [F5] キーを押すか、[デバッグ] メニューの [デバッグ開始] をクリックします。アプリケーションが起動するので、フォーム内の [Button1] ボタンをクリックします。

図 3. アプリケーションが実行される

ボタンを押すことでレジストリ キーが作成されますので、レジストリエディタ (regedit.exe) を使って追加したキーを確認します。また、確認後はキーを削除します。

重要 : 追加したキー以外を削除した場合は、システムに影響を及ぼす可能性があります。十分に注意して作業を行って下さい。編集する前に、問題が発生した場合に備えて、レジストリの復元方法を理解しておくことをお勧めします。復元方法の詳細については、レジストリ エディタ のヘルプ トピック「レジストリを復元する」を参照してください。

ネットワークからの配置の設定

次にネットワークからの配置の設定を行います。.NET Framework 2.0 には、ソフトウェア配布のきめ細かい集中管理を行える「ClickOnce」という仕組みがありますが、ここでは簡単にするため、IIS にサブフォルダを一つ作り、そのフォルダに HTTP 経由でアクセスして、ダウンロードし配布する方法を行います。

エクスプローラなどを使用して、IIS のルートディレクトリ(既定では、C:\Inetpub\wwwroot\) の下に、サブフォルダ「Deployment」を作成します。このフォルダ C:\Inetpub\wwwroot\Deployment に、先に作成した「CasAppVB.exe」をコピーします。

ネットワークからの配置の実行

次にネットワークからの配置での実行です。[スタート] メニューから [ファイル名を指定して実行] をクリックし、[名前] ボックスに 「http://localhost/deployment/CasAppVB.exe」 を入力します (図 4)。

図 4. [名前] ボックスで URL を入力する

すると、一旦 Internet Explorer が表示されたのち、アプリケーションが起動します。これは、.NET Framework 1.1 の「ノータッチ デプロイメント」と呼ばれるソフトウェア配布方法を利用したものです。ここでは、ノータッチ デプロイメントそのものがテーマなのではなく、ネットワーク経由でアプリケーションがダウンロードされて、実行された点に着目してください。アプリケーション起動後、[Button1] ボタンをクリックすると 図 5 のようにエラーが表示されます。

図 5. ネットワークからの配置 コードでエラーが表示される

このエラーが発生した理由は、イントラネットからダウンロードされた .NET のアプリケーションは、セキュリティ ポリシーによってレジストリへのアクセスが許可されていないからです。

メッセージを確認したら、[終了] ボタンを押して、アプリケーションを終了します。

セキュリティ ポリシー設定

次にネットワークからの配置での実行でも作成したアプリケーションが正常に動作するように、セキュリティ ポリシーの設定を行います。ここでは、作成したアプリケーション「CasAppVB.exe」 がイントラネット内でネットワークからの配置実行された場合に、レジストリ アクセスを可能にするための設定を行います。 なお、これ以降で示すセキュリティ ポリシーの設定は、ツールを使って、ダウンロード先のコンピュータに対して、直接的に手動で行う方法です。この方法の代わりにClickOnce を使うと、もっと簡単に中央のサーバーからセキュリティの構成をすることができます。しかし、ここではコード アクセス セキュリティの仕組みを理解することが目的なので、あえて手動で一つ一つ設定することにします。

重要 : 今回に限らず、セキュリティ ポリシーを変更する際は、必ず、必要最小限の範囲でアクセス許可を与えるように設定して下さい。

ここで、行うことは、今回のサンプル アプリケーションが所属するコード グループを作成し、そのグループに対して、レジストリへのアクセスを可能にするアクセス許可を与えることです。

最初に Microsoft .NET Framework 2.0 構成 ([管理ツール] メニューから選択します) を起動します。そして、左ペインのツリーで、 [マイ コンピュータ] をクリックして、[ランタイム セキュリティ ポリシー] - [コンピュータ(Machine)] - [コード グループ] - [All_Code] と順に展開し、 [LocalIntranet_Zone] を右クリックします。

表示されたショートカット メニューから [新規作成] を選択します。選択すると [コード グループの作成] ダイアログ ボックス(図 6) が起動します。

図 6. コード グループの新規作成ウィザード

以降の操作は以下の表に従います。

表 1 - コード グループの新規作成ウィザード

No. 各ページのタイトル 作業内容
1 新しいコード グループの識別 名前に「TestGroup」と入力します。
2 条件の種類を選択する [このコードグループの条件の種類を選択します] ドロップダウン リストで「ハッシュ」を選択します。「ハッシュ」では、特定のハッシュ値を持つアプリケーションのコード グループが構成できます。
[インポート] ボタンを押し、作成したアプリケーション CasAppVB.exe を選択します。
3 コード グループにアクセス許可セットを割り当てる [新しいアクセス許可セットの作成] オプションを選択します。
4 新しいアクセス許可セットの識別 名前に [Registry] と入力します。
5 アクセス許可セットに個々のアクセス許可を割り当てます 左ペインで [レジストリ] を選択し、[追加] ボタンを押します。
6 アクセス許可の設定 [アセンブリに次のレジストリ キーへのアクセスを許可する] オプション ボタンが選択されていることを確認して、[キー] として「HKEY_CURRENT_USER\Software\ABCDCorp」を入力し、[読み取り]、[書き込み]、[作成] の各チェックボックスをチェックします。
[OK] ボタンを押します。

上記ポリシー設定の結果、作成した Windows アプリケーションのみがイントラネット経由のネットワークからの配置で実行しても、レジストリの操作を行うことができるようになります。

それでは、再度、ネットワークからの配置での実行を行います。先ほどと同様、[スタート] メニューから [ファイル名を指定して実行] をクリックし、 「http://localhost/deployment/CasAppVB.exe」 を入力します。 アプリケーションが起動したら、[Button1] ボタンを押します。

注意 : 「CasAppVB.exe」 をリビルドするとハッシュ値が変わりますので、上記で設定したポリシーは適用されません。その場合は上記作業表の No.2 を参考に、ハッシュ値を設定し直して下さい。

今回は、ポリシーを適用するアプリケーションをより厳密にするために「コード グループの条件の種類」として「ハッシュ」を利用しました。もちろん、コード アクセス セキュリティでは、「ハッシュ」だけでなく、署名情報やアプリケーション配置場所を利用したポリシー設定も可能なので、要件に合わせて必要最小限の範囲で適用されるポリシー設定を行って下さい。

おわりに

このようにコード アクセス セキュリティでは、ネットワークからの配置で実行されるコードを安全に実行するための機能を持っています。また、高度なカスタマイズが可能なポリシーにより、堅牢なセキュリティは維持しながら、ユーザの利便性を向上させることも可能になります。


Code Recipe

ページのトップへ