2016年3月26日土曜日

OpenAM13.0.0でStateless Sessionを使ってみた。

OpenAM13.0.0の新機能の1つであるStateless Session(ステートレスセッション)を使ってみた。

V12までは、認証クッキーにセッション情報と紐づくセッションIDを格納していた
(OpenAM本体(正確にはOpenDJ)でセッション情報を管理)
そのため、冗長構成の場合、各OpenAMサーバ間でセッション情報を共有するために、OpenDJのレプリケーション機能が使われていた。この方法だと、大規模になるにつれて、セッションの共有処理が性能のボトルネットになりうる。
ステーレスセッション機能を使えば、セッション情報そのものがクライアント端末とOpenAM間でやりとりされるため、セッション情報の共有処理自体が必要なくなるというわけだ。
セキュリティも考慮し、セッション情報の署名及び暗号化機能を提供している。
(署名検証と復号化はオーバーヘッドになるかもしれない。。。)

ポイントは以下である。
  • ステートレスセッションが利用できるのは一般ユーザのみ。
    トップレベルの管理ユーザ(amAdmin)は、ステートフルセッションしか使えない。ステートレスセッションだと、暗号化されているとはいえ、クライアントにセッション情報そのものが通知されてしまうため、セキュリティを考慮してのことか。
  • セッション管理がつかえない。
    ステートレスセッションを有効にすると、従来のセッション管理が使えなくなる。換言すれば、セッション情報のモニタリングや認証ユーザの即時無効化ができなくなる。
  • ステートレスセッションを使える機能には制限がある
    残念ながら、13.0.0では、ステートレスセッションが利用できる機能が限られているらしい。OpenAMのマニュアルをみると、以下の機能が制限になっている。現状、SAMLで使えないのは残念。
    • Session upgrade
    • Session quotas
    • Authorization policies with conditions that reference current session properties
    • Cross-domain single sign-on
    • SAML v2.0 single sign-on and single logout
    • SAML 1.x single sign-on
    • SNMP session monitoring

実際に、ステートレスセッションのCookieをキャプチャーしてみた。
比較するために、スレートフルセッションのCookieも採取した。

■ステートフルセッションのCookie
AQIC5wM2LY4SfczzPRZPPHAkzI7A_Tnam7j70ysaIRw-588.*AAJTSQACMDEAAlNLABM3NTUwODMzNjAyNTk0NDk3MjA5AAJTMQAA*

