このチュートリアルで開発するクライアントおよびサーバー・アプリケーションでは、認証とセキュアな通信の両方の分野でKerberos Version 5を使用します。このため、このドキュメントは、Kerberosに習熟している読者を対象としています。詳細は、Kerberosのドキュメントを参照してください。
Java GSS-APIメソッドに必要なJAASフレームワークおよびKerberosメカニズムは、すべてのベンダーが提供するJDKに組み込まれています。ベンダーの提供するJDKの中には、このチュートリアルのJAAS認証に必要なKerberos LoginModuleを使用できないものもある可能性があります。OracleのJDKで提供されるKerberos用のLoginModuleを使用します。
サンプル・プログラムを実行するには、インストールされたKerberosにアクセスする必要があります。続くセクションで説明するように、Kerberos構成ファイルkrb5.conf
、およびこのファイルの格納先に関する記述も必要です。
すべてのKerberosインストールで、Kerberos Key Distribution Center (KDC)が必要です。これには、Kerberosへの認証に使用するユーザー名およびパスワードを含める必要があります。
注意:
KDC実装は、JDKの一部ではなくKerberosインストールの一部です。
大半のKerberosインストールで、デフォルトのレルムおよびKDCなどの確認に、Kerberos構成ファイルkrb5.conf
が参照されます。(Windowsなどで提供される) krb5.conf
ファイルを含まないKerberos実装を使用している場合、このファイルを作成するか、デフォルトのレルムおよびKDCを表すプロパティの設定の説明に従ってシステム・プロパティを使用する必要があります。
一般に、デフォルトのレルムおよびそのレルムのKDCは、Kerberos構成ファイルkrb5.conf
に指定されます。ただし、次に示すシステム・プロパティにレルムおよびKDCをそれぞれ設定することにより、これらの値を指定することも可能です。
java.security.krb5.realm java.security.krb5.kdc
プロパティを設定する場合、1つだけ設定するのではなく、両方とも設定する必要があります。
また、これらのプロパティを設定する場合、krb5.conf
ファイルも指定しないかぎり、相互レルム認証は行えません。理由は、このファイルから、相互レルム認証に必要な追加情報を取得するためです。
これらのプロパティの値を設定する場合、krb5.conf
に指定されたデフォルトのレルムおよびKDC値はオーバーライドされます。デフォルトのレルムおよびKDC以外の項目で値が必要な場合にも、krb5.conf
ファイルが参照されます。krb5.conf
ファイルが見つからない場合、これらの項目に使用されるデフォルト値は、実装により異なります。
必須のKerberos構成情報は、デフォルト・レルムおよびデフォルトKDCです。「デフォルトのレルムおよびKDCを表すプロパティの設定」で説明したように、これらの値を示すプロパティを設定した場合、値はkrb5.conf
構成ファイルからは取得されません。
これらのプロパティに値が設定されていないか、ほかのKerberos構成情報が必要な場合、krb5.conf
ファイル内で必要な情報の検出が試みられます。krb5.conf
ファイルを検出するアルゴリズムを、次に示します。
システム・プロパティjava.security.krb5.conf
が設定されている場合、その値にパスおよびファイル名が指定されていると見なされます。
このシステム・プロパティが設定されていない場合、次のディレクトリ内で構成ファイルが検索されます。
<java-home>\conf\security
(Windows)<java-home>/conf/security
(Solaris、LinuxおよびmacOS)ここで、<java-home>
はJDKがインストールされているディレクトリを指します。
ファイルが見つからない場合、次で検索が行われます。
/etc/krb5/krb5.conf
(Solaris)C:\Windows\krb5.ini
(Windows)/etc/krb5.conf
(Linux)~/Library/Preferences/edu.mit.Kerberos
、/Library/Preferences/edu.mit.Kerberos
または/etc/krb5.conf
(macOS)それでもファイルが見つからず、かつ検索中の構成情報がデフォルトのレルムおよびKDCではない場合、実装固有のデフォルトが使用されます。一方、検索中の構成情報がデフォルトのレルムおよびKDCの場合、構成情報がシステム・プロパティに指定されておらず、krb5.conf
ファイルも見つからないため、例外がスローされます。
Windowsでは、krb5.conf
ファイルが見つからないか、デフォルトのレルムおよびそのKDCの設定が含まれていない場合、環境変数USERDNSDOMAIN
およびLOGONSERVER
はデフォルトのレルムおよびそのKDCとして使用されます。
規則により、すべてのKerberosレルム名には大文字を使用し、すべてのDNSホスト名とドメイン名には小文字を使用します。Windowsでは、ドメインがKerberosレルムにもなっていますが、レルム名は常にドメイン名を大文字に変えた名前になります。
ホスト名は大文字と小文字が区別されませんが、命名規則によりすべて小文字にします。ホスト名は、それぞれのネーム・サービスにより、クライアントとサーバーで同じホスト名に解決される必要があります。
ただし、Kerberosデータベースのホスト名は、大文字と小文字が区別されます。KDCのホスト・ベースのすべてのKerberosサービス・プリンシパルでは、ホスト名の大文字と小文字が区別されます。Kerberosサービス・プリンシパル名で使用されるホスト名は、ネーム・サービスから返されるホスト名と完全に一致する必要があります。たとえば、ネーム・サービスがraven.example.com
などの完全修飾された小文字によるDNSホスト名を返してきた場合、管理者は、KDCでホスト・ベースのプリンシパル名を作成する際に、host/raven.example.com
のように完全修飾された小文字による同じDNSホスト名を使用する必要があります。
相互レルム認証では、1つのレルムのプリンシパルが別のレルムのプリンシパルを認証できます。
Kerberosでは、2つのレルムで暗号鍵を共有することにより、相互レルム認証を実装しています。2つの異なるレルムのKDCが特別な相互レルムの秘密鍵を共有し、レルム間の境界を越える場合に、この秘密鍵を使用して識別情報を証明します。
共有される鍵は、Ticket Granting Serviceプリンシパルの鍵です。単一レルムの場合の標準的なTicket Granting Serviceプリンシパルを示します。
ktbtgt/EXAMPLE.COM@EXAMPLE.COM
相互レルム認証では、それぞれの参加レルムで2つのプリンシパルが作成されます。レルムが2つの場合は、ENG.EAST.EXAMPLE.COM
とSALES.WEST.EXAMPLE.COM
が作成され、これらのプリンシパルは次のようになります。
krbtgt/ENG.EAST.EXAMPLE.COM@SALES.WEST.EXAMPLE.COM krbtgt/SALES.WEST.EXAMPLE.COM@ENG.EAST.EXAMPLE.COM
リモートTicket Granting Serverプリンシパルと呼ばれるこれらのプリンシパルは、両方のレルムで作成する必要があります。
Windows KDCでは、Windowsドメインが作成されると、krbtgt
アカウントが自動的に作成されます。このアカウントは、削除したり名前を変更したりすることはできません。