目次||

6 セキュリティ管理


6.1 アプレットおよびアプリケーションの管理

現状では、すべてのJava 2 SDKシステム・コードは、SecurityManagerメソッドを呼び出して、現在有効なポリシーをチェックし、アクセス制御チェックを実行します。通常、アプレットの実行中には、セキュリティ・マネージャ(SecurityManagerの実装)がインストールされています。appletviewerおよびNetscapeやMicrosoftなどの一般的なブラウザは、セキュリティ・マネージャをインストールします。

セキュリティ・マネージャは、アプリケーションの実行中に自動的にインストールされるわけではありません。ローカル・ファイル・システムのアプリケーションに対して、ダウンロードしたアプレットに対するのと同じセキュリティ・ポリシーを適用するには、アプリケーションを実行するユーザーが、次のように新しい「-Djava.security.manager」コマンド行引数(java.security.managerプロパティの値を設定する)を使ってJava仮想マシンを呼び出す必要があります。

    java -Djava.security.manager  SomeApp
あるいは、アプリケーション自体が、java.lang.SystemクラスのsetSecurityManagerメソッドを呼び出して、セキュリティ・マネージャをインストールする必要があります。

特定のセキュリティ・マネージャをコマンド行で指定できます。その場合、次に示すように「-Djava.security.manager」のあとに、等号、およびセキュリティ・マネージャとして使用するクラスの名前を指定します。

    java -Djava.security.manager=COM.abc.MySecMgr  SomeApp
セキュリティ・マネージャが指定されない場合、デフォルトで組み込まれるセキュリティ・マネージャが使用されます(アプリケーションが別のセキュリティ・マネージャをインストールする場合を除く)。次のコードはすべて等価であり、デフォルトのセキュリティ・マネージャを使用します。
    java -Djava.security.manager  SomeApp
    java -Djava.security.manager=""  SomeApp
    java -Djava.security.manager=default  SomeApp
Java 2 SDKにはjava.class.pathというプロパティが含まれます。ローカル・ファイル・システムに格納されるものの、基底クラスとしては扱われないクラス(SDKに組込みのクラスなど)は、このパスに置かれます。このパスのクラスは、安全なクラス・ローダーによってロードされ、実施中のセキュリティ・ポリシーに従います。

また、「-Djava.security.policy」コマンド行引数により、使用するポリシー・ファイルを指定できます。このコマンド行引数の詳細については、「デフォルト・システムおよびユーザー・ポリシー・ファイル」セクションで説明します。基本的に、コマンド行に「-Djava.security.policy」を含めない場合、セキュリティ・プロパティ・ファイルで指定されたポリシー・ファイルが使用されます。

「-Djava.security.policy」コマンド行引数を使用して、アプリケーションの実行の呼出し時に、追加のポリシー・ファイルまたは別のポリシー・ファイルを指定できます。たとえば、次のように入力した場合(ここで、pURLはポリシー・ファイルの位置を指定するURL)、セキュリティ・プロパティ・ファイルに指定されたすべてのポリシー・ファイルに加えて、指定したポリシー・ファイルがロードされます。

    java -Djava.security.manager -Djava.security.policy=pURL SomeApp
代わりに「==」を使って次のコマンドを記述すると、指定されたポリシー・ファイルだけが使用され、その他のポリシー・ファイルはすべて無視されます。
java -Djava.security.manager -Djava.security.policy==pURL SomeApp

6.2 SecurityManagerとAccessController

アクセス制御の新しいメカニズムは、完全に下位互換性があります。たとえば、SecurityManager内のcheckPermissionメソッドの大部分の実装は、SecurityManagerの新しいcheckPermissionメソッドを呼び出す(デフォルトの実装ではAccessControllerのcheckメソッドを呼び出す)ように変更されましたが、それらのメソッドはすべてサポートされています。特定の内部セキュリティ・チェックは、パラメータ化される場合を除いてSecurityManagerクラス内に引き続きあります。

