SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

アセンブリ署名とコードアクセスセキュリティ

厳密名を持つことによるメリットと詳細なアクセス許可の設定

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード Solution1.zip (46.6 KB)

メリット2:GACに登録することができるようになる

 厳密名を持つことにより、グローバルアセンブリキャッシュ(GAC)という、昔であれば「Windows\System32」フォルダに共有DLLを入れたかのような、運用をすることが可能になります。

 GACに登録することにより、アプリケーションは参照設定を行うものの、アプリケーションフォルダにDLLのローカルコピーを持たなくてもプログラムを実行できるようになります。

GACにアセンブリを設定した画面
GACにアセンブリを設定した画面

 GACへのアセンブリの登録は非常に慎重に行うべきですが、COM提供を行う場合などにはGACに入れる方が適切な場合もあります。

メリット3:コードアクセスセキュリティで厳密名による設定が可能になる

 今までのプログラムは、インストールするとすべての機能が使い放題でした。例えば、インストールさえ成功してしまえば、Cドライブの配下のファイルをすべて削除するといったこともNTFSのセキュリティ権限次第で可能でした。

 .NET Frameworkでは、「プログラムによるファイルへのアクセスをアプリケーションディレクトリのみに限定する」といったコントロールができるようになっています。それがコードアクセスセキュリティ(CAS)という機能です。

.NET Framework 2.0 Configuration
.NET Framework 2.0 Configuration

 このランタイムセキュリティポリシーでは、さまざまな条件でアクセス許可を設定することができます。アセンブリ署名をしていないアセンブリでは、ハッシュやURLなどの条件しか選ぶことができません。

ハッシュの条件設定画面
ハッシュの条件設定画面

 [ハッシュ]を選択した場合にはコンパイルの度に毎回変わってしまうので、バージョンアップする場合には毎回セキュリティポリシーを設定する必要があります。

 アセンブリ署名を行っておくと、[厳密な名前]という条件を指定できるようになり、「同じ署名が施されている場合には」という条件でアクセス許可を設定できます。

厳密な名前の条件設定画面
厳密な名前の条件設定画面

コードアクセスセキュリティでのアクセス許可の単位

 自分で作ったプログラムには、どのアクセス許可が必要なのでしょうか? 実は簡単に調べる必要があります。プロパティの[セキュリティ]タブの中にあるClickOnceセキュリティのアクセス許可という画面です。

プロパティ→[セキュリティ]画面
プロパティ→[セキュリティ]画面

 この画面の[ClickOnceセキュリティ設定を有効にする]をチェックし、[これは部分的に信頼するアプリケーションです]を選択して、アプリケーションがインストールされるゾーンを[(カスタム)]に変更します。

ゾーンをカスタムに設定した状態
ゾーンをカスタムに設定した状態

 この状態で[アクセス許可の検出]をクリックすると、次の画面のように必要なアクセス許可が反映されます。コンソールアプリケーションを作成しただけの状態では、SecurityPermissionと、UIPermissionが必要なことを読み取れると思います。

アクセス許可の検出結果
アクセス許可の検出結果

 実際に、これらのPermissionはさらに細分化されています。SecurityPermissionを選択してプロパティをクリックした結果が次の画面です。

アクセス許可の設定
アクセス許可の設定

 どのアセンブリも[アセンブリを有効にする]は必須です。これがないと起動することもできなくなります。

 このようにアセンブリがどのアクセス許可を必要としているかを調べることができますが、本当に何が必要かは自ら宣言する必要があります。

 例えば、自由にCドライブの内容を読み込みたい場合には、次のように宣言します。

FileIOPermissionの設定例(C#の場合)
[System.Security.Permissions.FileIOPermission(
    System.Security.Permissions.SecurityAction.Demand, Read = "c:\\")]
static void Main(string[] args)
{
    using ( System.IO.FileStream fs =
            new System.IO.FileStream("c:\\test", System.IO.FileMode.Create))
    {
        fs.WriteByte(0x99);
    }
}
FileIOPermissionの設定例(VB.NETの場合)
<System.Security.Permissions.FileIOPermission( _
    Security.Permissions.SecurityAction.Demand, Read:="c:\")> _
Sub Main()
    Using fs As New System.IO.FileStream("c:\ test", System.IO.FileMode.Create)
        fs.WriteByte(153)
    End Using
End Sub

 このようにFileIOPermissionを宣言することにより、先ほどの必要なアクセス許可の設定にも反映されるようになります。

FileIOPermissionを設定した後のアクセス許可の設定
FileIOPermissionを設定した後のアクセス許可の設定

 このようにCASでプログラムごとに詳細なアクセス許可を設定する場合にも、厳密名を持っているとバージョンアップごとに許可を与える必要がなくなり、運用がしやすくなります。

 動くプログラムを提供するだけでなく、動かすために必要なアクセス許可や運用のしやすさなども考慮していきたいです。

必要なアクセス許可の調査
 SDKに付属しているpermcalcというツールを使うと、アセンブリにどれだけのアクセス許可が必要なのかを調べることができます。

さいごに

 いかがでしたか? Visual Studio 2005からは、アセンブリ署名を非常に簡単に行えるようになっており、気軽に設定することができます。

 本来、アセンブリ署名を行うキーファイルは、ソフトウェア会社に固有となるようにすることが望ましいのですが、厳重な署名の管理を行う必要があるため、難しい場合もあります。そのような場合は署名を行わないというのではなく、プロジェクト単位に署名を行うだけでも、そのメリットは計り知れません。

 ぜひあなたのプロジェクトでも、アセンブリ署名の設定を実施してみませんか?

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

中 博俊(ナカ ヒロトシ)

大阪でフリーのソフトウェアエンジニア兼テクニカルライターとして日々新技術で楽しんでいる。MSMVP for C# ブログ:http://blogs.wankuma.com/naka/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/424 2006/07/15 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング