第 I 部:Java Authentication and Authorization Service (JAAS) を使用した安全な認証

課題 1:JAAS API の使用

この課題の目標:

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

この課題の内容:

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

この課題のリソース:

  1. JAAS リファレンスガイド
  2. JAAS チュートリアル
  3. JAAS javadocs:javax.security.authjavax.security.auth.callbackjavax.security.auth.kerberosjavax.security.auth.loginjavax.security.auth.spijavax.security.auth.x500
  4. JAAS white paper

実行手順:

  1. 次のサンプルコードを参照してください。これは src/Jaas.java にあります。このコードでは、次のタスクが実行されます。
    1. コールバックハンドラを定義するか、または事前定義されているハンドラを使用します。(行 2)
    2. どの JAAS 構成エントリを使うかがわかる名前で LoginContext を作成します。(行 5)
    3. 認証を実行します。(行 8)
    4. 認証されたユーザーが実行するタスクを定義します。(行 11)
    5. 認証されたユーザーとしてアクションを実行します。(行 14 から 15)
    6. ログアウトします。

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

    Jaas.java のコードリスト



    1. // Create a callback handler
    2. CallbackHandler callbackHandler = new TextCallbackHandler();
    3.  
    4. // Create LoginContext with a callback handler
    5. LoginContext context = new LoginContext(name, callbackHandler);
    6.  
    7. // Perform authentication
    8. context.login();
    9.  
    10. // Create action to perform
    11. PrivilegedAction action = new MyAction();
    12.  
    13. // Perform action as authenticated user
    14. Subject subject = context.getSubject();
    15. Subject.doAs(subject, action);
    16.  
    17. // Logout
    18. context.logout();

  1. %JAVA_HOME%/bin がパスに含まれていて、%JAVA_HOME% 変数によってポイントされている JDK が Java SE 6 をポイントしていることを確認します。

  2. 変更したサンプルコードをコンパイルします。
    
    % cd auth/src
    % javac Jaas.java
    
    いくつかの設定を行ったあと、後続の課題でこのコードを実行します。これでこの課題は終了です。

まとめ:

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

次の手順

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


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

この課題の目標:

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

この課題の Kerberos の内容:

Kerberos は、RFC 4120 に定義されている、信頼できる第三者の認証を行うためのインターネット標準プロトコルです。 Kerberos は、Solaris、Windows XP、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 ログインモジュール開発者ガイド
  2. The Kerberos Network Authentication Service (v5)
  3. サンプルログイン構成
  4. ログインモジュールパッケージ javadocs:com.sun.security.auth.module
  5. JAAS および Java GSS-API チュートリアル

実行手順:

  1. JAAS 構成ファイルを調べます。これは src/jaas-krb5.conf にあります。

このファイルには、「クライアント」および「サーバー」の 2 つのエントリがあります。「クライアント」エントリは、LoginContextcom.sun.security.auth.module.Krb5LoginModule を使用する必要があることを示しています。「サーバー」エントリは、LoginContext は同じログインモジュールを使用し、主体 host/machineName に対して sample.keytab ファイルのキーを使用する必要があることを示しています。


jaas-krb5.conf のコードリスト


  1. client {
  2.     com.sun.security.auth.module.Krb5LoginModule required
  3.     principal="test";
  4. };
  5. server {
  6.    com.sun.security.auth.module.Krb5LoginModule required
  7.     useKeyTab=true
  8.     storeKey=true
  9.     keyTab=sample.keytab
  10.     principal="host/machineName";
  11. };



  1. hostname コマンドを使用して、マシンのホスト名を判別します。
% hostname
  1. このファイルを編集して、使用中のマシンの名前を使用するためにサーバー主体のエントリを変更します。たとえば、マシンの名前が j1hol-001 の場合は、構成ファイルの該当する行を次のように変更します。
principal="host/j1hol-001"
  1. 次を入力してクライアント認証を行います。
% java -Djava.security.auth.login.config=jaas-krb5.conf\
     Jaas client


パスワードの入力を求められます。「changeit」を入力します。次の出力が表示されます。


jaas-krb5.conf の「クライアント」エントリを使用して JAAS サンプルを実行したときの出力


  1. Kerberos password for test:changeit
  2. Authenticated principal:[test@J1LABS.EXAMPLE.COM]
  3. Performing secure action...


  1. 次を入力してサーバー認証を行います。
% java -Djava.security.auth.login.config=jaas-krb5.conf\
     Jaas server


次の出力が表示されます。


jaas-krb5.conf の「サーバー」エントリを使用して JAAS サンプルを実行したときの出力


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



まとめ:

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



次の手順

  1. 第 II 部に進み、Java Security API を使用して安全な通信チャネルを確立する方法について学習します。