■ステートレスセッションのCookie
AQIC5wM2LY4SfcwNh6HptjlRcECnoKwmcDYSjjqSBxv9JH8.*AAJTSQACMDEAAlNLABQtNDMzMDA4MzM4NDU3OTI0OTU2OAACUzEAAA..*eyAidHlwIjogIkpXVCIsICJhbGciOiAiSFMyNTYiIH0.eyAic2VyaWFsaXplZF9zZXNzaW9uIjogIntcInNlY3JldFwiOlwiZDgyMGE5YjctMWIyYS00OGRiLThiNWUtYTJjNTMyOGUyYzNhXCIsXCJleHBpcnlUaW1lXCI6MTQ1OTAwMzg5NDM1MixcImxhc3RBY3Rpdml0eVRpbWVcIjoxNDU4OTk2Njk0MzUyLFwic3RhdGVcIjpcInZhbGlkXCIsXCJwcm9wZXJ0aWVzXCI6e1wiQ2hhclNldFwiOlwiVVRGLThcIixcIlVzZXJJZFwiOlwidGVzdFwiLFwiRnVsbExvZ2luVVJMXCI6XCIvT3BlbkFNLTEzLjAuMC9VSS9Mb2dpbj9yZWFsbT0lMkYmZ290bz1odHRwJTNBJTJGJTJGb3BlbmFtLmxvY2FsLmNvbSUzQTgwODAlMkZPcGVuQU0tMTMuMC4wJTJGYmFzZSUyRkFNQWRtaW5GcmFtZVwiLFwic3VjY2Vzc1VSTFwiOlwiL09wZW5BTS0xMy4wLjAvY29uc29sZVwiLFwiY29va2llU3VwcG9ydFwiOlwidHJ1ZVwiLFwiQXV0aExldmVsXCI6XCIwXCIsXCJTZXNzaW9uSGFuZGxlXCI6XCJzaGFuZGxlOkFRSUM1d00yTFk0U2ZjeFJmQkNoVF9BNU1HQlZjSkJjSHBZbWNpUDdKM3V3RURRLipBQUpUU1FBQ01ERUFBbE14QUFBQUFsTkxBQlF0TWpnek5qQXdNVEUxTVRZME5UWTVNVFk0TncuLipcIixcIlVzZXJUb2tlblwiOlwidGVzdFwiLFwibG9naW5VUkxcIjpcIi9PcGVuQU0tMTMuMC4wL1VJL0xvZ2luXCIsXCJQcmluY2lwYWxzXCI6XCJ0ZXN0XCIsXCJTZXJ2aWNlXCI6XCJ0b3RwXCIsXCJzdW4uYW0uVW5pdmVyc2FsSWRlbnRpZmllclwiOlwiaWQ9dGVzdCxvdT11c2VyLGRjPW9wZW5hbSxkYz1mb3JnZXJvY2ssZGM9b3JnXCIsXCJhbWxiY29va2llXCI6XCIwMVwiLFwiT3JnYW5pemF0aW9uXCI6XCJkYz1vcGVuYW0sZGM9Zm9yZ2Vyb2NrLGRjPW9yZ1wiLFwiTG9jYWxlXCI6XCJqYVwiLFwiSG9zdE5hbWVcIjpcIjEyNy4wLjAuMVwiLFwiQXV0aFR5cGVcIjpcIlRPVFB8RGF0YVN0b3JlXCIsXCJIb3N0XCI6XCIxMjcuMC4wLjFcIixcIlVzZXJQcm9maWxlXCI6XCJSZXF1aXJlZFwiLFwiQU1DdHhJZFwiOlwiNjczMmMzZTgwYzU4Y2YzNTAxXCIsXCJjbGllbnRUeXBlXCI6XCJnZW5lcmljSFRNTFwiLFwiYXV0aEluc3RhbnRcIjpcIjIwMTYtMDMtMjZUMTI6NTE6MzRaXCIsXCJQcmluY2lwYWxcIjpcImlkPXRlc3Qsb3U9dXNlcixkYz1vcGVuYW0sZGM9Zm9yZ2Vyb2NrLGRjPW9yZ1wifSxcIm1heFRpbWVcIjoxMjAsXCJzZXNzaW9uSURcIjpudWxsLFwiY2xpZW50SURcIjpcImlkPXRlc3Qsb3U9dXNlcixkYz1vcGVuYW0sZGM9Zm9yZ2Vyb2NrLGRjPW9yZ1wiLFwiY2xpZW50RG9tYWluXCI6XCJkYz1vcGVuYW0sZGM9Zm9yZ2Vyb2NrLGRjPW9yZ1wiLFwic2Vzc2lvblR5cGVcIjpcInVzZXJcIixcIm5ldmVyRXhwaXJpbmdcIjpmYWxzZSxcIm1heENhY2hpbmdcIjozLFwibWF4SWRsZVwiOjMwfSIgfQ.XKISz77Cx0Q41672Sq6LOGBAUR8SK7GzFa7-w4HjPQw

セッション情報は、デフォルト設定では、署名はされているが、暗号化はされていないため、注意が必要である。
サポートしている署名アルゴリズムと暗号化アルゴリズムは以下である。

■署名アルゴリズム
HS256 - HMAC using SHA-256 hash algorithm.
HS384 - HMAC using SHA-384 hash algorithm.
HS512 - HMAC using SHA-512 hash algorithm.
RS256 - RSA using SHA-256 hash algorithm.


