Javaセキュリティには、API、ツール、およびよく使用されるセキュリティ・アルゴリズム、メカニズムおよびプロトコルの実装が大規模なセットとして含まれています。JavaセキュリティAPIは、暗号化、公開鍵インフラストラクチャ、安全な通信、認証、アクセス制御など、広範な領域に及んでいます。Javaセキュリティ・テクノロジでは、開発者に、アプリケーションを記述するための包括的なセキュリティ・フレームワークが提供され、ユーザーまたは管理者に、アプリケーションを安全に管理するための一連のツールが提供されます。
JDKは、セキュリティを重視して設計されました。その中核では、Java言語自体が型保証されており、自動ガベージ・コレクションを提供してアプリケーション・コードの堅牢性を強化しています。安全なクラス・ロードおよび検証メカニズムによって、正当なJavaコードのみが実行されます。Javaセキュリティ・アーキテクチャには、アプリケーション・プログラミング・インタフェース(API)、ツール、および一般的に使用されるセキュリティ・アルゴリズム、メカニズムおよびプロトコルの実装の、大規模なセットが含まれています。
JavaセキュリティAPIは、広範な領域に及びます。暗号化および公開鍵インフラストラクチャ(PKI)インタフェースは、安全なアプリケーションを開発するための基盤となります。認証およびアクセス制御を実行するためのインタフェースにより、アプリケーションは、保護されたリソースへの承認されていないアクセスから保護できます。
APIでは、アルゴリズムおよびその他のセキュリティ・サービスについて、複数の相互運用可能な実装が可能です。サービスはプロバイダに実装され、プロバイダは、アプリケーションがセキュリティ・サービスの実装を意識せずに簡単に取得できるようにする標準インタフェースによって、JDKにプラグインされます。これにより、開発者は、複雑なセキュリティ・メカニズムを実際に実装する方法ではなく、セキュリティをアプリケーションに統合する方法に重点を置くことができます。
JDKには、基本的なセキュリティ・サービスを実装する多数のプロバイダが含まれています。追加のカスタム・プロバイダをインストールすることも可能です。これにより、開発者は新しいセキュリティ・メカニズムでプラットフォームを拡張できます。
JDKは、複数のモジュールに分けられています。セキュリティAPIを含むモジュールには、次のものがあります。
表1-1 セキュリティAPIを含むモジュール
モジュール | 説明 |
---|---|
java.base | Java SEの基礎を成すAPIを定義します。含まれているパッケージには、java.security、javax.crypto、javax.net.sslおよびjavax.security.authなどがあります。 |
java.security.jgss | IETF Generic Security Services API (GSS-API)のJavaバインディングを定義します。このモジュールには、Kerberos v5やSPNEGOなどのGSS-APIメカニズムも含まれています。 |
java.security.sasl | IETF Simple Authentication and Security Layer (SASL)のJavaサポートを定義します。このモジュールには、DIGEST-MD5、CRAM-MD5およびNTLMなどのSASLメカニズムも含まれています。 |
java.smartcardio | Javaスマートカード入出力APIを定義します。 |
java.xml.crypto | XML暗号化のAPIを定義します。 |
jdk.security.auth | javax.security.auth.*インタフェースおよび様々な認証モジュールの実装を提供します。 |
jdk.security.jgss | GSS-APIのJava拡張、およびSASL GSS-APIメカニズムの実装を定義します。 |
Java言語は、型保証されるように設計されており、簡単に使用できます。自動メモリー管理、ガベージ・コレクション、および配列の範囲チェックを備えています。これにより、開発者の全体的なプログラミングの負荷を軽減し、見つかりにくいプログラミング・エラーの減少および安全で堅牢なコードを実現します。
コンパイラは、Javaプログラムをマシンに依存しないバイト・コード表現に変換します。正当なバイト・コードのみがJava Runtimeで実行されるように、バイトコード・ベリファイアが呼び出されます。これは、バイト・コードがJava言語仕様に準拠しており、Javaの言語規則または名前空間制限に違反していないことをチェックします。ベリファイアは、メモリー管理違反、スタック・アンダーフローまたはオーバーフロー、および不正な型キャストもチェックします。バイト・コードが検証されると、Java Runtimeはそれらの実行を準備します。
private
: 最も制限された修飾子。アクセスは、privateメンバー(メソッドなど)が定義された特定のクラス以外では許可されません。
protected
: 任意のサブクラス、または同じパッケージ内の他のクラスへのアクセスを許可します。
Package-private: 指定されない場合、これがデフォルトのアクセス・レベルとなります。同じパッケージ内のクラスへのアクセスを許可します。
public
: 要素にどこからでもアクセスできることは保証されなくなります。アクセス可能性は、その要素を含むパッケージがその定義モジュールによってエクスポートされるかどうか、およびそのモジュールをそれにアクセスしようとしているコードを含むモジュールで読み取れるかどうかによって異なります。
JDKでは、暗号化、公開鍵インフラストラクチャ、認証、安全な通信、アクセス制御など、主要なセキュリティ分野に渡る一連のAPIが定義されています。これらのAPIによって、開発者はアプリケーション・コードにセキュリティを簡単に統合できます。
これらのAPIは、次の方針に基づいて設計されました。
プロバイダは、アプリケーション間で相互運用できます。具体的に述べると、アプリケーションは、プロバイダからのデフォルト値に依存しない場合は、特定のプロバイダにバインドされません。
java.security.Provider
クラスは、セキュリティ・プロバイダの概念をJavaプラットフォームでカプセル化します。プロバイダの名前を指定し、実装するセキュリティ・サービスを一覧します。複数のプロバイダが同時に構成される場合があり、それらは優先順にリストされます。セキュリティ・サービスが要求されると、そのサービスを実装する、優先順位がいちばん高いプロバイダが選択されます。
アプリケーションは、関連するgetInstance
メソッドによって、基盤となるプロバイダからセキュリティ・サービスを要求します。
たとえば、メッセージ・ダイジェストの作成は、プロバイダから利用可能なサービスの1つのタイプを表します。特定のメッセージ・ダイジェスト・アルゴリズムの実装を要求するには、メソッドjava.security.MessageDigest.getInstanceを呼び出します。次の文は、プロバイダ名を指定せずにSHA-256メッセージ・ダイジェスト実装を要求します。
MessageDigest md = MessageDigest.getInstance("SHA-256");
次の図では、この文でSHA-256メッセージ・ダイジェスト実装がどのように取得されるかを示します。プロバイダが優先順位に従って検索され、その特定のアルゴリズムを提供する最初のプロバイダであるProviderB
からの実装が返されます。
オプションで、プロバイダ名を指定することで特定のプロバイダからの実装を要求できます。次の文は、特定のプロバイダProviderC
からのSHA-256メッセージ・ダイジェスト実装を要求します。
MessageDigest md = MessageDigest.getInstance("SHA-256", "ProviderC");
次の図では、この文で特定のプロバイダProviderC
からのSHA-256メッセージ・ダイジェスト実装がどのように要求されるかを示します。この場合は、優先順位の高いプロバイダであるProviderB
もSHA-256実装を提供していても、指定されたプロバイダからの実装が返されます。
メッセージ・ダイジェスト・アルゴリズムなどの暗号化サービスの詳細は、Javaの暗号化の項を参照してください。
OracleのJavaプラットフォーム実装には、アプリケーションによって使用できる一連の基本的なセキュリティ・サービスを実装する、組込みの多数のデフォルト・プロバイダが含まれています。Javaプラットフォームのほかのベンダーの実装には、ベンダー固有のセキュリティ・サービスのセットをカプセル化した、異なるプロバイダのセットが含まれている場合があります。組込みのデフォルト・プロバイダという用語は、Oracleの実装で利用可能なプロバイダのことを指しています。
次の表では、セキュリティ関連のいくつかのファイルおよびツールの場所をリストします。
表1-2 Javaセキュリティ・ファイルおよびツール
ファイル名またはツール名 | 場所 | 説明 |
---|---|---|
|
|
プロバイダの構成など、Javaセキュリティの特定の側面は、セキュリティ・プロパティを設定することでカスタマイズできます。 |
|
|
これはデフォルトのシステム・ポリシー・ファイルです。セキュリティ・ポリシーを参照してください。 |
暗号化ポリシー・ディレクトリ |
|
このディレクトリには、管轄ポリシー・ファイルのセットが含まれています。暗号化強度の構成を参照してください。 |
|
|
|
Windowsのみ: |
|
セキュリティ関連ツールの詳細は、Java Platform, Standard Editionツール・リファレンスでセキュリティのツールおよびコマンドを参照してください。 |
Java暗号化アーキテクチャは、Javaプラットフォームの暗号化機能へのアクセスおよび開発のためのフレームワークです。
これには、各種暗号化サービスのためのAPIが含まれています。それらを次に示します。
java.security
およびjava.security.*
パッケージには、輸出規制の対象ではないクラス(Signature
やMessageDigest
など)が含まれています。
javax.crypto
パッケージには、輸出規制の対象のクラス(Cipher
やKeyAgreement
など)が含まれています。
暗号化インタフェースはプロバイダ・ベースであり、複数の相互運用性のある暗号化実装が可能です。ソフトウェアで暗号化操作を行うプロバイダもあれば、スマートカード・デバイスやハードウェア暗号化アクセラレータなどのハードウェア・トークン上で暗号化操作を行うプロバイダもあります。輸出規制の対象のサービスを実装するプロバイダには、Oracle JCE証明書発行局によって発行された証明書でデジタル署名を行う必要があります。
Javaプラットフォームには、最も一般的に使用される暗号化アルゴリズムの多くのための組込みプロバイダが含まれています。それらは、RSA、DSAおよびECDSA署名アルゴリズム、AES暗号化アルゴリズム、SHA-2メッセージ・ダイジェスト・アルゴリズム、Diffie-Hellman (DH)およびElliptic Curve Diffie-Hellman (ECDH)鍵協定アルゴリズムなどです。組込みプロバイダの大部分は、Javaコードで暗号化アルゴリズムを実装しています。
Javaプラットフォームには、ネイティブPKCS#11 (v2.x)トークンへのブリッジとして機能する組込みプロバイダも含まれています。このプロバイダはSunPKCS11
という名前であり、JavaアプリケーションはPKCS#11に準拠するトークンに存在する暗号化サービスにシームレスにアクセスできます。
Windowsでは、JavaプラットフォームにネイティブMicrosoft CryptoAPIへのブリッジとして機能する組込みプロバイダが含まれています。このプロバイダはSunMSCAPI
という名前であり、JavaアプリケーションはCryptoAPIを介してWindows上の暗号化サービスにシームレスにアクセスできます。
公開鍵インフラストラクチャ(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を表す)と呼ばれる独自のファイルベースのキーストア・タイプと、DKS (Domain Key Store)と呼ばれるタイプも含まれます。DKSは単一の論理キーストアとして存在するキーストアのコレクションです。
Javaプラットフォームには、特別な組込みキーストアcacerts
が含まれています。このキーストアには、既知の信頼できるCAの多数の証明書が含まれています。keytoolユーティリティでは、cacerts
に含まれている証明書をリストできます。Java Platform, Standard Editionツール・リファレンスでkeytoolを参照してください。
Javaの暗号化の項で説明されている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 Platform, Standard Editionツール・リファレンスでkeytoolおよびjarsignerを参照してください。
認証とは、ユーザーのアイデンティティを判別するプロセスのことです。Java Runtime Environmentのコンテキストでは、実行中のJavaプログラムのユーザーを識別するプロセスのことです。このプロセスは、Javaの暗号化の項で説明したサービスに依存する場合があります。
Javaプラットフォームは、アプリケーションがプラガブルなログイン・モジュールによってユーザー認証を実行できるようにするAPIを提供します。アプリケーションはLoginContext
クラス(javax.security.auth.login
パッケージ内)を呼び出し、このクラスは構成を参照します。構成は、実際の認証を実行するために使用するログイン・モジュール(javax.security.auth.spi.LoginModule
インタフェースの実装)を指定します。
アプリケーションは、標準のLoginContext
APIと通信するだけなので、基盤となるプラグイン・モジュールから独立したままの状態を維持できます。アプリケーションでは、新規または更新されたモジュールをプラグインとして使用でき、アプリケーションを変更する必要はありません。次の図では、アプリケーションと基盤となるログイン・モジュールとの間の独立性を示します。
ログイン・モジュールはJavaプラットフォームで構成できるプラガブルなコンポーネントですが、セキュリティ・プロバイダを介してプラグインされません。したがって、セキュリティ・プロバイダの項で説明されているプロバイダ検索モデルには従いません。かわりに、図1-3で示したように、ログイン・モジュールは固有の構成によって管理されます。
Javaプラットフォームは、次の組込みログイン・モジュールを提供します。これらはすべて、com.sun.security.auth.module
パッケージ内にあります。
Krb5LoginModule
(Kerberosプロトコルを使用した認証用)JndiLoginModule
(LDAPまたはNISデータベースを使用したユーザー名/パスワード認証用)KeyStoreLoginModule
(PKCS#11トークン・キーストアなど、任意のタイプのキーストアへのログイン用)認証は、2つのピア間のセキュアな通信チャネルの確立プロセス中に実現することもできます。Javaプラットフォームは、多数の標準通信プロトコルの実装を提供します。これについては、セキュアな通信の項で説明します。
ネットワークを通じてやり取りされるデータには、意図された受信者以外の人もアクセスできます。データにパスワードやクレジット・カード番号などの個人情報が含まれる場合、権限のない者がデータを理解できないよう、手段を講じる必要があります。また、適切な相手にデータを送信し、意図的であるかどうかにかかわらず、通信中にデータが変更されないようにすることも重要です。
暗号化はセキュアな通信に必要な基盤を形成します。Javaの暗号化の項を参照してください。Javaプラットフォームは、多くの標準のセキュアな通信プロトコルにAPIのサポートとプロバイダ実装も提供します。
JDKは、SSL、TLSおよびDTLSプロトコルのAPIおよび実装を提供しています。これには、データの暗号化、メッセージの整合性、およびサーバーとクライアントの認証の機能が含まれています。アプリケーションは、SSL/TLS/DTLSを使用して、TCP/IP上のHTTPなど、任意のアプリケーション・プロトコル上の2つのピア間でセキュアなデータのやり取りを実現できます。
javax.net.ssl.SSLSocket
クラスは、通常のストリーム・ソケット(java.net.Socket
)上でSSL/TLSサポートをカプセル化するネットワーク・ソケットを表します。一部のアプリケーションは、別のデータ・トランスポート抽象化(New-I/Oなど)を使用する場合があります。javax.net.ssl.SSLEngine
クラスを使用して、SSL/TLS/DTLSパケットを生成および消費できます。
JDKには、プラガブルな(プロバイダ・ベースの)キー・マネージャおよびトラスト・マネージャの概念をサポートするAPIも含まれています。キー・マネージャはjavax.net.ssl.KeyManager
クラスによってカプセル化され、認証の実行に使用される鍵を管理します。トラスト・マネージャはTrustManager
クラス(同じパッケージ内)によってカプセル化され、管理するキーストア内の証明書に基づいて信頼できる人を決定します。
JDKには、次のSSL/TLS/DTLSプロトコルを実装する組込みプロバイダが含まれています。
Simple Authentication and Security Layer (SASL)は、認証およびオプションでクライアント・アプリケーションとサーバー・アプリケーション間のセキュリティ層の確立を行うプロトコルを指定するインターネット標準です。SASLは、認証データの交換方法を定義しますが、そのデータの内容は指定しません。認証データの内容およびセマンティックスを指定する特定の認証メカニズムが適合できるフレームワークです。さまざまなセキュリティ・レベルおよび配備シナリオ用にインターネット・コミュニティによって定義された、多数の標準SASLメカニズムがあります。
Java SASL APIは、java.security.saslモジュール内にあり、SASLメカニズムを使用するアプリケーション用のクラスおよびインタフェースを定義します。これは、メカニズムに依存しないように定義されています。APIを使用するアプリケーションを、特定のSASLメカニズムの使用に固定する必要はありません。アプリケーションは、必要なセキュリティ機能に基づいて、使用するメカニズムを選択できます。このAPIは、クライアントとサーバーの両方のアプリケーションをサポートしています。javax.security.sasl.Sasl
クラスを使用して、SaslClient
およびSaslServer
オブジェクトを作成します。
SASLメカニズムの実装は、プロバイダ・パッケージで提供されます。各プロバイダは、1つ以上のSASLメカニズムをサポートする場合があり、標準プロバイダ・アーキテクチャによって登録されて呼び出されます。
Javaプラットフォームには、次のSASLメカニズムを実装する組込みプロバイダが含まれています。
Javaプラットフォームには、Generic Security Service Application Programming Interface (GSS-API)用のJava言語バインディングを持つAPIが含まれています。これは、java.security.jgss
モジュール内にあります。GSS-APIにより、アプリケーション・プログラマは、様々な基盤となるセキュリティ・メカニズム上のセキュリティ・サービスに統一されたアクセスができます。Java GSS-APIでは現在Kerberos v5メカニズムを使用する必要があり、Javaプラットフォームにはこのメカニズムの組込み実装が含まれています。現時点では、追加のメカニズムをプラグインすることはできません。
Javaプラットフォームには、Simple and Protected GSS-API Negotiation Mechanism (SPNEGO) GSS-APIメカニズムの組込み実装も含まれています。
2つのアプリケーションがGSS-APIを利用して安全にメッセージを交換するには、事前にジョイント・セキュリティ・コンテキストを確立しておく必要があります。コンテキストは、共有状態の情報(暗号化鍵などを含む)をカプセル化します。両方のアプリケーションが、org.ietf.jgss.GSSContext
オブジェクトを作成および使用して、セキュリティ・コンテキストを構成する共有情報の確立および保守を行います。セキュリティ・コンテキストが確立されると、安全なメッセージ交換を準備するために使用できます。
Java GSS APIはorg.ietf.jgss
パッケージ内にあります。Javaプラットフォームは、KerberosPrincipal
、KerberosTicket
、KerberosKey
、KeyTab
など、基本的なKerberosクラスも定義します。これらはjavax.security.auth.kerberos
パッケージ内にあります。
Javaプラットフォームのアクセス制御アーキテクチャは、機密リソース(ローカル・ファイルなど)または機密アプリケーション・コード(クラス内のメソッドなど)へのアクセスを保護します。すべてのアクセス制御の決定は、java.lang.SecurityManager
クラスによって表されるセキュリティ・マネージャが仲介します。アクセス制御チェックを有効にするには、SecurityManager
をJava Runtimeにインストールする必要があります。
SecurityManager
がインストールされていると、JavaアプレットおよびJava Web Startアプリケーションは自動的に実行されます。ただし、java
コマンドによって実行されるローカル・アプリケーションは、SecurityManager
がインストールされていてもデフォルトでは実行されません。ローカル・アプリケーションをSecurityManager
で実行するには、アプリケーション自体がsetSecurityManager
メソッド(java.lang.System
クラス内)によってプログラムでそれを設定するか、またはコマンド行で-Djava.security.manager
引数を使用してjava
を呼び出す必要があります。
アクセス権は、システム・リソースへのアクセスを表します。アプレット(またはセキュリティ・マネージャとともに実行するアプリケーション)が、リソースへのアクセスを許可されるためには、アクセスを試みるコードに対し、該当するアクセス権を明示的に与える必要があります。
Javaコードがクラス・ローダーによってJava Runtimeにロードされると、クラス・ローダーは次の情報をそのコードに自動的に関連付けます。
この情報は、コードが信頼されないネットワークからダウンロードされたか(アプレットなど)、ファイル・システムからロードされたか(ローカル・アプリケーションなど)に関係なく、コードに関連付けられます。コードのロード元の場所はURLで表され、コード署名者は署名者の証明書チェーンによって表され、デフォルトのアクセス権はjava.security.Permission
オブジェクトによって表されます。
ダウンロードされたコードに自動的に付与されるデフォルトのアクセス権には、コードの出所であるホストへのネットワーク接続を行う機能が含まれています。ローカル・ファイル・システムからロードされたコードに自動的に付与されるデフォルトのアクセス権には、コードの出所であるディレクトリおよびそのディレクトリのサブディレクトリからファイルを読み取る機能が含まれています。
コードを実行しているユーザーのアイデンティティは、クラス・ローディング時に利用できません。アプリケーション・コードで、必要に応じてエンド・ユーザーを認証する必要があります(認証の項を参照)。ユーザーが認証されると、javax.security.auth.Subject
クラスのdoAs
メソッドを呼び出すことによって、アプリケーションはそのユーザーを実行コードに動的に関連付けることができます。
クラスローダによって、限られた一連のデフォルト・アクセス権がコードに付与されます。管理者は、セキュリティ・ポリシーによって、追加のコード・アクセス権を柔軟に管理できます。
Java SEは、セキュリティ・ポリシーの概念をjava.security.Policy
クラスにカプセル化します。Java RuntimeにインストールされるPolicy
オブジェクトはいつでも1つのみです。Policy
オブジェクトの基本的な役割は、保護されたリソースへのアクセスがコード(ロード元の場所、署名者、および実行者によって特徴付けられる)に許可されるかどうかを決定することです。Policy
オブジェクトがこの決定を行う方法は、実装によって異なります。たとえば、承認データを含むデータベースに問い合わせたり、別のサービスに問い合わせたりする場合があります。
Java SEには、セキュリティ・プロパティ・ファイル内に構成された1つ以上のASCII (UTF-8)ファイルから承認データを読み込む、デフォルトのPolicy
実装が含まれています。これらのポリシー・ファイルには、コードに付与されるアクセス権の厳密なセットが含まれています。具体的には、特定の場所からロードされ、特定のエンティティによって署名され、特定のユーザーとして実行されるコードに付与されるアクセス権の厳密なセットです。各ファイル内のポリシー・エントリは、ドキュメント化された独自の構文に準拠する必要があり、単純なテキスト・エディタまたはグラフィカルなpolicytool
ユーティリティを使用して作成できます。
注意:
policytool
は推奨されておらず、次のJDKメジャー・リリースでの削除対象としてマークされています。Java Runtimeは、プログラムの実行時に行われた一連のJava呼出しを追跡します。保護されたリソースへのアクセスが要求された場合、デフォルトでは、要求されたアクセスを許可するかどうかを決定するために呼出しスタック全体が評価されます。
前述したように、リソースはSecurityManager
によって保護されます。JDK内およびアプリケーション内の、セキュリティの影響を受けるコードは、次のようなコードでリソースへのアクセスを保護します。
SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(perm); }
Permissionオブジェクトperm
は、要求されたアクセスに対応します。たとえば、ファイル/tmp/abc
を読み取ろうとすると、アクセス権は次のように構成される場合があります。
Permission perm = new java.io.FilePermission("/tmp/abc", "read");
SecurityManager
のデフォルトの実装は、その決定をjava.security.AccessController
実装に委譲します。AccessController
は、呼出しスタックをトラバースして、スタック内の各コード要素を、要求されたアクセス権(たとえば、前述の例ではFilePermission
)とともに、インストールされているセキュリティPolicy
に渡します。Policy
は、管理者によって構成されたアクセス権に基づいて、要求されたアクセスを付与するかどうかを決定します。アクセスが付与されない場合、AccessController
はjava.lang.SecurityException.
をスローします。
図1-4は、アクセス制御の適用を示しています。この特定の例では、最初に2つの要素ClassA
およびClassB
が呼出しスタックにあります。ClassA
は、ClassB
内のメソッドを呼び出します。これは次に、java.io.FileInputStream
のインスタンスを作成することで、ファイル/tmp/abc
へのアクセスを試みます。FileInputStream
コンストラクタは、FilePermission
、perm
を作成してから、前述のように、perm
をSecurityManager
クラスのcheckPermission
メソッドに渡します。この特定の例では、ClassA
およびClassB
のアクセス権のみをチェックする必要があります。これは、FileInputStream
、SecurityManager
およびAccessController
など、java.base
モジュール内のすべてのクラスは、すべてのアクセス権を自動的に受け取るためです。
この例では、ClassA
とClassB
には異なるコード特性があります(出所および署名者が異なります)。それぞれに異なるアクセス権が付与されている場合があります。要求されたFilePermission
が両方のクラスに付与されていることをPolicy
が示した場合にのみ、AccessController
は要求されたファイルへのアクセスを付与します。
Java XMLデジタル署名APIは、XML署名を生成および検証するための標準のJava APIです。
XML署名は、どのタイプ(XMLまたはバイナリ)のデータにも適用できます(XML署名の構文と処理を参照)。結果の署名は、XMLで表されます。XML署名は、データを保護するために使用でき、データの整合性、メッセージ認証、および署名者認証を提供します。
APIは、「XML-Signature Syntax and Processing」でのW3C勧告の必須機能または推奨機能をすべてサポートするように設計されています。APIは拡張可能およびプラガブルであり、Java暗号化サービス・プロバイダ・アーキテクチャに基づいてます。
Java XMLデジタル署名APIは、java.xml.cryptoモジュール内にあり、次の6つのパッケージで構成されます。
javax.xml.crypto
javax.xml.crypto.dsig
javax.xml.crypto.dsig.keyinfo
javax.xml.crypto.dsig.spec
javax.xml.crypto.dom
javax.xml.crypto.dsig.dom
その他のJavaセキュリティ・ドキュメントは、Java SEセキュリティにあります。
注意:
歴史的に、新しいタイプのセキュリティ・サービスがJava SEに追加されると(最初は拡張機能としての場合もある)、それらを表すために様々な略語が使用されました。これらの略語は、現在もJavaセキュリティ・ドキュメント内で使用されています。次に、それらが何を表すかを説明します。JSSE (Java Secure Socket Extension)とは、SSL、TLSおよびDTLSプロトコルの項で示されているように、SSL関連のサービスを表します。
JCE (Java Cryptography Extension)とは、Javaの暗号化の項で示されているように、暗号化サービスを表します。
JAAS (Java Authentication and Authorization Service)とは、認証とアクセス制御の項でそれぞれ示されているように、認証およびユーザーベースのアクセス制御のサービスを表します。
次の表では、Javaセキュリティのクラスおよびインタフェースの名前、パッケージおよび使用方法をいくつか示します。
表1-3 Javaセキュリティのパッケージおよびクラス
パッケージ | クラス名またはインタフェース名 | 使用方法 | モジュール |
---|---|---|---|
java.lang |
SecurityException |
セキュリティ違反を示します | java.base |
java.lang |
SecurityManager |
すべてのアクセス制御の決定を仲介します | java.base |
java.lang |
System |
SecurityManagerをインストールします | java.base |
java.security |
AccessController |
アクセス制御の決定を行うために、SecurityManagerのデフォルトの実装によって呼び出されます | java.base |
java.security |
DomainLoadStoreParameter |
ドメイン・キーストア(DKS)のパラメータを保存します | java.base |
java.security |
Key |
暗号化鍵を表します | java.base |
java.security |
KeyStore |
鍵および信頼できる証明書のリポジトリを表します | java.base |
java.security |
MessageDigest |
メッセージ・ダイジェストを表します | java.base |
java.security |
Permission |
特定のリソースへのアクセスを表します | java.base |
java.security |
PKCS12Attribute |
PKCS12キーストアの属性をサポートします | java.base |
java.security |
Policy |
セキュリティ・ポリシーをカプセル化します | java.base |
java.security |
Provider |
セキュリティ・サービスの実装をカプセル化します | java.base |
java.security |
Security |
セキュリティ・プロバイダおよびセキュリティ・プロパティを管理します | java.base |
java.security |
Signature |
デジタル署名を作成および検証します | java.base |
java.security.cert |
Certificate |
公開鍵証明書を表します | java.base |
java.security.cert |
CertStore |
関連性がなく通常は信頼されない証明書のリポジトリを表します | java.base |
java.security.cert |
CRL |
CRLを表します | java.base |
javax.crypto |
Cipher |
暗号化および復号化を実行します | java.base |
javax.crypto |
KeyAgreement |
鍵交換を実行します | java.base |
javax.net.ssl |
KeyManager |
SSL/TLS認証を実行するために使用される鍵を管理します | java.base |
javax.net.ssl |
SSLEngine |
アプリケーションがトランスポート・メカニズムを自由に選択できるように、SSL/TLSパケットを生成および消費します | java.base |
javax.net.ssl |
SSLSocket |
通常のストリーム・ソケット上でSSL/TLSサポートをカプセル化するネットワーク・ケットを表します | java.base |
javax.net.ssl |
TrustManager |
SSL/TLSインタラクションで信頼できる人に関する決定を行います(たとえば、キーストア内の信頼できる証明書に基づく) | java.base |
javax.security.auth |
Subject |
ユーザーを表します | java.base |
javax.security.auth.kerberos |
KerberosPrincipal |
Kerberosプリンシパルを表します | java.base |
javax.security.auth.kerberos |
KerberosTicket |
Kerberosチケットを表します | java.base |
javax.security.auth.kerberos |
KerberosKey |
Kerberos鍵を表します | java.base |
javax.security.auth.kerberos |
KerberosTab |
Kerberosキータブ・ファイルを表します | java.base |
javax.security.auth.login |
LoginContext |
プラガブルな認証をサポートします | java.base |
javax.security.auth.spi |
LoginModule |
特定の認証メカニズムを実装します | java.base |
javax.security.sasl |
Sasl |
SaslClientおよびSaslServerオブジェクトを作成します | java.security.sasl |
javax.security.sasl |
SaslClient |
SASL認証をクライアントとして実行します | java.security.sasl |
javax.security.sasl |
SaslServer |
SASL認証をサーバーとして実行します | java.security.sasl |
org.ietf.jgss |
GSSContext |
GSS-APIセキュリティ・コンテキストをカプセル化し、コンテキストによって使用可能なセキュリティ・サービスを提供します | java.security.jgss |
com.sun.security.auth.module |
JndiLoginModule |
LDAPまたはNISを使用して、ユーザー名/パスワード認証を実行します | jdk.security.auth |
com.sun.security.auth.module |
KeyStoreLoginModule |
キーストア・ログインに基づいて認証を実行します | jdk.security.auth |
com.sun.security.auth.module |
Krb5LoginModule |
Kerberosプロトコルを使用して認証を実行します | jdk.security.auth |
次のAPIは推奨されておらず、将来のリリースでの削除対象となっています。
jdeprscan
ツールを使用してこのAPIの依存性を確認できます。Java Platform, Standard Editionツール・リファレンスでjdeprscanを参照してください。
次のクラスは推奨されておらず、削除対象としてマークされています。
次のフィールドは推奨されておらず、削除対象としてマークされています。
次の表では、JavaセキュリティおよびKerberos関連のツールを示します。
Java Platform, Standard Editionツール・リファレンスでセキュリティのツールおよびコマンドを参照してください。
表1-4 Javaセキュリティのツール
ツール | 使用方法 |
---|---|
jar |
Java Archive (JAR)ファイルを作成します |
jarsigner |
JARファイルの署名および署名の検証を行います |
keytool |
キーストアを作成および管理します |
policytool |
デフォルトのPolicyの実装とともに使用するポリシー・ファイルを作成および編集します 注意: policytool は推奨されておらず、削除対象としてマークされています。 |
Windows用のJDKに同梱される3つのKerberos関連ツールもあります。同等の機能が、自動的にSolarisおよびLinuxオペレーティング環境の一部になる同じ名前のツールで提供されています。
表1-5 Kerberos関連のツール
ツール | 使用方法 |
---|---|
kinit |
Kerberosチケット認可チケットを取得およびキャッシュします |
klist |
ローカルのKerberos資格キャッシュおよびキー表のエントリを一覧します |
ktab |
ローカルのKerberosキー表に格納された名前およびサービス鍵を管理します |