現時点では、SecurityManagerを呼び出してクラス・ローダーの存在をチェックするかわりに、AccessControllerを呼び出すようにシステム・コードを変更していません。これは、SecurityManagerをサブクラス化し、checkメソッドをカスタマイズするサード・パーティのアプリケーションが存在する可能性があるからです。実際のところ、デフォルトで単にAccessController.checkPermissionを呼び出す新しいメソッドSecurityManager.checkPermissionを追加しました。

SecurityManagerとAccessControllerの関係を理解するには、SecurityManagerがアクセス制御の中心的な概念を表しており、AccessControllerがdoPrivilegedメソッドなど特殊な機能を使用した特定のアクセス制御アルゴリズムを実装していることに気付くだけで十分です。SecurityManagerを最新に保つことにより、下位互換性(以前のバージョンのJDKに基づく独自のセキュリティ・マネージャ・クラスを記述したアプリケーションとの互換性など)、および柔軟性(セキュリティ・モデルをカスタマイズして必須アクセス制御または複数レベルのセキュリティを実装するなど)を維持しています。AccessControllerを提供することで、もっとも制限が大きいと考え、ほとんどのシナリオで大規模なセキュリティ・コードを記述しなければならない重荷から一般的なプログラマを解放するアルゴリズムを組み込んでいます。

アプリケーション・コードでAccessControllerを使用することを強くお薦めします。一方、セキュリティ・マネージャの(サブクラス化による)カスタマイズは、最後の手段にし、細心の注意を払って実行してください。さらに、標準セキュリティ・チェックを呼び出す前に常に時間をチェックするようなカスタマイズされたセキュリティ・マネージャには、適切な場合にいつでもAccessControllerが提供するアルゴリズムを使用でき、使用する必要があります。

覚えておくことの1つは、独自のSecurityManagerを実装する場合、それを信頼されるソフトウェアとしてインストールし、それにjava.security.AllPermissionを付与すべきであるということです。これを実行する方法はいくつかあります。


6.3 補助ツール

このセクションでは、新しいセキュリティ機能の展開を支援する3つのツールの使用法について簡単に説明します。これらのツールは、今後1つにパッケージ化される予定です。

6.3.1 鍵および証明書管理ツール

keytoolは、鍵と証明書を管理するためのユーティリティです。それにより、自己認証(他のユーザーまたはサービスに対して、ユーザーが自分自身を認証する)やデータの整合性とデジタル署名を使用した認証サービスで使用するための独自の公開鍵と秘密鍵のペアおよび関連証明書を管理できます。認証情報には、X.509証明書のシーケンス(チェーン)と、関連の秘密鍵(いわゆる「別名」によって参照可能)の両方が含まれます。このツールは、証明書(ユーザーにより「信頼されている」)も管理します。証明書は、認証情報と同じデータベースに格納され、「別名」によって参照できます。

keytoolは、鍵と証明書をキーストアに格納します。デフォルトのキーストア実装は、キーストアをファイルとして実装します。キーストアは、非公開鍵をパスワードで保護します。

X.509証明書のチェーンは、証明書発行局(CA)という組織によって提供されます。アイデンティティ(CAを含む)は、その非公開鍵を使用して、オブジェクト(SSLを使用してセキュリティ設定したチャネルなど)との関係、署名したコードのアーカイブとの関係、および発行したX.509証明書(CA用)との関係を認証します。ブートストラップ・ツールとして、-genkeyコマンドを使用して生成した証明書は、証明書発行局が証明書チェーンを返すまで使用される可能性があります。

このデータベース内の非公開鍵は、不適切に公開されないように常に暗号化されて保存されます。データベースにアクセスするか、データベースを変更する場合には、パスワードが要求されます。これらの非公開鍵は、複数の単語で構成される「パスワード」を使用して暗号化されます。パスワードを忘れた場合、認証鍵を復元することはできません。

実際、キーストア内の各非公開鍵は、個々のパスワードによって保護することができます。このパスワードは、キーストアの全体的な整合性を保護するパスワードと同じである場合も、異なる場合もあります。

現在、このツールは、コマンド行でシェル・プロンプトに、単に「keytool」と入力して使用するようになっています。keytoolは、適切なJavaクラスを実行するスクリプトでSDKに組み込まれています。

