Java™ セキュリティーの概要

1 はじめに

Java™ プラットフォームは、セキュリティーを重視して設計されました。その中核では、Java 言語自体が型保証されており、自動ガベージコレクションを提供してアプリケーションコードの堅牢性を強化しています。安全なクラスロードおよび検証メカニズムによって、正当な Java コードのみが実行されます。

Java プラットフォームの初期バージョンでは、パブリックネットワークからダウンロードされた Java アプレットなど、潜在的に信頼されないコードを実行するための安全な環境を作成しました。プラットフォームが発展し、その配備範囲が拡大するにつれて、Java セキュリティーアーキテクチャーは増加するサービスセットをサポートするために進化しました。現在、アーキテクチャーには、アプリケーションプログラミングインタフェース (API)、ツール、および一般的に使用されるセキュリティーアルゴリズム、メカニズム、プロトコルの実装の、大規模なセットが含まれています。これにより、アプリケーションを記述するための包括的なセキュリティーフレームワークを開発者に提供し、ユーザーまたは管理者にアプリケーションを安全に管理するための一連のツールを提供しています。

Java セキュリティー API は、広範な領域に及びます。暗号化および公開鍵インフラストラクチャー (PKI) インタフェースは、安全なアプリケーションを開発するための基盤となります。認証およびアクセス制御を実行するためのインタフェースにより、アプリケーションは、保護されたリソースへの承認されていないアクセスから保護できます。

API では、アルゴリズムおよびその他のセキュリティーサービスについて、複数の相互運用性のある実装が可能です。サービスはプロバイダに実装されます。プロバイダは、アプリケーションがセキュリティーサービスの実装を意識せずに簡単に取得できるようにする標準インタフェースによって、Java プラットフォームにプラグインされます。これにより、開発者は、複雑なセキュリティーメカニズムを実際に実装する方法ではなく、セキュリティーをアプリケーションに統合する方法に重点を置くことができます。

Java プラットフォームには、基本的なセキュリティーサービスを実装する多数のプロバイダが含まれています。追加のカスタムプロバイダをインストールすることも可能です。これにより、開発者は新しいセキュリティーメカニズムでプラットフォームを拡張できます。

このドキュメントでは、安全な言語機能からセキュリティー API、ツール、および組み込みプロバイダサービスにいたるまで、Java プラットフォームのセキュリティーの概要について説明します。該当する場合には、主要なパッケージおよびクラスについて説明します。このドキュメントは、Java™ SE version 7 に基づいています。

2 Java 言語セキュリティーおよびバイトコード検証

Java 言語は、型保証されるように設計されており、簡単に使用できます。自動メモリー管理、ガベージコレクション、および配列の範囲チェックを備えています。これにより、開発者の全体的なプログラミングの負荷を軽減し、見つかりにくいプログラミングエラーの減少および安全で堅牢なコードを実現します。

また、Java 言語は、異なるアクセス修飾子を定義して Java クラス、メソッド、およびフィールドに割り当てることができるため、開発者はクラス実装へのアクセスを必要に応じて制限できます。特に、この言語は privateprotectedpublic、および package (指定されない場合) の 4 つの異なるアクセスレベルを定義します。もっともオープンなアクセス指定子は public で、アクセスはすべての人に許可されます。アクセスをもっとも制限する修飾子は private で、アクセスは private メンバー (メソッドなど) が定義された特定のクラス以外では許可されません。protected 修飾子は、任意のサブクラス、または同じパッケージ内のほかのクラスへのアクセスを許可します。package レベルのアクセスは、同じパッケージ内のクラスへのアクセスのみを許可します。

コンパイラは、Java プログラムをマシンに依存しないバイトコード表現に変換します。正当なバイトコードのみが Java Runtime で実行されるように、バイトコードベリファイアが呼び出されます。これは、バイトコードが Java 言語仕様に準拠しており、Java の言語規則または名前空間制限に違反していないことをチェックします。ベリファイアは、メモリー管理違反、スタックアンダーフローまたはオーバーフロー、および不正な型キャストもチェックします。バイトコードが検証されると、Java Runtime はそれらの実行を準備します。

3 基本的なセキュリティーアーキテクチャー

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 実装を提供しますが、指定されたプロバイダから実装が返されます。

プロバイダ名を指定せずに MD5 アルゴリズムを要求しているアプリケーションを示す図 特定のプロバイダから MD5 アルゴリズムを要求しているアプリケーションを示す図
図 1 プロバイダ検索 図 2 特定のプロバイダの要求

