第 I 部:Java 認証・承認サービス (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 javadoc: javax.security.authjavax.security.auth.callbackjavax.security.auth.kerberosjavax.security.auth.loginjavax.security.auth.spijavax.security.auth.x500
  4. Java 認証・承認サービス

実行手順:

  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. ログインモジュールパッケージ javadoc: 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 を使用してセキュアな通信チャネルを確立する方法について学習します。


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