Gitlab OmnibusのMattermostでHSTSが有効になった話


GitLabにRCE脆弱性 ニュースをきっかけに、重い腰を上げてGitLab Omnibusを 14.6 → 15.3.1 にアップデートしました。そうしたところ、GitLab Mattermost で HSTS(Strict-Transport-Security) が機能するようになってしまい、同じホスト上動いているHTTPのサービス(HTTPSではなく)にアクセスできなくなってしまう問題が発生しました。

これ、いつから…?(更新サボってるのが悪い)

HSTSとは、サーバから Strict-Transport-Security というヘッダを返却すると、このヘッダを受け取ったブラウザは、そのWebサイトに対してHTTPSを強制するようになる機能です。

今回は、HTTPSで運用しているMattermostにアクセスすると Strict-Transport-Security: max-age=63072000 (有効期限2年)が返却され、これによって同じホスト上でHTTPのみで運用しているGitLabにアクセスすると 307 でHTTPSにリダイレクトしてしまい、アクセスができなくなってしまいました。

結論から言うと、 gitlab.rb (または GITLAB_OMNIBUS_CONFIG) で mattermost_nginx['hsts_max_age'] = 0 を指定することでHSTSを無効化できました。 手持ちの gitlab.rb には該当オプションがなかったけど、脈々と受け継がれてるファイルだからなぁ…最新化が必要かな?

また、通常のブラウザ設定メニューにはHSTSに関するものはないので、アドレスバーに chrome://net-internals/#hstsedge://net-internals/#hsts を直打ちして設定画面を開き、ブラウザに保存されたHSTSの情報を削除する必要があります。以下参考にさせていただきました。ありがとうございます!

HSTS が原因で、ウェブサイトが勝手にhttps接続しないようにする – ラボラジアン

Strict-Transport-Security: max-age=0 をブラウザに返せばブラウザに保存されたHSTSの情報を失効することができますが、GitLab Omnibusでは mattermost_nginx['hsts_max_age'] = 0 を設定するとそもそも Strict-Transport-Security を返さなくなってしまいます。

なお、 Strict-Transport-Security ヘッダーがブラウザーへ送られるたびに、そのウェブサイトに対する有効期限が更新されるので、サイトはこの情報を更新して期限切れを防ぐことができます。 Strict-Transport-Security を無効にする必要がある場合は、 HTTPS 通信時に max-age の値を 0 に設定することで Strict-Transport-Security ヘッダーが失効し、ブラウザーからの HTTP 接続が許されるようになります。

Strict-Transport-Security - HTTP | MDN

上の方法で個別にブラウザからHSTSの情報を削除してもらったのですが、今考えれば mattermost_nginx['hsts_max_age'] = 1 (1秒)を設定してしばらく運用すれば、ブラウザからHSTSの設定を一掃できましたね。それはそれで面倒な話か…

本来は、全部HTTPSにするべきなんですが、まぁその辺はお察しください…