OpenAMの開発環境を作ってみた


概要

OpenAMのカスタマイズをしたい。

OpenAMのソースを落としてEclipseで改造する為の手順。

 

準備

何はともあれソースを落とす。OpenAMのDeveloperページを見ていくと

svnで公開されている模様。

このページを参照して以下のようにチェックアウト

svn co https://svn.forgerock.org/openam/trunk/openam/

trunk以外のbrunchesやtagsを利用する場合、以下のように(ex 12.0.0を落とすには)

svn co https://svn.forgerock.org/openam/tags/12.0.0/openam/

 

チェックアウトした中にpom.xmlがあったので

mavenを使ってEclipseプロジェクトにする

ここを参考にした。

cd 落としたソースのフォルダ
mvn -DskipTests=true clean install

 普通にやったらOpenAM Coreの部分でOutOfMemoryした。

以前の投稿のようにmavenの設定をXmx512Mに変えてやって実行したらうまくいった

 

ビルド

落としたソースをビルドしてみる。

ビルドは以下のコマンド

cd ダウンロードした位置

mvn -DskipTests=true clean install

ビルド開始からしばらくすると完了するはず。

これでダウンロードした位置/openam-server/target配下に

ビルドしたwarができあがる。

 

ソース改造

ビルドまでできたのでせっかくなのでソースをいじってみる。

OpenAMで認証データをLDAPでなくpostgresで使っていると

パスワードが平文で保存されて丸見えなので直してみる

ざっと手順だけ記載。

 

postgresのuserpasswordはすでにhash化されて格納済みとして、

OpenAMの認証部分をカスタマイズする。

対象のソースは

openam-authentication\openam-auth-jdbc\src\main\java\com\sun\identity\authentication\modules\jdbc

あたり。

初期ではClearTextTransform.javaがおいてある。

これをもとに、HashedTextTransform.javaみたいなものを作り、

中で入力パスワード値をHash化する処理を実装。

package com.sun.identity.authentication.modules.jdbc;

import com.sun.identity.authentication.spi.AuthLoginException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * A very simple test implementation of the JDBC Password Syntax Transform.
 */
public class HashedTextTransform implements JDBCPasswordSyntaxTransform  {

    private final String SALT = "tyAtsPEBauuf0TQNaw0WbLBrCsZGpSeKtBmMkw6N";
    private final int STRETCH_COUNT = 1000;

    /**
     * Creates a new instance of <code>ClearTextTransform</code>.
     */
    public HashedTextTransform() {
    }

    /**
     * This simply returns the clear text format of the password.
     *
     * @param input Password before transform
     * @return Password after transform in this case the same thing.
     * @throws AuthLoginException
     */
    public String transform(String input) throws AuthLoginException {
        if (input == null) {
            throw new AuthLoginException(
                "No input to the Clear Text Transform!");
        }
        return getHash(input);
    }

    /**
    * salt + ストレッチングしたHASH文字列を取得
    * @param password
    * @param userId
    * @return
    * @throws AuthLoginException
    */
    public String getHash(String target) throws AuthLoginException {
        String hash = "";

        for (int i = 0; i < STRETCH_COUNT; i++) {
          hash = getSha512(hash + SALT + target);
        }

        return hash;
    }

    /**
    * 文字列から SHA512(128桁) のハッシュ値を取得
    * @param target
    * @return
    * @throws AuthLoginException
    */
    private String getSha512(String target) throws AuthLoginException {
        MessageDigest md = null;
        StringBuffer buf = new StringBuffer();
        try {
          md = MessageDigest.getInstance("SHA-512");
          md.update(target.getBytes());
          byte[] digest = md.digest();

          for (int i = 0; i < digest.length; i++) {
            buf.append(String.format("%02x", digest[i]));
          }

        } catch (NoSuchAlgorithmException e) {
          throw new AuthLoginException("unknown hash algprothm");
        }

        return buf.toString();
    }
}

 

OpenAMのビルドをmavenから実行するとHashdTextTransform.classができるので

これをOpenAMサーバに置いておく。

 

OpenAMコンソールから

認証 – モジュールインスタンス – 新規

でタイプJDBCを作成する。

 

設定値は

接続タイプ:非持続 JDBC 接続
JDBC ドライバ:org.postgresql.Driver
JDBC URL:jdbc:postgresql://localhost:5432/db名とか
データベースに接続するユーザー:postgresとか
パスワード:xxxxxx
パスワードカラムの文字列:userpassword(テーブルのパスワードカラム←暗号化済)
準備されているステートメント:select userpassword from auth_users where uid = ?
パスワード構文を変換するためのクラス:com.sun.identity.authentication.modules.jdbc.HashedTextTransform

 

アクセス制御 – ibm – 認証 – 認証連鎖

に新しく認証連鎖を作り、インスタンスに先ほど作成したモジュールインスタンスをセット。

組織認証設定を作成した認証連鎖にする。

 

これでログイン時にパスワードを入力すると

暗号化されたパスワードでテーブルと比較して認証してくれるようになる。

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です