各コマンドのコマンド行オプションは、任意の順序で指定できます。不正確なオプションを入力したり、「keytool -help」と入力すると、次のようなツールの使用法の概略が出力デバイス(シェル・ウィンドウなど)に出力されます。

% keytool -help
KeyTool usage:

-certreq     [-v] [-alias <alias>] [-sigalg <sigalg>]
             [-file <certreq_file>] [-keypass <keypass>]
             [-keystore <keystore>] [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-delete      [-v] -alias <alias>
             [-keystore <keystore>] [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-export      [-v] [rfc] [-alias <alias>] [-file <cert_file>]
             [-keystore <keystore>] [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-genkey      [-v] [-alias <alias>] [-keyalg <keyalg>]
             [-keysize <keysize>] [-sigalg <sigalg>]
             [-dname <distinguished_name>] [-validity <valDays>]
             [-keypass <keypass>] [-keystore <keystore>]
             [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-help

-identitydb  [-v] [-file <idb_file>] [-keystore <keystore>]
             [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-import      [-v] [-noprompt] [-alias <alias>]
             [-file <cert_file>] [-keypass <keypass>]
             [-keystore <keystore>] [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-keyclone    [-v] [-alias <alias>] -dest <dest_alias>
             [-keypass <keypass>] [-new <new_keypass>]
             [-keystore <keystore>] [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-keypasswd   [-v] [-alias <alias>]
             [-keypass <old_keypass>] [-new <new_keypass>]
             [-keystore <keystore>] [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-list        [-v | -rfc] [-alias <alias>]
             [-keystore <keystore>] [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-printcert   [-v] [-file <cert_file>]

-selfcert    [-v] [-alias <alias>] [-sigalg <sigalg>]
             [-dname <distinguished_name>] [-validity <valDays>]
             [-keypass <keypass>] [-keystore <keystore>]
             [-storepass <storepass>]
             [-storetype <i>storetype</i>]

-storepasswd  [-v] [-new <new_storepass>]
             [-keystore <keystore>] [-storepass <storepass>]
              [-storetype <i>storetype</i>]

6.3.2 PolicyTool

PolicyToolは、グラフィカル・ユーザー・インタフェース(次の図を参照)で、ユーザー(システム管理者など)によるセキュリティ・ポリシーの指定、生成、編集、エクスポート、またはインポートを支援するツールです。このツールは、コマンド行でpolicytoolと入力すると呼び出されます。このツールもSDKに組み込まれたスクリプトで、適切な(非公開の)実装クラスを呼び出します。

使用法および最新のスクリーン・ショットを含む例については、PolicyToolのドキュメントを参照してください。ドキュメントは、policytool.htmlファイルに格納されており、このファイルはSDKがインストールされたディレクトリ内の次のディレクトリにあります。

/docs/technotes/tools/unix/
または
/docs/technotes/tools/windows/
ファイル区切り文字は、Windowsシステムでは、バックスラッシュになります。

「PolicyTool」ウィンドウのスクリーン・ショット


6.3.3 JAR署名および検証ツール

jarsignerツールを使用すると、Java Archives (JARファイル)にデジタル署名したり、その署名を検証したりすることができます。PolicyToolと同様、このツールはkeytoolによって管理されるキーストアに依存しています。使用方法の概略を次に示します。
% jarsigner
Usage: jarsigner [options] jar-file alias
       jarsigner -verify [options] jar-file
  [-keystore <url>]         keystore file location
  [-storepass <password>]   password for keystore integrity
  [-keypass <password>]     password for private key (if different)
  [-sigfile <file>]         name of .SF/.DSA file
  [-signedjar <file>]       name of signed JAR file
  [-verify]                 verify a signed JAR file
  [-verbose]                verbose output when signing/verifying
  [-certs]          display certificates when verbose and verifying
  [-internalsf]             include .SF file inside signature block
  [-sectionsonly]           don't compute hash of entire manifest
このツールもSDKに組み込まれたスクリプトです。このツールと既存のjarツールのスクリプトは、将来統合されて、署名付きまたは未署名のJARを作成する単一のコマンド行プリミティブになる可能性があります。

目次||

Copyright © 1993, 2016, Oracle and/or its affiliates. All rights reserved.