発端
Apacheのリバースプロキシにmod_auth_openidcを入れて、Keycloakで認証を連携を構築している。
一通りの設定を終えて、アクセス確認をしていると、
Bad Request
Size of a request header field exceeds server limit
が出て、アクセスできないことが多々起きた。
対処その1:Apacheのヘッダーサイズ
そのまま、Size of a request header field exceeds server limit
をググると、
LimitRequestFieldSize
を設定する情報にたどり着いたので、設定する。
デフォルトは8190なので、とりあえず4倍の32760に設定。
※値を大きくするリスクは社内限定利用なので、無視。
でも、これでも改善しない。
Chromeのデベロッパーツールで見ている限り、上限は上がっているけど、簡単に引っかかってしまう。
際限なく上げるのもよくないし、
どうしようかと、ググると、どうやらmod_auth_openidcの方に原因があることがわかった。
原因:mod_auth_openidcのstateのcookie
mod_auth_openidcは、セッションのstate情報をcookieにしており、
大量にタブを開いてアクセスすると、その分のstateのcookieができ、それにより、headerが肥大化する。
https://github.com/zmartzone/mod_auth_openidc/wiki/Cookies
いろいろと詳細に書いてあるが、対処としては、次の2点を試した。
※最終的には、先の対処その1と対処その2を採用し、対処その3はむしろ無効化するが。
対処その2:バージョン
alternatively use a version of mod_auth_openidc >= 2.0.0 so it supports chunked cookies
バージョンを上げると効果がありそうな記述を見つける。
利用していたのが、epelのリポジトリからyumでinstallした、
Version 1.8.8だったので、対処その3の実施の準備も含めて、Versionを2.3.11にした。
※最新は、2.4.2.1だったが、自分の環境起因で、2.3.11にした(次回の記事へ)
※インストールにはcjoseが依存性の関係で必要。
最新のmod_auth_openidcもcjoseも、rpmがGithubのリリースにアップされているのでそこからダウンロードしました。
https://github.com/zmartzone/mod_auth_openidc/releases
バージョンアップし、chromeのデベロッパーツールで見ていたところ、
一つのstate cookieのサイズが10分の1程度になりました。
対処その3:古いstate cookieの削除
古いstate cookieを削除する機能が、
2.3.8、2.3.10.1で実装されている。
Since version 2.3.8 mod_auth_openidc limits the number of state cookies - i.e. the number of outstanding authentication request - to 7 by default, controlled by the OIDCStateMaxNumberOfCookies setting.
Since version 2.3.10.1 mod_auth_openidc can also be configured to delete the oldest state cookie when overrunning the OIDCStateMaxNumberOfCookies limit by adding true after the size value e.g. OIDCStateMaxNumberOfCookies 5 true
OIDCStateMaxNumberOfCookies 7 false #デフォルト。stateのcookie 7つを上限にし、削除しない。上限に達すると、エラーを出す
OIDCStateMaxNumberOfCookies 5 true #stateのcookie 5つを上限にし、削除する。
OIDCStateMaxNumberOfCookies 0 #stateのcookieを制限しない。
最初はOIDCStateMaxNumberOfCookies 10 true
を試したが、
アクセス先のサイトに、keycloakのトークンリフレッシュのタイミングで、複数のstate cookieを同時に発生させるものがあり、そのタイミングでエラーになってしまう。
対処のまとめ
最終的には以下で対処を終えた。
- mod_auth_openidcのバージョンアップによるcookieサイズの抑制
- 下記の設定
LimitRequestFieldSize 32760
OIDCStateMaxNumberOfCookies 0 #デフォルトの7の制限でエラーになることを避ける