Oracle の Java プラットフォームの実装には、アプリケーションによって使用できる基本的なセキュリティーサービスを実装する、多数の事前に構成されたデフォルトプロバイダが含まれています。Java プラットフォームのほかのベンダーの実装には、ベンダー固有のセキュリティーサービスのセットをカプセル化した、異なるプロバイダのセットが含まれている場合があります。このドキュメントで組み込みのデフォルトプロバイダに言及する場合は、Oracle の実装で利用可能なプロバイダを指しています。

さまざまなセキュリティー領域 (暗号化、認証など) に関する以降の各セクションには、デフォルトプロバイダによって提供される関連サービスの説明が含まれています。付録 C の表に、すべてのデフォルトプロバイダがまとめられています。

ファイルの位置

このドキュメントで説明されている Java セキュリティーの特定の側面 (プロバイダの構成など) は、セキュリティープロパティーを設定することによってカスタマイズできます。セキュリティープロパティーファイルでセキュリティープロパティーを静的に設定できます。このファイルは、デフォルトでは、Java™ Runtime Environment (JRE) がインストールされているディレクトリの lib/security ディレクトリにある java.security ファイルです。セキュリティープロパティーは、java.security パッケージ内の Security クラスの適切なメソッドを呼び出すことによって、動的に設定することもできます。

このドキュメントで説明されているツールおよびコマンドは、すべて ~jre/bin ディレクトリにあります。~jre は、JRE がインストールされているディレクトリを表します。セクション 5 で説明する cacerts ファイルは、~jre/lib/security にあります。

4 暗号化

Java 暗号化アーキテクチャーは、Java プラットフォームの暗号化機能へのアクセスおよび開発のためのフレームワークです。次のような、さまざまな暗号化サービスの API が含まれています。

歴史的な理由 (輸出規制) により、暗号化 API は 2 つの別個のパッケージに編成されています。java.security パッケージには、輸出規制の対象ではないクラス (SignatureMessageDigest など) が含まれています。javax.crypto パッケージには、輸出規制の対象のクラス (CipherKeyAgreement など) が含まれています。

暗号化インタフェースはプロバイダベースであり、複数の相互運用性のある暗号化実装が可能です。ソフトウェアで暗号化操作を行うプロバイダもあれば、スマートカードデバイスやハードウェア暗号化アクセラレータなどのハードウェアトークン上で暗号化操作を行うプロバイダもあります。輸出規制の対象のサービスを実装するプロバイダには、デジタル署名を行う必要があります。

Java プラットフォームには、もっとも一般的に使用される暗号化アルゴリズムの多くの組み込みプロバイダが含まれています。RSA、DSA、および ECDSA 署名アルゴリズム、DES、AES、および ARCFOUR 暗号化アルゴリズム、MD5、SHA-1、および SHA-256 メッセージダイジェストアルゴリズム、Diffie-Hellman および ECDH 鍵協定アルゴリズムなどです。これらのデフォルトプロバイダは、Java コードで暗号化アルゴリズムを実装しています。

Java プラットフォームには、ネイティブ PKCS#11 (v2.x) トークンへのブリッジとして機能する組み込みプロバイダも含まれています。このプロバイダは SunPKCS11 という名前であり、Java アプリケーションは PKCS#11 に準拠するトークンに存在する暗号化サービスにシームレスにアクセスできます。

Windows では、Java プラットフォームにネイティブ Microsoft CryptoAPI へのブリッジとして機能する組み込みプロバイダが含まれています。このプロバイダは MSCAPI という名前であり、Java アプリケーションは CryptoAPI を介して Windows の暗号化サービスにシームレスにアクセスできます。

5 公開鍵インフラストラクチャー

