この文書は2016年以降更新されていません

JAAS に関するチートシート

OWASP 作成
ジャンプ先: 移動検索
Cheatsheets-header.jpg

最終改訂日 (yy/mm/dd): 2015/07/18

はじめに

JAAS 認証とは

ユーザーまたは別のシステムの ID を検証するプロセスが認証です。JAAS は、認証フレームワークとして、認証対象ユーザーの ID とクレデンシャル情報をログインからログアウトまで管理します。

JAAS 認証のライフサイクルは次のとおりです。

  1. LoginContext を生成する。
  2. 初期化する 1 つ以上の LoginModule の構成ファイルを読み込む。
  3. 初期化する LoginModule ごとに LoginContext.initialize () を呼び出す。
  4. LoginModule ごとに LoginContext.login () を呼び出す。
  5. ログインに成功した場合は LoginContext.commit () を呼び出し、それ以外の場合は LoginContext.abort () を呼び出す。

構成ファイル

JAAS 構成ファイルには、アプリケーションへのログオンに使用できる LoginModule ごとに LoginModule スタンザが 1 つずつ含まれています。

JAAS 構成ファイルのスタンザの例を次に示します。

Branches
{
     USNavy.AppLoginModule required
     debug=true
     succeeded=true;
}

LoginModule のエントリーとスタンザの両方を終了するセミコロンの位置に注意してください。required という語は、ユーザーがログインするには LoginContext の login () メソッドが成功裏に完了しなければならないことを意味します。debug="true"、succeeded="true" などのように、LoginModule 固有のキーと値が LoginModule に渡されます。これらの値は LoginModule によって定義され、その使用方法は LoginModule 内で管理されます。オプションを構成するには、debug="true" のようなキーと値のペアを使用します。キーと値は等号で区切ります。

Main.java (クライアント)

  • 実行構文
Java –Djava.security.auth.login.config==packageName/packageName.config 
     packageName.Main Stanza1
説明: 
packageName は、構成ファイルが格納されているディレクトリです。 
packageName.config は、Java パッケージ packageName 内の構成ファイルを指定します。 
packageName.Main は、Java パッケージ packageName 内の Main.java を指定します。 
Stanza1 は、Main () が構成ファイルから読み込むスタンザの名前です。
  • 実行時の第 1 コマンドライン引数は、構成ファイルのスタンザです。使用する LoginModule がこのスタンザで指定されます。第 2 引数は CallbackHandler です。
  • Main.java に渡された引数を使用して新しい LoginContext を生成します。
    • loginContext = new LoginContext (args[0], new AppCallbackHandler ());
  • LoginContext.Login モジュールを呼び出します。
    • loginContext.login ();
  • 成功した Option 内の値が loginContext.login () から返されます。
  • ログインに成功した場合は、サブジェクトが生成されています。

LoginModule.java

LoginModule には以下の認証メソッドが必須です。

  • initialize ()
  • login ()
  • commit ()
  • abort ()
  • logout ()

initialize ()

Main () で、LoginContext が構成ファイルから適切なスタンザを読み込んだ後、LoginContext がそのスタンザで指定された LoginModule のインスタンスを生成します。

  • initialize () メソッドのシグネチャ
    • Public void initialize (Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options)
  • 上の各引数は、次のように保存する必要があります。
    • this.subject = subject;
    • this.callbackHandler = callbackHandler;
    • this.sharedState = sharedState;
    • this.options = options;
  • initialize () メソッドは以下の操作を実行します。
    • login () が成功したら、Subject クラスの subject オブジェクトを生成します。
    • ログイン情報を取得するためにユーザーと対話する CallbackHandler を設定します。
    • 1 つの LoginContext で複数の LoginModule が指定されている場合 (これは有効です)、各 LoginModule は sharedState マップを介して情報を共有できます。
    • debug、succeeded などのステータス情報を options マップに保存します。

login ()

ユーザーが指定したログイン情報を取得します。次のコードスニペットは、2 つのコールバックオブジェクトから成る配列を宣言しています。この配列は、callbackHandler.java プログラムの callbackHandler.handle メソッドに渡されると、ユーザーが入力したユーザー名とパスワードが読み込まれます。

