Java™ プラットフォームは、セキュリティーを重視して設計されました。その中核では、Java 言語自体が型保証されており、自動ガベージコレクションを提供してアプリケーションコードの堅牢性を強化しています。安全なクラスロードおよび検証機構によって、正当な Java コードのみが実行されます。
Java プラットフォームの初期バージョンでは、パブリックネットワークからダウンロードされた Java アプレットなど、潜在的に信頼されないコードを実行するための安全な環境を作成しました。プラットフォームが発展し、その配備範囲が拡大するにつれて、Java セキュリティーアーキテクチャーは増加するサービスセットをサポートするために進化しました。現在、アーキテクチャーには、アプリケーションプログラミングインタフェース (API)、ツール、および一般的に使用されるセキュリティーアルゴリズム、機構、プロトコルの実装の、大規模なセットが含まれています。これにより、アプリケーションを記述するための包括的なセキュリティーフレームワークを開発者に提供し、ユーザーまたは管理者にアプリケーションを安全に管理するための一連のツールを提供しています。
Java セキュリティー API は、広範な領域に及びます。暗号化および公開鍵インフラストラクチャー (PKI) インタフェースは、安全なアプリケーションを開発するための基盤となります。認証およびアクセス制御を実行するためのインタフェースにより、アプリケーションは、保護されたリソースへの承認されていないアクセスから保護できます。
API では、アルゴリズムおよびその他のセキュリティーサービスについて、複数の相互運用性のある実装が可能です。サービスは「プロバイダ」に実装されます。プロバイダは、アプリケーションがセキュリティーサービスの実装を意識せずに簡単に取得できるようにする標準インタフェースによって、Java プラットフォームにプラグインされます。これにより、開発者は、複雑なセキュリティー機構を実際に実装する方法ではなく、セキュリティーをアプリケーションに統合する方法に重点を置くことができます。
Java プラットフォームには、基本的なセキュリティーサービスを実装する多数のプロバイダが含まれています。追加のカスタムプロバイダをインストールすることも可能です。これにより、開発者は新しいセキュリティー機構でプラットフォームを拡張できます。
このドキュメントでは、安全な言語機能からセキュリティー API、ツール、および組み込みプロバイダサービスにいたるまで、Java プラットフォームのセキュリティーの概要について説明します。該当する場合には、主要なパッケージおよびクラスについて説明します。このドキュメントは、Java™ SE version 6 に基づいています。
Java 言語は、型保証されるように設計されており、簡単に使用できます。自動メモリー管理、ガベージコレクション、および配列の範囲チェックを備えています。これにより、開発者の全体的なプログラミングの負荷を軽減し、見つかりにくいプログラミングエラーの減少および安全で堅牢なコードを実現します。
また、Java 言語は、異なるアクセス修飾子を定義して Java クラス、メソッド、およびフィールドに割り当てることができるため、開発者はクラス実装へのアクセスを必要に応じて制限できます。特に、この言語は次の 4 つの異なるアクセスレベルを定義します。private
、protected
、public
、および、指定されない場合は package
です。もっともオープンなアクセス指定子は public
で、アクセスはすべての人に許可されます。アクセスをもっとも制限する修飾子は private
で、アクセスは private メンバー (メソッドなど) が定義された特定のクラス以外では許可されません。protected
修飾子は、任意のサブクラス、または同じパッケージ内のほかのクラスへのアクセスを許可します。package レベルのアクセスは、同じパッケージ内のクラスへのアクセスのみを許可します。
コンパイラは、Java プログラムをマシンに依存しないバイトコード表現に変換します。正当なバイトコードのみが Java Runtime で実行されるように、バイトコードベリファイアが呼び出されます。これは、バイトコードが Java 言語仕様に準拠しており、Java の言語規則または名前空間制限に違反していないことをチェックします。ベリファイアは、メモリー管理違反、スタックアンダーフローまたはオーバーフロー、および不正な型キャストもチェックします。バイトコードが検証されると、Java Runtime はそれらの実行を準備します。
Java プラットフォームでは、暗号化、公開鍵インフラストラクチャー、認証、安全な通信、アクセス制御など、主要なセキュリティー分野に渡る一連の API が定義されています。これらの API によって、開発者はアプリケーションコードにセキュリティーを簡単に統合できます。これらは、次の方針に基づいて設計されました。
アプリケーションでセキュリティーを実装する必要はありません。Java プラットフォームからセキュリティーサービスを要求できます。セキュリティーサービスはプロバイダ (下記を参照) に実装されています。プロバイダは、標準インタフェースによって Java プラットフォームにプラグインされます。アプリケーションは、複数の独立したプロバイダにセキュリティー機能を依存する場合があります。
プロバイダは、アプリケーション間で相互運用できます。具体的には、アプリケーションは特定のプロバイダにバインドされず、プロバイダは特定のアプリケーションにバインドされません。
Java プラットフォームには、現在広く使用されている基本的なセキュリティーサービスを実装する多数の組み込みプロバイダが含まれています。ただし、一部のアプリケーションは、まだ実装されていない普及しつつある規格や独自のサービスに依存している場合があります。Java プラットフォームは、そのようなサービスを実装するカスタムプロバイダのインストールをサポートします。
java.security.Provider
クラスは、セキュリティープロバイダの概念を Java プラットフォームでカプセル化します。プロバイダの名前を指定し、実装するセキュリティーサービスを一覧します。複数のプロバイダが同時に構成される場合があり、それらは優先順に一覧されます。セキュリティーサービスが要求されると、そのサービスを実装する、優先順位が一番高いプロバイダが選択されます。
アプリケーションは、関連する getInstance
メソッドによって、基盤となるプロバイダからセキュリティーサービスを取得します。たとえば、メッセージダイジェストの作成は、プロバイダから利用可能なサービスの 1 つのタイプを表します。第 4 項では、メッセージダイジェストおよびその他の暗号化サービスについて説明します。アプリケーションは、java.security.MessageDigest
クラスで getInstance
メソッドを呼び出して、MD5 など、特定のメッセージダイジェストアルゴリズムの実装を取得します。
MessageDigest md = MessageDigest.getInstance("MD5");
プログラムはオプションで、次に示すようにプロバイダ名を指定して、特定のプロバイダから実装を要求する場合があります。
MessageDigest md = MessageDigest.getInstance("MD5", "ProviderC");
図 1 および図 2 は、MD5 メッセージダイジェスト実装を要求するための、これらのオプションを示しています。どちらの図も、メッセージダイジェストアルゴリズムを実装する 3 つのプロバイダを示しています。プロバイダは、左から右への優先順位 (1~3) で並べられています。図 1 では、アプリケーションはプロバイダ名を指定せずに MD5 アルゴリズム実装を要求しています。プロバイダが優先順位に従って検索され、そのアルゴリズムを提供する最初のプロバイダ ProviderB から実装が返されます。図 2 では、アプリケーションは特定のプロバイダ ProviderC から MD5 アルゴリズム実装を要求しています。この場合は、優先順位の高いプロバイダ ProviderB も MD5 実装を提供しますが、指定されたプロバイダから実装が返されます。
図 1 プロバイダ検索 | 図 2 特定のプロバイダの要求 |
Sun Microsystems の Java プラットフォームの実装には、アプリケーションによって使用できる基本的なセキュリティーサービスを実装する、多数の事前に構成されたデフォルトプロバイダが含まれています。Java プラットフォームのほかのベンダーの実装には、ベンダー固有のセキュリティーサービスのセットをカプセル化した、異なるプロバイダのセットが含まれている場合があります。このドキュメントで組み込みのデフォルトプロバイダに言及する場合は、Sun の実装で利用可能なプロバイダを指しています。
さまざまなセキュリティー領域 (暗号化、認証など) に関する以降の各項には、デフォルトプロバイダによって提供される関連サービスの説明が含まれています。付録 C の表に、すべてのデフォルトプロバイダがまとめられています。
このドキュメントで説明されている Java セキュリティーの特定の側面 (プロバイダの構成など) は、セキュリティープロパティーを設定することによってカスタマイズできます。セキュリティープロパティーファイルでセキュリティープロパティーを静的に設定できます。このファイルは、デフォルトでは、Java™ Runtime Environment (JRE) がインストールされているディレクトリの lib/security ディレクトリにある java.security ファイルです。セキュリティープロパティーは、java.security
パッケージ内の Security
クラスの適切なメソッドを呼び出すことによって、動的に設定することもできます。
このドキュメントで説明されているツールおよびコマンドは、すべて ~jre/bin
ディレクトリにあります。~jre
は、JRE がインストールされているディレクトリを表します。第 5 項で説明する cacerts ファイルは、~jre/lib/security
にあります。
Java 暗号化アーキテクチャーは、Java プラットフォームの暗号化機能へのアクセスおよび開発のためのフレームワークです。次のような、さまざまな暗号化サービスの API が含まれています。
歴史的な理由 (輸出規制) により、暗号化 API は 2 つの別個のパッケージに編成されています。java.security
パッケージには、輸出規制の対象ではないクラス (Signature
や MessageDigest
など) が含まれています。javax.crypto
パッケージには、輸出規制の対象のクラス (Cipher
や KeyAgreement
など) が含まれています。
暗号化インタフェースはプロバイダベースであり、複数の相互運用性のある暗号化実装が可能です。ソフトウェアで暗号化操作を行うプロバイダもあれば、スマートカードデバイスやハードウェア暗号化アクセラレータなどのハードウェアトークン上で暗号化操作を行うプロバイダもあります。輸出規制の対象のサービスを実装するプロバイダには、デジタル署名を行う必要があります。
Java プラットフォームには、もっとも一般的に使用される暗号化アルゴリズムの多くの組み込みプロバイダが含まれています。RSA および DSA 署名アルゴリズム、DES、AES、および ARCFOUR 暗号化アルゴリズム、MD5 および SHA-1 メッセージダイジェストアルゴリズム、Diffie-Hellman 鍵協定アルゴリズムなどです。これらのデフォルトプロバイダは、Java コードで暗号化アルゴリズムを実装しています。
Java プラットフォームには、ネイティブ PKCS#11 (v2.x) トークンへのブリッジとして機能する組み込みプロバイダも含まれています。このプロバイダは SunPKCS11
という名前であり、Java アプリケーションは PKCS#11 に準拠するトークンに存在する暗号化サービスにシームレスにアクセスできます。
公開鍵インフラストラクチャー (PKI) は、公開鍵暗号方式に基づいて情報の安全な交換を可能にするフレームワークに対して使用される用語です。(人や組織などの) アイデンティティーのデジタル証明書へのバインドを可能にし、証明書の信頼性を検証する手段を提供します。PKI には、鍵、証明書、公開鍵暗号化、および信頼できる証明書発行局 (CA) が含まれます。CA は、証明書を生成してデジタル署名を行います。
Java プラットフォームには、X.509 デジタル証明書と証明書の取り消しリスト (CRL) の API およびプロバイダサポート、PKIX に準拠した証明書パスの構築および検証が含まれています。PKI に関係するクラスは、java.security
および java.security.cert
パッケージ内にあります。
Java プラットフォームは、キーストアおよび証明書ストアを使用して、暗号化鍵および証明書の長期に渡る持続的なストレージを提供します。具体的には、java.security.KeyStore
クラスが「キーストア」を表し、java.security.cert.CertStore
クラスが「証明書ストア」を表します。キーストアは、暗号化鍵または信頼できる証明書 (たとえば、証明書パス検証中に使用される)、あるいはその両方の安全なリポジトリです。証明書ストアは、関連がなく通常は信頼されない証明書が含まれるため非常に大きくなる可能性がある公開リポジトリです。CertStore
は CRL を格納する場合もあります。
KeyStore
と CertStore
の実装は、タイプによって区別されます。Java プラットフォームには、標準の PKCS11 と PKCS12 キーストアタイプ (その実装は、RSA Security の対応する PKCS 仕様に準拠する)、および JKS (「Java Key Store」を表す) と呼ばれる独自のファイルベースのキーストアタイプが含まれています。
Java プラットフォームには、特別な組み込み JKS キーストア cacerts が含まれています。このキーストアには、既知の信頼できる CA の多数の証明書が含まれています。keytool に関するドキュメント (第 9 項のセキュリティー機能のドキュメントのリンクを参照) に、cacerts に含まれている証明書が一覧されています。
「暗号化」の項 (第 4 項) で説明されている SunPKCS11 プロバイダには、PKCS11 KeyStore
実装が含まれています。つまり、安全なハードウェア (スマートカードなど) に存在する鍵または証明書は、KeyStore
API によって Java アプリケーションからアクセスおよび使用できます。スマートカードの鍵がデバイスを離れることは許可されない場合があります。このような場合、KeyStore
API から返される java.security.Key
オブジェクト参照は、単純に鍵の参照になる (つまり、実際の鍵データは含まれない) ことがあります。このような Key
オブジェクトは、実際の鍵が存在するデバイスでの暗号化操作の実行にのみ使用できます。
Java プラットフォームには、LDAP 証明書ストアタイプ (LDAP ディレクトリに格納されている証明書へのアクセス用)、およびメモリー内の Collection 証明書ストアタイプ (java.util.Collection
オブジェクトで管理されている証明書へのアクセス用) も含まれています。
鍵、証明書、およびキーストアを操作するための 2 つの組み込みツールがあります。
keytool は、キーストアの作成および管理に使用します。次のことが可能です。
jarsigner ツールは、JAR ファイルへの署名、または署名付き JAR ファイルの署名の検証に使用します。Java ARchive (JAR) ファイル形式を使用すると、複数のファイルを 1 つのファイルに統合できます。JAR ファイルには、主にアプレットおよびアプリケーションに関連したクラスファイルおよび補助リソースが含まれています。コードにデジタル署名する場合は、最初に keytool を使用して適切な鍵および証明書をキーストアに生成またはインポートします (それらがまだ存在しない場合)。次に、jar ツールを使用してコードを JAR ファイル内に配置し、最後に jarsigner ツールを使用して JAR ファイルに署名します。jarsigner ツールは、キーストアにアクセスし、JAR ファイルの署名または署名付き JAR ファイルの署名の検証に必要な鍵および証明書を見つけます。注: jarsigner は、オプションでタイムスタンプを含む署名を生成できます。JAR ファイルの署名を検証するシステム (Java Plug-in など) は、タイムスタンプをチェックして、証明書が最新であることを要求する代わりに、証明書が有効な間に署名された JAR ファイルを受け入れることができます。証明書は、通常 1 年で期限切れになります。配備された JAR ファイルに JAR ファイルの作成者が毎年再署名すると考えるのは妥当ではありません。
認証とは、ユーザーのアイデンティティーを判別するプロセスのことです。Java Runtime Environment のコンテキストでは、実行中の Java プログラムのユーザーを識別するプロセスのことです。このプロセスは、「暗号化」の項 (第 4 項) で説明したサービスに依存する場合があります。
Java プラットフォームは、アプリケーションがプラグイン可能なログインモジュールによってユーザー認証を実行できるようにする API を提供します。アプリケーションは LoginContext
クラス (javax.security.auth.login
パッケージ内) を呼び出し、このクラスは構成を参照します。構成は、実際の認証を実行するために使用するログインモジュール (javax.security.auth.spi.LoginModule
インタフェースの実装) を指定します。
アプリケーションは、標準の LoginContext
API と対話するのみなので、基盤となるプラグインモジュールから独立したままの状態を維持できます。アプリケーションでは、新規または更新されたモジュールをプラグインとして使用できます。アプリケーションを変更する必要はありません。図 3 は、アプリケーションと基盤となるログインモジュールの間の独立性を示しています。
ログインモジュールは Java プラットフォームで構成できるプラグイン可能なコンポーネントですが、セキュリティープロバイダを介してプラグインされません。したがって、第 3 項で説明されているプロバイダ検索モデルには従いません。代わりに、図に示したように、ログインモジュールは固有の構成によって管理されます。
Java プラットフォームは、次の組み込み LoginModule を提供します。これらはすべて、com.sun.security.auth.module
パッケージ内にあります。
Krb5LoginModule
Kerberos プロトコルを使用した認証用
JndiLoginModule
LDAP または NIS データベースを使用したユーザー名/パスワード認証用
KeyStoreLoginModule
PKCS#11 トークンキーストアなど、任意のタイプのキーストアへのログイン用
認証は、2 つのピア間の安全な通信チャネルの確立プロセス中に実現することもできます。Java プラットフォームは、多数の標準通信プロトコルの実装を提供します。これについては、次の項で説明します。
ネットワークを通じてやり取りされるデータには、意図された受信者以外の人もアクセスできます。データにパスワードやクレジットカード番号などの個人情報が含まれる場合、権限のない者がデータを理解できないよう、手段を講じる必要があります。また、適切な相手にデータを送信し、意図的であるかどうかにかかわらず、通信中にデータが変更されないようにすることも重要です。
暗号化は、安全な通信のために必要な基礎を形成します。これについては、第 4 項で説明されています。Java プラットフォームは、多数の安全な標準通信プロトコルの API サポートおよびプロバイダ実装も提供しています。
Java プラットフォームは、SSL および TLS プロトコルの API および実装を提供しています。データ暗号化、メッセージの整合性、サーバー認証だけでなく、オプションでクライアント認証の機能も含まれています。アプリケーションは、SSL/TLS を使用して、TCP/IP 上の HTTP など、任意のアプリケーションプロトコル上の 2 つのピア間で安全なデータのやり取りを実現できます。
javax.net.ssl.SSLSocket
クラスは、通常のストリームソケット (java.net.Socket
) 上で SSL/TLS サポートをカプセル化するネットワークソケットを表します。一部のアプリケーションは、別のデータトランスポート抽象化 (New-I/O など) を使用する場合があります。javax.net.ssl.SSLEngine
クラスを使用して、SSL/TLS パケットを生成および消費できます。
Java プラットフォームには、プラグイン可能な (プロバイダベースの) キーマネージャーおよびトラストマネージャーの概念をサポートする API も含まれています。「キーマネージャー」は javax.net.ssl.KeyManager
クラスによってカプセル化され、認証の実行に使用される鍵を管理します。「トラストマネージャー」は TrustManager
クラス (同じパッケージ内) によってカプセル化され、管理するキーストア内の証明書に基づいて信頼できる人を決定します。
Simple Authentication and Security Layer (SASL) は、認証およびオプションでクライアントアプリケーションとサーバーアプリケーション間のセキュリティー層の確立を行うプロトコルを指定するインターネット標準です。SASL は、認証データの交換方法を定義しますが、そのデータの内容は指定しません。認証データの内容およびセマンティクスを指定する特定の認証機構が適合できるフレームワークです。さまざまなセキュリティーレベルおよび配備シナリオ用にインターネットコミュニティーによって定義された、多数の標準 SASL 機構があります。
Java SASL API は、SASL 機構を使用するアプリケーション用のクラスおよびインタフェースを定義します。Java SASL API は、機構に依存しないように定義されています。API を使用するアプリケーションを、特定の SASL 機構の使用に固定する必要はありません。アプリケーションは、必要なセキュリティー機能に基づいて、使用する機構を選択できます。この API は、クライアントとサーバーの両方のアプリケーションをサポートしています。javax.security.sasl.Sasl
クラスが、SaslClient
および SaslServer
オブジェクトの作成に使用されます。
SASL 機構の実装は、プロバイダパッケージで提供されます。各プロバイダは、1 つ以上の SASL 機構をサポートする場合があり、標準プロバイダアーキテクチャーによって登録されて呼び出されます。
Java プラットフォームには、次の SASL 機構を実装する組み込みプロバイダが含まれています。
Java プラットフォームには、GSS-API (Generic Security Service Application Programming Interface) 用の Java 言語バインディングを持つ API が含まれています。GSS-API は、統一されたアクセスを提供します。これにより、アプリケーションプログラマは、さまざまな基盤となるセキュリティー機構上のセキュリティーサービスにアクセスできます。Java GSS-API では現在 Kerberos v5 機構を使用する必要があり、Java プラットフォームにはこの機構の組み込み実装が含まれています。現時点では、追加の機構をプラグインすることはできません。注: 第 6 項で説明されている Krb5LoginModule
を GSS Kerberos 機構とともに使用できます。
2 つのアプリケーションが Java GSS-API を利用して安全にメッセージを交換するには、事前にジョイントセキュリティーコンテキストを確立しておく必要があります。コンテキストは、共有状態の情報 (暗号化鍵などを含む) をカプセル化します。両方のアプリケーションが、org.ietf.jgss.GSSContext
オブジェクトを作成および使用して、セキュリティーコンテキストを構成する共有情報の確立および保守を行います。セキュリティーコンテキストが確立されると、安全なメッセージ交換を準備するために使用できます。
Java GSS API は org.ietf.jgss
パッケージ内にあります。Java プラットフォームは、KerberosPrincipal
や KerberosTicket
など、基本的な Kerberos クラスも定義します。これらは javax.security.auth.kerberos
パッケージ内にあります。
Java プラットフォームのアクセス制御アーキテクチャーは、機密リソース (ローカルファイルなど) または機密アプリケーションコード (クラス内のメソッドなど) へのアクセスを保護します。すべてのアクセス制御の決定は、java.lang.SecurityManager
クラスによって表されるセキュリティーマネージャーが仲介します。アクセス制御チェックを有効にするには、SecurityManager
を Java Runtime にインストールします。
SecurityManager
がインストールされていると、Java アプレットおよび Java™ Web Start アプリケーションは自動的に実行されます。ただし、java コマンドによって実行されるローカルアプリケーションは、SecurityManager
がインストールされていてもデフォルトでは実行されません。ローカルアプリケーションを SecurityManager で実行するには、アプリケーション自体が setSecurityManager
メソッド (java.lang.System
クラス内) によってプログラムで SecurityManager を設定するか、またはコマンド行で -Djava.security.manager
引数を使用して java を呼び出します。
Java コードがクラスローダーによって Java Runtime にロードされると、クラスローダーは次の情報をそのコードに自動的に関連付けます。
この情報は、コードが信頼されないネットワークからダウンロードされたか (アプレットなど)、ファイルシステムからロードされたか (ローカルアプリケーションなど) に関係なく、コードに関連付けられます。コードのロード元の場所は URL で表され、コード署名者は署名者の証明書チェーンによって表され、デフォルトのアクセス権は java.security.Permission
オブジェクトによって表されます。
ダウンロードされたコードに自動的に付与されるデフォルトのアクセス権には、コードの出所であるホストへのネットワーク接続を行う機能が含まれています。ローカルファイルシステムからロードされたコードに自動的に付与されるデフォルトのアクセス権には、コードの出所であるディレクトリおよびそのディレクトリのサブディレクトリからファイルを読み取る機能が含まれています。
コードを実行しているユーザーのアイデンティティーは、クラスローディング時に利用できません。アプリケーションコードで、(たとえば、第 6 項で説明されているように) 必要に応じてエンドユーザーを認証する必要があります。ユーザーが認証されると、javax.security.auth.Subject
クラスの doAs
メソッドを呼び出すことによって、アプリケーションはそのユーザーを実行コードに動的に関連付けることができます。
前述したように、限定されたデフォルトのアクセス権がクラスローダーによってコードに付与されます。管理者は、セキュリティーポリシーによって、追加のコードアクセス権を柔軟に管理できます。
Java プラットフォームは、セキュリティーポリシーの概念を java.security.Policy
クラスにカプセル化します。Java Runtime にインストールされる Policy
オブジェクトはいつでも 1 つのみです。Policy
オブジェクトの基本的な役割は、保護されたリソースへのアクセスがコード (ロード元の場所、署名者、および実行者によって特徴付けられる) に許可されるかどうかを決定することです。Policy
オブジェクトがこの決定を行う方法は、実装によって異なります。たとえば、承認データを含むデータベースに問い合わせたり、別のサービスに問い合わせたりする場合があります。
Java プラットフォームには、セキュリティープロパティーファイル内に構成された 1 つ以上の ASCII (UTF-8) ファイルから承認データを読み込む、デフォルトの Policy
実装が含まれています。これらのポリシーファイルには、コードに付与されるアクセス権の厳密なセットが含まれています。具体的には、特定の場所からロードされ、特定のエンティティーによって署名され、特定のユーザーとして実行されるコードに付与されるアクセス権の厳密なセットです。各ファイル内のポリシーエントリは、ドキュメント化された独自の構文に準拠する必要があり、単純なテキストエディタまたはグラフィカルな policytool ユーティリティーによって構成される場合があります。
Java Runtime は、プログラムの実行時に行われた一連の Java 呼び出しを追跡します。保護されたリソースへのアクセスが要求された場合、デフォルトでは、要求されたアクセスを許可するかどうかを決定するために呼び出しスタック全体が評価されます。
前述したように、リソースは SecurityManager
によって保護されます。Java プラットフォームおよびアプリケーション内のセキュリティーを考慮したコードは、次のようなコードでリソースへのアクセスを保護します。
SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(perm); }
perm は、要求されたアクセスに対応する Permission オブジェクトです。たとえば、ファイル /tmp/abc を読み取ろうとすると、アクセス件は次のように構成される場合があります。
Permission perm = new java.io.FilePermission("/tmp/abc", "read");
SecurityManager
のデフォルトの実装は、その決定を java.security.AccessController
実装に委譲します。AccessController
は、呼び出しスタックをトラバースして、スタック内の各コード要素を、要求されたアクセス権 (たとえば、前述の例では FilePermission
) とともに、インストールされているセキュリティー Policy
に渡します。Policy
は、管理者によって構成されたアクセス権に基づいて、要求されたアクセスを付与するかどうかを決定します。アクセスが付与されない場合、AccessController
は java.lang.SecurityException
をスローします。
図 4 は、アクセス制御の実施を示しています。この例では、最初に 2 つの要素 ClassA および ClassB が呼び出しスタックにあります。ClassA は ClassB 内のメソッドを呼び出し、メソッドは java.io.FileInputStream
のインスタンスを作成することによってファイル /tmp/abc にアクセスしようとします。FileInputStream
コンストラクタは、前述したように FilePermission
、perm
を作成し、perm
を SecurityManager
の checkPermission
メソッドに渡します。この場合は、ClassA および ClassB のアクセス権のみをチェックする必要があります。FileInputStream
、SecurityManager
、AccessController
などのすべてのシステムコードは、すべてのアクセス権を自動的に受け取るためです。
この例では、ClassA と ClassB は異なるコードの特性を持っているでしょうか?出所および署名者が異なります。それぞれに異なるアクセス権が付与されている場合があります。要求された FilePermission
が両方のクラスに付与されていることを Policy
が示した場合にのみ、AccessController
は要求されたファイルへのアクセスを付与します。
このドキュメントで説明されているすべての Java SE 6 セキュリティー機能の詳細ドキュメントは、次の場所にあります。
http://java.sun.com/javase/6/docs/guide/security/index.html
その他の Java セキュリティードキュメントは、オンラインの次の場所にあります。
また、書籍『Inside Java 2 Platform Security, Second Edition』(Addison-Wesley) にもあります。訳必要なし
http://java.sun.com/docs/books/security/index.html
注 -歴史的に、新しいタイプのセキュリティーサービスが Java プラットフォームに追加されると (最初は拡張機能としての場合もある)、それらを参照するためにさまざまな略語が使用されました。これらの略語は依然として Java セキュリティードキュメントで使用されているため、それらが何を表しているかをここで説明します。JSSE (Java™ Secure Socket Extension) は、第 7 項で説明した SSL 関連サービスを示しています。JCE (Java™ Cryptography Extension) は、暗号化サービス (第 4 項) を示しています。JAAS (Java™ Authentication and Authorization Service) は、認証およびユーザーベースのアクセス制御サービスを示していて、それぞれ、第 6 項および第 8 項で説明されています。
表 1 は、このドキュメントで説明されている Java セキュリティークラスおよびインタフェースの名前、パッケージ、および使用方法の概要を示しています。
パッケージ |
クラスまたはインタフェース名 |
使用方法 |
com.sun.security.auth.module |
JndiLoginModule |
LDAP または |
KeyStoreLoginModule |
キーストアログインに基づいて認証を実行します |
|
Krb5LoginModule |
Kerberos プロトコルを使用して認証を実行します |
|
java.lang |
SecurityException |
セキュリティー違反を示します |
SecurityManager |
すべてのアクセス制御の決定を仲介します |
|
System |
SecurityManager をインストールします |
|
java.security |
AccessController |
アクセス制御の決定を行うために、SecurityManager のデフォルトの実装によって呼び出されます |
キー |
暗号化鍵を表します |
|
KeyStore |
鍵および信頼できる証明書のリポジトリを表します |
|
MessageDigest |
メッセージダイジェストを表します |
|
アクセス権 |
特定のリソースへのアクセスを表します |
|
Policy |
セキュリティーポリシーをカプセル化します |
|
Provider |
セキュリティーサービスの実装をカプセル化します |
|
セキュリティー |
セキュリティープロバイダおよびセキュリティープロパティーを管理します |
|
署名 |
デジタル署名を作成および検証します |
|
java.security.cert |
証明書 |
公開鍵証明書を表します |
CertStore |
関連性がなく通常は信頼されない証明書のリポジトリを表します |
|
javax.crypto |
暗号 |
暗号化および復号化を実行します |
KeyAgreement |
鍵交換を実行します |
|
javax.net.ssl |
KeyManager |
SSL/TLS 認証を実行するために使用される鍵を管理します |
SSLEngine |
アプリケーションがトランスポート機構を自由に選択できるように、SSL/TLS パケットを生成および消費します |
|
SSLSocket |
通常のストリームソケット上で SSL/TLS サポートをカプセル化するネットワークソケットを表します |
|
TrustManager |
SSL/TLS インタラクションで信頼できる人に関する決定を行います (たとえば、キーストア内の信頼できる証明書に基づく) |
|
javax.security.auth |
サブジェクト |
ユーザーを表します |
javax.security.auth.kerberos |
KerberosPrincipal |
Kerberos 主体を表します |
KerberosTicket |
Kerberos チケットを表します |
|
javax.security.auth.login |
LoginContext |
プラグイン可能な認証をサポートします |
javax.security.auth.spi |
LoginModule |
特定の認証機構を実装します |
javax.security.sasl |
Sasl |
SaslClient および SaslServer オブジェクトを作成します |
SaslClient |
SASL 認証をクライアントとして実行します |
|
SaslServer |
SASL 認証をサーバーとして実行します |
|
org.ietf.jgss |
GSSContext |
GSS-API セキュリティーコンテキストをカプセル化し、コンテキストによって使用可能なセキュリティーサービスを提供します |
表 2 は、このドキュメントで説明するツールの概要を示しています。
ツール |
使用方法 |
jar |
Java Archive (JAR) ファイルを作成します |
jarsigner |
JAR ファイルの署名および署名の検証を行います |
keytool |
キーストアを作成および管理します |
policytool |
デフォルトの Policy の実装とともに使用するポリシーファイルを作成および編集します |
Windows 用の Java プラットフォームに同梱される 3 つの Kerberos 関連のツールもあります。同等の機能が、自動的に Solaris および Linux オペレーティング環境の一部になる同じ名前のツールで提供されています。表 3 は、Kerberos ツールの概要を示しています。
ツール |
使用方法 |
kinit |
Kerberos チケット認可チケットを取得およびキャッシュします |
klist |
ローカルの Kerberos 資格キャッシュおよび鍵テーブルのエントリを一覧します |
ktab |
ローカルの Kerberos 鍵テーブルに格納された名前およびサービス鍵を管理します |
Sun Microsystems の Java プラットフォームの実装には、多数の組み込みプロバイダパッケージが含まれています。詳細は、「Java™ 暗号化アーキテクチャー Sun プロバイダドキュメント」を参照してください。