田村 広平 (TAMURA Kohei)
- ソフトウェアエンジニア (OpenAMコミッタ)
- Web デベロッパー / Web デザイナー
- テクニカルライター
- 日経Linux 連載「応用講座 統合認証からシングルサインオンまで」
- CodeZine 連載「OpenAMで始めるシングルサインオン」
- @IT 連載「OSSによるアイデンティティ管理」
- @IT 「認証の最新動向と、OpenAMの適用事例を探る」
- @IT 連載「Keycloak超入門」
- Qiita
卒業論文のテーマであった「空間自己相関法」の理解のため、FFT(高速フーリエ変換)で建物の振動特性をシミュレートするプログラムを書いたこと(初めてのプログラミング)がきっかけで、未知のIT業界に入る。ITベンチャーで2年間働いた後、フリーランスに。ここ数年はOpenAMを中心としたOSSに関するサポート・研究開発をしている。JavaのOSSのトラブルシューティングが主戦場。OpenAMには、バグ修正、エンハンス、日本語化など200件以上コミットしている。最近は、OpenAM最新版の商用化に伴い、keycloakのサポートがメインタスクになりつつある。
OpenAMなどのOSSに関するお問い合わせは、以下にお願いします。
OpenAMについて勉強中です。
ワンタイムパスワード(OTP)認証について教えてください。
OpenAMで通常のパスワード認証以外にOTPと認証連鎖させてセキュリティを高めることを想定しています。
OpenAMのOTPの使われ方が良く理解できていない上での質問なのですが、Web情報を見る限り、OTP認証を要求する場合
(1)OpenAM側の指定のOTPを生成して利用者のメアドに送付する。利用者はそれを入力してログイン。
(2)OpenAM側で指定のOTPを生成するのではなく、Google Authenticatorなどのアプリを使ってコードを生成し、それを使ってログイン
という2通りがあるのかと思います。
この理解が正しいとして(間違っていたらご指摘ください)
上の(1)と(2)って、セキュリティ上、そのレベルがちっとも違わない気がするのですが、(2)を選択すると何が良いのでしょうか?
全部(1)でダメなんでしょうか?
いいねいいね
セキュリティの観点で言うと、以下のページの解説されている、メールで送信されたワンタイムパスワードを盗むような場合に(2)の方がいいのではないかと思います。
※セキュリティが専門ではないので、詳しくは分かりませんが…
http://www.ipa.go.jp/security/txt/2014/01outline.html
メールを本人以外の人が絶対に参照できないのであれば、(1)も十分にセキュアな認証方式だと思います。
また、(1)の方が仕組みも簡単で、導入コストも断然低いです。
ちなみに、OpenAMでは、(1) はHOTP認証、(2) はOATH認証という認証モジュールで実現しています。
(1) HOTP認証
OpenSSOの頃から存在するワンタイムパスワード認証。
ユーザーのメールアドレスに、OpenAMが生成したワンタイムパスワードを送信し、ログイン時にそれを入力します。
(2) OATH認証
OpenAM 10.1から提供されたワンタイムパスワード認証。
RFC標準のOATH(Initiative for Open AuTHentication)に準拠したワンタイムパスワード認証ができます。
YubiKeyやGoogle Authenticatorなどのクライアントのツールで生成したコードをログイン時に入力します。
USBポートに接続したYubiKeyのセンサーにタッチするだけでログインすることも可能です。
ユーザーが決めたシークレットキーを、サーバーとクライアントのツールの両方で共有しておく必要があるので、手間がかかります
(これを実現する仕組みも検討・実装しないといけない)。
メール送信のプロセスが無い分、(1)よりさらにセキュアです。
メールを受信できない環境でも使えますが、クライアント側にツールを導入する必要があります。
参考ページ:
OpenAM 10.1.0 新機能紹介
http://www.openam.jp/wp-content/uploads/openam20130412_osstech2.pdf
OATHによるワンタイムパスワードの仕様 – 1
http://yamatamemo.blogspot.jp/2011/05/oath-1.html
One-Time Passwords – HOTP and TOTP
http://blogs.forgerock.org/petermajor/2014/02/one-time-passwords-hotp-and-totp/
いいねいいね
現在、OpenAMの導入を検討しているものです。
webでの検索やOpenAMの公式ドキュメントを読みましたが、
わからないことがあったので、ご質問させてください。
質問内容:
「OpenAMを導入する場合、既存のデータベースのテーブルをOpenAMにインポートせずに、
直接OpenAMのデータストアとして利用することは可能ですか」
具体的にいいますと、
現在運用しているサービスのユーザー認証用DB(mysql)をOpenAMにインポートせずに、
OpenAMからDBを参照させて利用できるかをお聞きしたいです。
もしご回答が面倒してたら、そのまま無視or削除していただいも構いません。
以上、どうぞよろしくお願いいたします。
いいねいいね
はい。可能です。
MySQLなどのRDBMSのテーブルで管理されたユーザーが存在する場合、以下を使って連携ができます。
・JDBC認証モジュール
・データベースリポジトリ
前者は、テーブルに登録されたユーザーのIDとパスワードで認証する認証モジュールです。管理コンソールにログインし、
アクセス制御 > / (最上位のレルム) > 認証
で、モジュールインスタンスのセクションの新規ボタンをクリック。JDBCを選択して、設定します。
後者は、テーブルに登録されたユーザーデータをOpenAMから参照、登録、更新、削除できるデータストアモジュールです。管理コンソールにログインし、
アクセス制御 > / (最上位のレルム) > データストア
で、新規ボタンをクリック。データベースリポジトリ (アーリーアクセス)を選択して、設定します。
※データベースリポジトリは、開発後から「アーリーアクセス」という位置付けのままになっており、グループ機能などのオプション機能が正常に動作しません。
いいねいいね
tamura246さん
ご回答いただきましてありがとうございます。
大変助かりました!
いいねいいね
OpenIGの勉強をしているのですが、行き詰まってしまったので、質問させてください。
(状況)
Responseの中に、ログインフォームを示す文字列が存在したら、代理認証(ログインフォームを
submitする。)を行うつもりですが、submitを行わない。
予想では、原因は不明ですが、Responseの中に、ログインフォームを示す文字列を見つけることが
できないようです。
予想の根拠ですが、SwitchFilterのConditionを${exchange.isLoginPage.found == ‘true’}を
${exchange.isLoginPage.found == ‘true’ || 1 ==1}にしてやると、LoginChain Handlerに
流れていくので。
・.openig/config/routes/01-hogohogo.json (抜粋)
{
“name”: “hogohogoChain”,
“type”: “Chain”,
“config”: {
“filters”: [
{
“type”: “EntityExtractFilter”,
“config”: {
“messageType”: “RESPONSE”,
“target”: “${exchange.isLoginPage}”,
“bindings”: [
{
“key”: “found”,
“pattern”: “action=\”/webhogohogo/admin/authentication”,
“template”: “true”
},
{
“key”: “CSRFToken”,
“pattern”: “_csrf\”\\svalue=\”(.*)\””,
“template”: “$1”
}
]
}
},
{
“type”: “SwitchFilter”,
“config”: {
“onResponse”: [
{
“condition”: “${exchange.isLoginPage.found == ‘true’}”,
“handler”: “LoginChain”
}
]
}
}
],
“handler”: “OutgoingChain”
}
},
・対象のログインフォーム(抜粋)
ログイン画面
ログイン画面
・環境
OS..centOS 6.7
ApServer…Tomcat7.0.64
OpenIG…3.1.0
余裕のあります時に回答していただけたら助かります。
勝手なお願いで申し訳ありませんが、よろしくお願いいたします。
いいねいいね
すいません。今時間に余裕が無いので、後で調べてみます。
いいねいいね
わざわざ返事いただきありがとうございます。
忙しいのにすみません。
いいねいいね
次の部分の「”」の対応関係が正しくないように思います。
“pattern”: “action=\”/webhogohogo/admin/authentication”,
ぱっと見で判断したので、それが原因ではないかもしれませんが。
いいねいいね
返信ありがとうございます。
ご指摘通り
“pattern”: “action=\”/webhogohogo/admin/authentication”,
↓
“pattern”: “action=\”/webhogohogo/admin/authentication\””,
を変えてみたのですが、結果変わらずでした。
“pattern”: “form”,や“pattern”: “.*”,
に変えてもみたのですが、結果変わらずでした。
“pattern”: “_csrf\”\\svalue=\”(.*)\””,
の方も機能していないので、予想ではありますが、contentを読み込めていないような感じです。
OpenIG3.1.0のソースを落としてきて、3.1.0リリース後に出たパッチをあててwarを作り様子をみようかと思っています。
(はっきり確認していませんが、パッチはあてられるとどこかで読んだので。)
最後はデバックですかね。
※このjsonですが、2.1.0ではうまくいっております。(バージョンの差異を直した上ですが。)ただ、2.1.0はmatcesがあまりよろしくないのと、できる限り最新のものを使用したいというのがあります。
ありがとうございました、何か気づくことがありましたら、またご指摘いただければ助かります。
いいねいいね
上のJSONをコピペするとダブルクォーテーションが全角になっているみたいですが、実際のファイルは半角になってますよね?(※念のため確認です。)
追記:
全角のシングルクォーテーションも含まれているようです。それ以外の構文は合ってそうでした。
以下のブログにOpenIGのトラブルシューティングについて書いてあります。CaptureFilterなどを使うと解析しやすいかもしれません。
http://sauthieg.github.io/openig/2014/10/12/welcome-to-openig-part-4.html
それでも解決しなければ、Eclipseなどでリモートデバッグしてみて下さい。
EntityExtractFilter.process()の128行目あたりにブレークポイントを張って、message.getEntity().toString()の値にaction=”/webhogohogo/admin/authentication”が含まれているかチェックしてみて下さい。
いいねいいね
いろいろフォローありがとうございます。
結論から申し上げますと上手くいきました。
原因ですが、switchFilterとEntityExtractFilterの設定順に誤りがあったようです。
EntityExtractFilter,switchFilter⇒switchFilter,EntityExtractFilter
の順番に変更したら想定通りの動きになりました。(おそらくはResponseの場合のみ?)
完全に理解しているわけではないのですが、EntityExtractFilter,switchFilterの
ソースを見ているとそう感じました。
追記ですが、全角との指摘ですが、コピペではなく、コメントにそのまま入力したので、
入力ミスがあったためです。
ありがとうございました。
いいねいいね
OpenAMについてご依頼をしたいのですが、メールにてご連絡頂くことって可能でしょうか。
よろしくお願い致します。
いいねいいね
はい。可能です。
いいねいいね
自己紹介にあるメールアドレスに内容を送付しました。
よろしくお願い致します。
いいねいいね