NameCallback nameCB = new NameCallback("Username");
PasswordCallback passwordCB = new PasswordCallback ("Password", false);
Callback[] callbacks = new Callback[] { nameCB, passwordCB };
callbackHandler.handle (callbacks);
  • ユーザーを認証します。
  • ユーザーが入力した情報をコールバックオブジェクトから取得します。
    • String ID = nameCallback.getName ();
    • char[] tempPW = passwordCallback.getPassword ();
  • 名前と tempPW を、LDAP などのリポジトリに格納されている値と照合します。
  • 変数 succeeded の値を設定し、Main () に復帰します。

commit ()

login () でユーザーの資格情報が正常に確認されると、JAAS 認証フレームワークは必要に応じてその資格情報をサブジェクトに関連付けます。資格情報には公開とプライベートの 2 種類があります。公開資格情報には公開鍵が含まれます。プライベート資格情報にはパスワードと公開鍵が含まれます。従業員番号やユーザーグループの会員 ID などのプリンシパル (サブジェクトが持つログイン名以外の ID) がサブジェクトに追加されます。次に commit () メソッドの例を示します。この例では、まず、認証されたユーザーが所属するグループごとに、グループ名がプリンシパルとしてサブジェクトに追加されます。次に、サブジェクトのユーザー名がその公開資格情報に追加されます。


任意のプリンシパルと 1 つの公開資格情報を設定してサブジェクトに追加するコードスニペットを次に示します。 :

public boolean commit() {
  If (userAuthenticated) {
     Set groups = UserService.findGroups (username);
     for (Iterator itr = groups.iterator (); itr.hasNext (); {
        String groupName = (String) itr.next ();
        UserGroupPrincipal group = new UserGroupPrincipal (GroupName);
        subject.getPrincipals ().add (group);  
     }
     UsernameCredential cred = new UsernameCredential (username);
     subject.getPublicCredentials().add (cred);
  }
}                     

abort ()

abort () メソッドは、認証に失敗したときに呼び出されます。abort () メソッドで LoginModule を終了する前に、ユーザー名とパスワードの入力フィールドなどの状態をリセットするように注意してください。

logout ()

  • LoginContext.logout が呼び出されたら、ユーザーのプリンシパルと資格情報を解放します。

public boolean logout() { if (!subject.isReadOnly()) {

  Set principals = subject.getPrincipals(UserGroupPrincipal.class);
  subject.getPrincipals().removeAll(principals);
  Set creds = subject.getPublicCredentials(UsernameCredential.class);
  subject.getPublicCredentials().removeAll(creds);
  return true;

} else {

          return false;
  }

}


CallbackHandler.java

さまざまなコールバックオブジェクトを持つ複数の LoginModule にサービスを提供できるように、callbackHandler はどの LoginModule からも独立したソース (.java) ファイルに存在します。

  • CallbackHandler クラスのインスタンスを生成し、1 つのメソッド handle () だけを持ちます。
  • ログインするためのユーザー名とパスワードを要求する LoginModule にサービスを提供する CallbackHandler を次に示します。
public void handle(Callback[] callbacks) { 
    for (int i = 0; i < callbacks.length; i++) {
        Callback callback = callbacks[i];
        if (callback instanceof NameCallback) {
            NameCallback nameCallBack = (NameCallback) callback; 
            nameCallBack.setName(username); 
    }  else if (callback instanceof PasswordCallback) {
            PasswordCallback passwordCallBack = (PasswordCallback) callback;
            passwordCallBack.setPassword(password.toCharArray());
        }
    }
}

関連資料

  • 「JAAS in Action」、Michael Coté、2009 年 9 月 27 日の投稿、2012 年 5 月 14 日時点の URL http://jaasbook.com/
  • Pistoia、Marco、Nagaratnam、Nataraj、Koved、Larry、Nadalin、Anthony『Enterprise Java Security』Addison-Wesley、2004 年

開示

添付の JAAS に関するチートシートに記載のコードはすべて、http://jaasbook.com/ のフリーソースからそのままコピーしたものです。

Authors and Primary Editors

Dr. A.L.Gottlieb - AnthonyG [at] owasp.org

Other Cheatsheets

Developer Cheat Sheets (Builder)

Assessment Cheat Sheets (Breaker)

Mobile Cheat Sheets

OpSec Cheat Sheets (Defender)

Draft Cheat Sheets