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になっているため注意が必要である。
(この機能はまだ実機確認してないため、今度ためしてみよう)

1 件のコメント:

Unknown さんのコメント...

突然で失礼ですが教えて頂きたいです。kawaiと申します。
私もOpenAM13.0.0でstateless sessionを試しcookieを確認しようと思ったのですが、
どうにもうまく行かず…
Use Stateless Sessionsを無効の状態のレルムでは、
ログイン画面(http://openam.example.com/openam/XUI/#login/&realm=REALM)からログインすると
User Profileの画面に遷移し、Cookie(iPlanetDirectoryPro)も取得できるのですが、
有効にすると、ログインボタンを押すとマウスカーソルが一瞬回転し、
特に画面遷移せずそのまま…cookieは取得できず…
(ログインは出来ているがtokenIDは返らず…)
他に設定が必要なのか、確認方法が悪いのか、途方に暮れています。
大変申し訳ありませんが、よろしくお願いします。