ククログ

株式会社クリアコード > ククログ > IISでリバースプロキシ(転送するヘッダの設定)

IISでリバースプロキシ(転送するヘッダの設定)

IISでリバースプロキシの設定をしている阿部です。

先日、IISでリバースプロキシの設定をする方法を説明しました。

今回は少し進んだ設定方法としてヘッダ情報を転送する設定(nginxのproxy_set_header相当の設定)について説明します。 IISでリバースプロキシ設定で、バックエンドにヘッダ情報を転送したい方の参考になると思います。

前提

Grafanaを題材に設定例を説明します。

Grafanaでリバースプロキシの設定をするときはHostをバックエンドに転送する必要があります。 (CSRF対策のチェックの一環として必要です。)

参考: https://github.com/grafana/grafana/issues/45117#issuecomment-1033842787

この設定をしないとWeb画面でエラー表示が出ます。

スクリーンショット:origin not allowed alert

ということで、このGrafanaでのヘッダ転送を例にIISでヘッダ情報を転送する方法を説明します。

準備: IIS

準備: Grafana

Grafanaのインストールや設定についての詳細は割愛します。関連する部分のみ説明します。

例として使うGrafanaはv11.2.0です。

Winodwsにインストール

参考: https://grafana.com/docs/grafana/latest/setup-grafana/installation/windows/

書いてある通りにZIPファイルをダウンロードして展開すれば完了です。

リバースプロキシに関連する設定: ドメイン・URL

ZIPファイルを展開するとconf/sample.iniがあるはずなので、conf/custom.iniというファイル名でコピーし、それを編集します。 変更点は次のの2つです。

@@ -41,7 +41,7 @@
 ;http_port = 3000

 # The public facing domain name used to access grafana from a browser
-;domain = localhost
+domain = "iis.example.clear-code.com"

 # Redirect to correct domain if host header does not match domain
 # Prevents DNS rebinding attacks
@@ -49,7 +49,7 @@

 # The full public facing url you use in browser, used for redirects and emails
 # If you use reverse proxy and sub path specify full url (with sub path)
-;root_url = %(protocol)s://%(domain)s:%(http_port)s/
+root_url = %(protocol)s://%(domain)s/grafana

 # Serve Grafana from subpath specified in `root_url` setting. By default it is set to `false` for compatibility reasons.
 ;serve_from_sub_path = false
  • domain
    • 例で iis.example.clear-code.com を設定しています
    • 環境に合わせて適宜設定してください
  • root_url
    • /grafana というパスで運用する設定です

リバースプロキシに関連する設定: CSRF

詳細は後述しますが、大事な設定です!

@@ -403,7 +403,7 @@
 ;csrf_trusted_origins = example.com

 # List of allowed headers to be set by the user, separated by spaces. Suggested to use for if authentication lives behind reverse proxies.
-;csrf_additional_headers =
+csrf_additional_headers = X-Forwarded-Host

 # The CSRF check will be executed even if the request has no login cookie.
 ;csrf_always_check = false

csrf_additional_headers で指定したヘッダでチェックするようになります。この例ではX-Forwarded-Hostです。

IISの「URL 書き換え」でヘッダ情報の転送設定

リバースプロキシの基本設定

リバースプロキシの設定の基本的な設定は済んでいるものとして、追加で必要な設定について記載します。

このあと登場する設定例では次の設定をした例です。

  • grafana というアプリケーションを追加
  • URLの書き換え(L): http://localhost:3000

「許可されたサーバー変数」設定

散々「ヘッダ情報の転送」と書いてきましたが、IISの「URL 書き換え」では「サーバー変数」を設定するかたちで実現します。 ですので、ヘッダの設定ではなくサーバー変数を設定します。

設定するにあたり、まずは設定を許可するサーバー変数を登録する必要があります。

まずはgrafanaアプリーケーションにある「URL 書き換え」の設定画面を開きます。右側にある「操作」の「サーバー変数の表示」をクリックします。

スクリーンショット:サーバー変数の表示

「許可されたサーバー変数」の一覧が表示されます。右側にある「操作」の「追加」からHTTP_X_FORWARDED_HOST を追加します。

スクリーンショット:許可されたサーバー変数

  • キャプチャはHTTP_X_FORWARDED_HOSTを追加した後のものです
  • 「サーバー変数の追加」画面で「サーバー変数名」を入力すると候補が表示されます。そこにHTTP_X_FORWARDED_HOSTは表示されませんが追加して問題ありません
  • 上述の通りヘッダではなくサーバー変数を設定するので、X-Forwarded-HostではなくHTTP_X_FORWARDED_HOSTを設定します
    • Grafanaの設定で設定した csrf_additional_headers と対応している設定です

「サーバー変数」設定

「許可されたサーバー変数」設定が済んだら「URL 書き換え」の設定画面から、基本的なリバースプロキシの設定をした「受信規則の編集」画面を開きます。

その画面で「サーバー変数」の設定をします。「サーバー変数」のメニューが閉じていたら開いて、「追加」から追加します。

「追加」をクリックすると「サーバー変数の設定」画面が開くので設定します。

スクリーンショット:サーバー変数設定: 追加

  • サーバー変数名
    • HTTP_X_FORWARDED_HOST
    • 「許可されたサーバー変数」先ほど追加した変数名
    • {HTTP_HOST}
    • ユーザが送信したHost

追加すると次の画面になるので、右側の「操作」メニューの「適用」をクリックして変更内容を反映します。

スクリーンショット:サーバー変数設定

以上で「サーバー変数」(ヘッダ情報)を転送する設定は完了です。

補足: HTTP_HOST を転送すれば良いのでは?

上述した参考リンクの通り、HTTP_HOSTが転送できればnginxやApacheと同様の設定で単純だったのですが、IISの「URL 書き換え」の「サーバー変数」設定では HTTP_HOST の上書きはできないようでした。

ということで、Grafana側でX-Forwarded-Hostを利用する設定(csrf_additional_headersの設定)とIISの「サーバー変数」設定で HTTP_X_FORWARDED_HOST の設定をして、CSRF対策のチェックが成功するようにしました。

まとめ

IISでGrafanaのリバースプロキシの設定をすることを例にIISで「サーバー変数」(ヘッダ情報)を転送する設定を紹介しました。 HTTP_HOSTの他にも上書きできないサーバ変数があるようでしたので、設定の際は動作確認をしながら設定してください。