概要
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 – 認証 – 認証連鎖
に新しく認証連鎖を作り、インスタンスに先ほど作成したモジュールインスタンスをセット。
組織認証設定を作成した認証連鎖にする。
これでログイン時にパスワードを入力すると
暗号化されたパスワードでテーブルと比較して認証してくれるようになる。