第I部: Java認証・承認サービス(JAAS)を使用したセキュアな認証

課題1: JAAS APIの使用

この課題の目標

この課題の目標は、Java Authentication and Authorization (JAAS) APIを使用して認証を行う方法について学習することです。

この課題の内容

JAASは、Javaプラットフォーム用の標準のプラガブル認証フレームワーク(PAM)を提供しています。アプリケーションは、JAAS APIを使用して認証(このアプリケーションを使用しているユーザーのアイデンティティを確認し、そのユーザーのアイデンティティ情報をサブジェクトと呼ばれるコンテナに収集するプロセス)を実行します。次に、そのアプリケーションは、JAAS APIとともにこのサブジェクト内のアイデンティティ情報を使用して認証判断を行い、認証されるユーザーが保護されているリソースへのアクセス、または制限されているアクションの実行が許可されているかどうかを判断します。この課題では、JAAS認証について説明します。JAAS承認については説明しません。

実行手順

  • Jass.javaサンプル・コードを参照してください。このコードでは、次のタスクが実行されます。

    1. コールバック・ハンドラを定義するか、または事前定義されているハンドラを使用します。
    2. 使用するJAAS構成エントリを識別する名前でLoginContextを作成します。
    3. 認証を実行します。
    4. 認証されたユーザーが実行するタスクを定義します。
    5. 認証されたユーザーとしてアクションを実行します。
    6. ログアウトします。

    Subject.doAsは、MyActionに定義されているコードを認証されたユーザーとして実行します(行14から15)。このことは、次の2つの目的のために行われます。最初に、サービスを認証するためにアイデンティティ情報を必要とするMyAction内のコードは、サブジェクトからその情報を取得します。この課題では、このことについて説明します。次に、MyActionが保護されているリソースまたは操作にアクセスする場合、現在のサブジェクトのアイデンティティ情報を使用して、対応するアクセス制御が決定されます。この2番目の点は、この課題では説明しません。

  • %JAVA_HOME%/binがPATH環境変数に含まれていることを確認します。

  • 変更したサンプル・コードをコンパイルします。いくつかの設定を行なったあと、後続の課題でこのコードを実行します。これでこの課題は終了です。

サマリー

この課題では、JAAS APIの主なクラスであるLoginContextおよびSubjectが使用されています。LoginContextを使用してユーザーを認証し、Subjectにそのユーザーのアイデンティティ情報を収集する方法について学習しました。次に、Subjectを使用して認証されたユーザーとしてアクションを実行する方法についても学習しました。

次の手順

課題2: Kerberos認証用のJAASの構成に進み、認証用にKerberosを使用するためにサンプル・アプリケーションを構成する方法について学習します。

課題2: Kerberos認証用のJAASの構成

この課題の目標

この課題の目標は、認証用にKerberosを使用するためにJAASアプリケーションを構成する方法について学習することです。

この課題のKerberosの内容

Kerberosは、RFC 4120に定義されている、信頼できる第三者の認証を行うためのインターネット標準プロトコルです。これは、Solaris、Windows、Linuxなど、ほとんどの最新のコンピューティング・プラットフォームで使用できます。

Kerberosアーキテクチャでは、Key Distribution Center (KDC)と呼ばれる信頼できる認証サービスが軸となります。Kerberos環境内のユーザーおよびサービスは「プリンシパル」と呼ばれます。各プリンシパルは、KDCを使用してパスワードなどの秘密を共有します。プリンシパルは、共有の秘密を知っていることをKDCに対して証明することによって、Kerberosに対して認証します。 認証が正常に行われると、KDCはプリンシパルにTicket-Granting-Ticket(TGT)を発行します。プリンシパルは、その後、ディレクトリ・サービスやファイル・サービスなどのネットワーク上のサービスへの認証を行う場合(つまり、サービスの「クライアント」として動作する場合)、TGTをKDCに渡してサービス・チケットを取得し、サービスと通信します。サービス・チケットは、クライアントとサービスのプリンシパルのアイデンティティを示すだけでなく、その後セキュアな通信を確立するためにクライアントとサービスが使用できるセッション鍵も含みます。サービスに対して認証を行うために、クライアントはサービス・チケットをサービスに送信します。サービスは、そのチケットを受信した後、KDCと共有する秘密を使用してそのチケットを復号化します。

このアーキテクチャでは、プリンシパルはKDCに対して直接(1回のみ)認証します。プリンシパルは、サービス・チケットを使用して他のすべてのサービスに対して間接的に認証します。KDCでは、サービス・チケットによってプリンシパルのアイデンティティが保証されます。明示的な認証を1回のみ行って、プリンシパルが複数のセキュアなサービスにアクセスできる機能のことを、シングル・サインオンと呼びます。

この課題のJAASの内容

JAASでは、クライアント・プリンシパルの場合、「Kerberosにログインする」とは、TGTを取得して、クライアントがアクセスするサービスへの認証に使用できるようにSubjectにそのTGTを配置することを意味します。サービス・プリンシパルの場合、「Kerberosにログインする」とは、着信するクライアント認証要求を復号化するときにサービスが必要とする秘密鍵を取得することを意味します。

実行手順

  1. jaas-krb5.conf構成ファイルを調べます。

    このファイルには、clientserverという2つのエントリがあります。clientエントリは、LoginContextcom.sun.security.auth.module.Krb5LoginModuleを使用する必要があることを示しています。serverエントリは、LoginContextで同じログイン・モジュールを使用し、プリンシパルhost/machineNameに対してsample.keytabファイルのキーを使用する必要があることを示しています。

  2. hostnameコマンドを実行して、マシンのホスト名を判別します。

  3. このファイルを編集して、使用中のマシンの名前を使用するためにサーバー・プリンシパルのエントリを変更します。たとえば、マシンの名前がj1hol-001の場合、構成ファイルのこの行は次のように見えるはずです。

    principal="host/j1hol-001"
  4. 次のコマンドを入力して、クライアント認証を実行します。

    % java -Djava.security.auth.login.config=jaas-krb5.conf Jaas client

    パスワードの入力を求められます。次の出力が表示されます。passwordを安全なパスワードに置き換えます。

    Kerberos password for test: password
    Authenticated principal: [test@J1LABS.EXAMPLE.COM]
    Performing secure action...
  5. 次のコマンドを入力して、サーバー認証を実行します。

    % java -Djava.security.auth.login.config=jaas-krb5.conf Jaas server

    次の出力が表示されるはずです。

    Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM] Performing secure action...

サマリー

この課題では、ユーザー名とパスワードを対話式に入力するクライアント・プリンシパル、およびkeytabファイルから鍵を取得するサービス・プリンシパルとして、Kerberosログイン・モジュールを使用するためにJAASアプリケーションを構成する方法について学習しました。

次の手順

第II部: Java SE Security APIを使用したセキュアな通信に進み、Java Security APIを使用してセキュアな通信チャネルを確立する方法について学習します。