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も採取した。
■ステートフルセッションの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になっているため注意が必要である。
(この機能はまだ実機確認してないため、今度ためしてみよう)