■暗号化アルゴリズム
AES-128 in CBC mode with HMAC-SHA-256 for message authentication, using a random Content Encryption Key (CEK). The CEK is encrypted using the configured RSA public key.

ログアウトについて

ステートレスセッションを有効にした場合、1つのOpenAMでログアウトしても、セッションの有効期限内であれば、他のOpenAMにアクセスできてしまう。この問題に対して、セッションブラックリストという機能を提供している。ログアウトしたユーザに確実に再認証させるために、ログアウトしたセッション情報(=ブラックリスト情報)は各OpenAMサーバ間で共有できる機能である。
デフォルト値はOFFになっているため注意が必要である。
(この機能はまだ実機確認してないため、今度ためしてみよう)

OpenAM13.0.0で二段階認証(ID/パスワード+TOTP認証)を使ってみる

ID/パスワード認証+ワンタイムパスワード認証という二段階認証を試してみる。
ワンタイムパスワード認証(以降、OATH認証と略す)を使う際、事前に、クライアントとサーバ間で同じ秘密鍵を共有する必要がある。
OpenAM13.0.0では、この初期登録時の負荷を下げる以下のような新機能を提供している。
  1. 最初に、利用者はOpenAMにID/パスワードでログインする。
  2. OTP生成アプリ(Google Authenticator等)を使い、OpenAMが表示するQRコードをスキャンし、クライアントのデバイスを登録する。
    (このタイミングで、クライアント側に秘密鍵が自動的に登録される)
  3. OTP生成アプリが発行したOTPを使って、OpenAMにログインする。
