1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Keycloak+Apache+mod_auth_openidcでheader sizeのエラーが発生した件

Last updated at Posted at 2020-06-09

発端

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の制限でエラーになることを避ける
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?