公開鍵インフラストラクチャー (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 を格納する場合もあります。

KeyStoreCertStore の実装は、タイプによって区別されます。Java プラットフォームには、標準の PKCS11PKCS12 キーストアタイプ (その実装は、RSA Security の対応する PKCS 仕様に準拠する)、および JKS (「Java Key Store」を表す) と呼ばれる独自のファイルベースのキーストアタイプが含まれています。

Java プラットフォームには、特別な組み込み JKS キーストア cacerts が含まれています。このキーストアには、既知の信頼できる CA の多数の証明書が含まれています。keytool ユーティリティーでは、cacerts に含まれている証明書を一覧できます (セクション 10 のセキュリティー機能のドキュメントのリンクを参照)。

「暗号化」セクション (セクション 4) で説明されている SunPKCS11 プロバイダには、PKCS11 KeyStore 実装が含まれています。つまり、安全なハードウェア (スマートカードなど) に存在する鍵または証明書は、KeyStore API によって Java アプリケーションからアクセスおよび使用できます。スマートカードの鍵がデバイスを離れることは許可されない場合があります。このような場合、KeyStore API から返される java.security.Key オブジェクト参照は、単純に鍵の参照になる (つまり、実際の鍵データは含まれない) ことがあります。このような Key オブジェクトは、実際の鍵が存在するデバイスでの暗号化操作の実行にのみ使用できます。

Java プラットフォームには、LDAP 証明書ストアタイプ (LDAP ディレクトリに格納されている証明書へのアクセス用)、およびメモリー内の Collection 証明書ストアタイプ (java.util.Collection オブジェクトで管理されている証明書へのアクセス用) も含まれています。

PKI ツール

鍵、証明書、およびキーストアを操作するための 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 ファイルの作成者が毎年再署名すると考えるのは妥当ではありません。

6 認証

認証とは、ユーザーのアイデンティティーを判別するプロセスのことです。Java Runtime Environment のコンテキストでは、実行中の Java プログラムのユーザーを識別するプロセスのことです。このプロセスは、「暗号化」セクション (セクション 4) で説明したサービスに依存する場合があります。

Java プラットフォームは、アプリケーションがプラグイン可能なログインモジュールによってユーザー認証を実行できるようにする API を提供します。アプリケーションは LoginContext クラス (javax.security.auth.login パッケージ内) を呼び出し、このクラスは構成を参照します。構成は、実際の認証を実行するために使用するログインモジュール (javax.security.auth.spi.LoginModule インタフェースの実装) を指定します。

アプリケーションは、標準の LoginContext API と通信するのみなので、基盤となるプラグインモジュールから独立したままの状態を維持できます。アプリケーションでは、新規または更新されたモジュールをプラグインとして使用できます。アプリケーションを変更する必要はありません。図 3 は、アプリケーションと基盤となるログインモジュールの間の独立性を示しています。

アプリケーションとログインモジュールの間の独立性を示す図

図 3 認証フレームワークにプラグインする認証ログインモジュール

ログインモジュールは Java プラットフォームで構成できるプラグイン可能なコンポーネントですが、セキュリティープロバイダを介してプラグインされません。したがって、セクション 3 で説明されているプロバイダ検索モデルには従いません。代わりに、図に示したように、ログインモジュールは固有の構成によって管理されます。

Java プラットフォームは、次の組み込み LoginModule を提供します。これらはすべて、com.sun.security.auth.module パッケージ内にあります。

認証は、2 つのピア間の安全な通信チャネルの確立プロセス中に実現することもできます。Java プラットフォームは、多数の標準通信プロトコルの実装を提供します。これについては、次のセクションで説明します。

7 安全な通信

ネットワークを通じてやり取りされるデータには、意図された受信者以外の人もアクセスできます。データにパスワードやクレジットカード番号などの個人情報が含まれる場合、権限のない者がデータを理解できないよう、手段を講じる必要があります。また、適切な相手にデータを送信し、意図的であるかどうかにかかわらず、通信中にデータが変更されないようにすることも重要です。

暗号化は、安全な通信のために必要な基礎を形成します。これについては、セクション 4 で説明されています。Java プラットフォームは、多数の安全な標準通信プロトコルの API サポートおよびプロバイダ実装も提供しています。

SSL/TLS

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 クラス (同じパッケージ内) によってカプセル化され、管理するキーストア内の証明書に基づいて信頼できる人を決定します。

Java プラットフォームには、次の SSL/TLS プロトコルを実装する組み込みプロバイダが含まれています。

SASL

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 メカニズムを実装する組み込みプロバイダが含まれています。

GSS-API および Kerberos

Java プラットフォームには、Generic Security Service Application Programming Interface (GSS-API) 用の Java 言語バインディングを持つ API が含まれています。GSS-API は、統一されたアクセスを提供します。これにより、アプリケーションプログラマは、さまざまな基盤となるセキュリティーメカニズム上のセキュリティーサービスにアクセスできます。Java GSS-API では現在 Kerberos v5 メカニズムを使用する必要があり、Java プラットフォームにはこのメカニズムの組み込み実装が含まれています。現時点では、追加のメカニズムをプラグインすることはできません。注:セクション 6 で説明されている Krb5LoginModule を GSS Kerberos メカニズムとともに使用できます。

Java プラットフォームには、Simple and Protected GSSAPI Negotiation Mechanism (SPNEGO) GSS-API メカニズムの組み込み実装も含まれています。

2 つのアプリケーションが Java GSS-API を利用して安全にメッセージを交換するには、事前にジョイントセキュリティーコンテキストを確立しておく必要があります。コンテキストは、共有状態の情報 (暗号化鍵などを含む) をカプセル化します。両方のアプリケーションが、org.ietf.jgss.GSSContext オブジェクトを作成および使用して、セキュリティーコンテキストを構成する共有情報の確立および保守を行います。セキュリティーコンテキストが確立されると、安全なメッセージ交換を準備するために使用できます。

Java GSS API は org.ietf.jgss パッケージ内にあります。Java プラットフォームは、KerberosPrincipalKerberosTicketKerberosKeyKeyTab など、基本的な Kerberos クラスも定義します。これらは javax.security.auth.kerberos パッケージ内にあります。

8 アクセス制御

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 メソッドを呼び出すことによって、アプリケーションはそのユーザーを実行コードに動的に関連付けることができます。

Policy

前述したように、限定されたデフォルトのアクセス権がクラスローダーによってコードに付与されます。管理者は、セキュリティーポリシーによって、追加のコードアクセス権を柔軟に管理できます。

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 は、管理者によって構成されたアクセス権に基づいて、要求されたアクセスを付与するかどうかを決定します。アクセスが付与されない場合、AccessControllerjava.lang.SecurityException. をスローします。

図 4 は、アクセス制御の実施を示しています。この例では、最初に 2 つの要素 ClassA および ClassB が呼び出しスタックにあります。ClassA は ClassB 内のメソッドを呼び出し、メソッドは java.io.FileInputStream. のインスタンスを作成することによってファイル /tmp/abc にアクセスしようとします。FileInputStream コンストラクタは、前述したように FilePermissionperm を作成し、permSecurityManagercheckPermission メソッドに渡します。この場合は、ClassA および ClassB のアクセス権のみをチェックする必要があります。FileInputStreamSecurityManagerAccessController などのすべてのシステムコードは、すべてのアクセス権を自動的に受け取るためです。

この例では、ClassA と ClassB は異なるコードの特性を持っています (出所および署名者が異なります)。それぞれに異なるアクセス権が付与されている場合があります。要求された FilePermission が両方のクラスに付与されていることを Policy が示した場合にのみ、AccessController は要求されたファイルへのアクセスを付与します。

リソースへのアクセスが制御される方法を示す図

図 4 リソースへのアクセスの制御

9 XML 署名

Java XML デジタル署名 API は、XML 署名を生成および検証するための標準の Java API です。

XML 署名は、任意のタイプのデータ (XML またはバイナリ) に適用できます (http://www.w3.org/TR/xmldsig-core/ を参照)。結果の署名は、XML で表されます。XML 署名は、データを保護するために使用でき、データの整合性、メッセージ認証、および署名者認証を提供します。

API は、「XML-Signature Syntax and Processing」での W3C 勧告の必須機能または推奨機能をすべてサポートするように設計されています。API は拡張可能およびプラグイン可能であり、Java 暗号化サービスプロバイダアーキテクチャーに基づいてます。

Java XML デジタル署名 API は、次の 6 つのパッケージから構成されます。

10 詳細情報

このドキュメントで説明されているすべての Java SE セキュリティー機能の詳細ドキュメントは、「Java SE 7 セキュリティードキュメント」にあります。

その他の Java セキュリティードキュメントは、オンラインの Oracle Technology Network の Java SE Security、および書籍『Inside Java 2 Platform Security, Second Edition』 (Addison-Wesley) にあります。

:歴史的に、新しいタイプのセキュリティーサービスが Java プラットフォームに追加されると (最初は拡張機能としての場合もある)、それらを参照するためにさまざまな略語が使用されました。これらの略語は引き続き Java セキュリティードキュメントで使用されているため、それらが何を表しているかをここで説明します。JSSE (Java™ Secure Socket Extension) は、セクション 7 で説明した SSL 関連サービスを示しています。JCE (Java™ Cryptography Extension) は、暗号化サービス (セクション 4) を示しています。JAAS (Java™ Authentication and Authorization Service) は、認証およびユーザーベースのアクセス制御サービスを示していて、それぞれ、セクション 6 およびセクション 8 で説明されています。

付録 A クラスのサマリー

表 1 は、このドキュメントで説明されている Java セキュリティークラスおよびインタフェースの名前、パッケージ、および使用方法の概要を示しています。

表 1 主要な Java セキュリティーパッケージおよびクラス

パッケージ クラスまたはインタフェース名 使用法
com.sun.security.auth.module JndiLoginModule LDAP または NIS を使用して、ユーザー名/パスワード認証を実行します
com.sun.security.auth.module KeyStoreLoginModule キーストアログインに基づいて認証を実行します
com.sun.security.auth.module Krb5LoginModule Kerberos プロトコルを使用して認証を実行します
java.lang SecurityException セキュリティー違反を示します
java.lang SecurityManager すべてのアクセス制御の決定を仲介します
java.lang System SecurityManager をインストールします
java.security AccessController アクセス制御の決定を行うために、SecurityManager のデフォルトの実装によって呼び出されます
java.security Key 暗号化鍵を表します
java.security KeyStore 鍵および信頼できる証明書のリポジトリを表します
java.security MessageDigest メッセージダイジェストを表します
java.security Permission 特定のリソースへのアクセスを表します
java.security Policy セキュリティーポリシーをカプセル化します
java.security Provider セキュリティーサービスの実装をカプセル化します
java.security Security セキュリティープロバイダおよびセキュリティープロパティーを管理します
java.security Signature デジタル署名を作成および検証します
java.security.cert Certificate 公開鍵証明書を表します
java.security.cert CertStore 関連性がなく通常は信頼されない証明書のリポジトリを表します
java.security.cert CRL CRL を表します
javax.crypto Cipher 暗号化および復号化を実行します
javax.crypto KeyAgreement 鍵交換を実行します
javax.net.ssl KeyManager SSL/TLS 認証を実行するために使用される鍵を管理します
javax.net.ssl SSLEngine アプリケーションがトランスポートメカニズムを自由に選択できるように、SSL/TLS パケットを生成および消費します
javax.net.ssl SSLSocket 通常のストリームソケット上で SSL/TLS サポートをカプセル化するネットワークソケットを表します
javax.net.ssl TrustManager SSL/TLS インタラクションで信頼できる人に関する決定を行います (たとえば、キーストア内の信頼できる証明書に基づく)
javax.security.auth Subject ユーザーを表します
javax.security.auth.kerberos KerberosPrincipal Kerberos プリンシパルを表します
javax.security.auth.kerberos KerberosTicket Kerberos チケットを表します
javax.security.auth.kerberos KerberosKey Kerberos 鍵を表します
javax.security.auth.kerberos KerberosTab Kerberos キータブファイルを表します
javax.security.auth.login LoginContext プラグイン可能な認証をサポートします
javax.security.auth.spi LoginModule 特定の認証メカニズムを実装します
javax.security.sasl Sasl SaslClient および SaslServer オブジェクトを作成します
javax.security.sasl SaslClient SASL 認証をクライアントとして実行します
javax.security.sasl SaslServer SASL 認証をサーバーとして実行します
org.ietf.jgss GSSContext GSS-API セキュリティーコンテキストをカプセル化し、コンテキストによって使用可能なセキュリティーサービスを提供します

付録 B ツールのサマリー

表 2 は、このドキュメントで説明するツールの概要を示しています。

表 2 Java セキュリティーツール

ツール 使用法
jar Java Archive (JAR) ファイルを作成します
jarsigner JAR ファイルの署名および署名の検証を行います
keytool キーストアを作成および管理します
policytool デフォルトの Policy の実装とともに使用するポリシーファイルを作成および編集します

Windows 用の Java プラットフォームに同梱される 3 つの Kerberos 関連のツールもあります。同等の機能が、自動的に Solaris および Linux オペレーティング環境の一部になる同じ名前のツールで提供されています。表 3 は、Kerberos ツールの概要を示しています。

表 3 Kerberos 関連のツール

ツール 使用法
kinit Kerberos チケット認可チケットを取得およびキャッシュします
klist ローカルの Kerberos 資格キャッシュおよび鍵テーブルのエントリを一覧します
ktab ローカルの Kerberos 鍵テーブルに格納された名前およびサービス鍵を管理します

付録 C 組み込みプロバイダ

Oracle の Java プラットフォームの実装には、多数の組み込みプロバイダパッケージが含まれています。詳細は、「Java™ 暗号化アーキテクチャー Oracle プロバイダドキュメント」を参照してください。


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