今回の動作確認では、ワンタイムパスワード(以降、OTPと略す)の発行には、Google Authenticatorを利用する。
また、OpenAMでは、以下の2つのOATH認証方式をサポートしているが、今回は「TOTP」を使ってみる。
  • 時間ベースのOTP(TOTP:Time-based One Time Password RFC 6238)
  • カウンターベースのOTP(HOTP:HMAC-based One-Time Password RFC 4226
OpenAMの設定(事前準備)

  1. OpenAMの管理コンソールに管理ユーザでログインする。
  2. 「/(レルム)」→「Authentication」→「Modules」の順に押す。
    「Add Module」を押し、認証モジュールの名前(任意)と認証タイプ(ForgeRock Authenticator)を選択する。「Create」ボタンを押す。
  3. OATH認証の設定画面で、TOTP認証に必要となる項目を設定する。
    設定後、「Save Change」ボタンを押す。
  4. 「/(レルム)」→「Authentication」→「Chains」の順に押す。
    「Add Chain」を押し、新規に認証連鎖を作成する。このとき、認証連鎖の名前(任意)を入力する。「Create」ボタンを押す。
  5. 作成した認証連鎖画面において、データストア認証→TOTP認証の順番になるように設定する。また、条件として「REQURED(必須)」を選択する。「Save Changes」ボタンを押す。
  6. 「/(レルム)」→「Authentication」→「Settings」の順に押す。
    「組織認証設定」項目において、先ほど作成した認証連携名「totp」を選択する。
    「Save Changes」ボタンを押す。
以上で、OpenAM側の環境設定は完了である。


動作確認

  1. 事前に登録していたユーザでOpenAMにログインする (ID/パスワード認証)。
  2. OTP認証画面に遷移する。
    まだデバイスが未登録なので、「DEVICE REGISTER」ボタンを押す。
  3. QRコードが画面表示されるため、Google Authenticatorで読み取る。
  4. Google Authenticatorで生成したOTPを、OpenAMの認証画面に入力する。


  5. TOTP認証が成功し、ユーザのプロフィール画面に遷移することを確認する。

(補足)

  • 上手く動作しない(デバックする)際には、OpenAMのデバックログを確認する。
    ログファイル名は、「amAuthAuthenticatorOATH」である。
  • 管理ユーザでログインする際には、以下のように認証モジュールを明に指定して、TOTP認証を回避する。

    http://openam.local.com:8080/OpenAM-13.0.0/XUI/#login/?module=DataStore

    「/(レルム)」→「Authentication」→「Settings」で「管理者認証設定」項目に
    「totp」を指定してしまうと、管理者もTOTP認証が必須となってしまうため、注意が必要。
  • ユーザエントリには、"oathDiviceProfiles"という属性に秘密鍵などの情報がJSON形式で格納される。





2016年3月25日金曜日

Windows10でhostsファイルを編集もしくは上書きできない。。。。

先週、Windows7からWindow10にアップグレードした。
独自のFQDNを定義しようとしてhostsファイルを編集しようとしたら、他のプロセスがつかっていると警告がでて編集ができない問題が発生した。。。

ネットでいろいろ調べてみると、
可能性としては以下が考えられるとのこと。

  • 管理者権限で実行していない。
  • Windows Defenderにプロセスをにぎられている。
  • セキュリティ製品(マカフィーやWebrootなど)に編集をブロックされている。


調べてみたら、使っているセキュリティ製品(Webroot)の禁止項目になっていた。
下図のように、禁止項目からチェックを外したら、hostsファイルを無事編集することができた!



2016年3月14日月曜日

OpenAM13.0.0のインストール

2016年2月にリリースされたOpenAM13.0.0のインストール手順を説明する。
なお、Tomcat7.0.68(Windows版)上に配備する。

  1. 以下のForgeRock社サイトからOpenAM媒体をダウンロードする。
    (あらかじめIDとパスワードの登録が必要)

    https://backstage.forgerock.com/#!/downloads/OpenAM/OpenAM%20Enterprise/13.0.0/OpenAM%2013/zip#list

  2. ダウンロードしたOpenAM-13.0.0.zipを解凍する。
    「OpenAM-13.0.0.war」がOpenAMのwarファイルである。

  3. Tomcatに配備する前に、Tomcatの管理画面からアップロードできるファイルサイズを増やす。
    増やさないと、SizeLimitExceededExceptionエラーが発生する
    web.xml(..\Tomcat 7.0\webapps\manager\WEB-INF配下)の以下の要素に、OpenAMのwarファイルのサイズを設定する。
    <multipart-config>  
     <!-- 50MB max -->
      <max-file-size>113916465</max-file-size>
      <max-request-size>113916465</max-request-size>
      <file-size-threshold>0</file-size-threshold>
    </multipart-config>

  4. Tomcatの管理画面から、OpenAMのwarを指定して配備する。



  5. OpenAMのURLにアクセスし、以下のセットアップ画面が表示されることを確認する。
    「新しい設定の作成」ボタンを押す。



  6. ライセンス許諾画面が表示されるため、同意して「Continue」ボタンを押す。
  7. OpenAMの管理ユーザ(amAdmin)のパスワードを入力し、「次へ」ボタンを押す。
  8. サーバー設定画面でサーバーURLなどを入力し、「次へ」ボタンを押す。
  9. 設定データストア画面でOpenAMの環境情報を格納するデータストアの設定を行う。「次へ」ボタンを押す。
  10. ユーザーデータストア画面でユーザ情報を格納するデータストアの設定を行う。本手順では、OpenDJを選択する。「次へ」ボタンを押す。
  11. サイト設定画面でロードバランサの設定を行う。本手順では、負荷分散構成にはしないため、「いいえ」を選択する。「次へ」ボタンを押す。
  12. デフォルトのポリシーエージェントユーザーのパスワードを入力し、「次へ」ボタンを押す。
  13. 設定ツールの概要と詳細画面で設定項目を確認する。内容に問題がなければ、「設定の作成」ボタンを押す。
  14. 下記のように、OpenAMのインストールが開始される。
  15. 以下のように、「設定が完了しました」メッセージが表示されることを確認する。「ログインに進む」ボタンを押す。
  16. IDとパスワードを入力し、ログインできることを確認する。
  17. 下記のように、OpenAMのセットアップ画面が表示されたら、セットアップは完了である。