リバースプロキシによるRedmineのHTTPS化とCORS対応

Redmine

はじめに

既存のRedmineサーバーをHTTPSとCORSに対応させる方法として、リバースプロキシを使う方法を紹介します。

背景

RedmineとTrelloを連携するRedSyncというPower-Up (TrelloのPlugin) をリリースしました。

RedSyncはRedmineにアクセスするために、RedmineのRest APIにアクセスします。このときRedmine側では、HTTPSとCORS (Cross-Origin Resource Sharing) をサポートしている必要があります。Redmineサーバーの設定を変更すれば対応できますが、設定変更が難しい環境もあります。そのような環境で使えるのが、このリバースプロキシを使う方法です。

この方法は、社外のSaaSでRedmineを利用している場合にも適用できます。(Rest APIが利用可能であることが前提です)

その前に! Redmineサーバーの設定を直接変更できる場合は

直接Redmineサーバーの設定を変更できる場合は、Redmineを稼働させているWebサーバーの設定で、対応することができます。Apacheの場合のHTTPS化とCORSサポートの方法については、下記の記事で紹介しました。

UbuntuのRedmine 5.0をApacheで動かす (HTTPSとCORSに対応)

インストールから説明していますが、既存のサーバーの場合は、下記のセクションを参照してください。

イントラのサーバーでもHTTPS化されているものは多いと思います。その場合はCORS対応のみで済みます。

リバースプロキシとは

(筆者の知識では大雑把にしか説明できないですが)

リバースというからには、リバースではないただのプロキシがある訳で …

クライアントPCから見て、サーバーへのアクセスを代行してくれるのがプロキシです。社内からインターネットへの出口として良く使われます。

これに対して、サーバーの代行としてクライアントPCからのリクエストを受けてくれるのが、リバースプロキシです。代行する立場が逆になるので、リバースとなる訳ですね。

リバースプロキシを置く目的 (メリット) は色々とありますが、ここではHTTPSやCORSに非対応のサーバーの代わりに、これらをサポートすることが目的です。

環境

  • Apache 2.4
  • Ubuntu 20.04 LTS

Apacheのインストール

Apacheをリバースプロキシとして使う場合も、まずはWebサーバーとしてセットアップします。

Apacheをインストールして、HTTPS化およびCORSサポートを設定するところまでは、以前の記事を参考にしてください。

UbuntuのRedmine 5.0をApacheで動かす (HTTPSとCORSに対応)

リバースプロキシの構成

リバースプロキシとして動作させるための構成を定義します。バックエンドで動いているRedmineを呼び出すので、そのための情報を構成ファイルに追加します。

まずSSLサイト向けの構成ファイルを変更します。

sudo vim /etc/apache2/sites-available/default-ssl.conf

<VirtualHost _default_:443>のセクションに、次の内容を追加します。

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
               # 既存の定義

                SSLProxyEngine on
                ProxyPass "/" "<RedmineサーバーURL>"
                ProxyPassReverse "/" "<RedmineサーバーURL>"

                 <Location />
                        <IfModule mod_headers.c>
                                Header always set Access-Control-Allow-Origin "*"
                                Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT, PATCH"
                                Header always set Access-Control-Max-Age "7200"
                                Header always set Access-Control-Allow-Headers "Content-Type, x-redmine-api-key"
                        </IfModule>
                        <IfModule mod_rewrite.c>
                                RewriteEngine on
                                RewriteCond %{REQUEST_METHOD} OPTIONS
                                RewriteRule ^(.*)$ $1 [R=200,L]
				                </IfModule>
                </Location>
        </VirtualHost>
</IfModule>

ProxyPass – 呼び出すRedmineサーバーのURLを指定します。RedmineサーバーがHTTPSをサポートしている場合はHTTPSで指定します。ただしRedmineサーバーのHTTPSに自己署名証明書が使われてる場合は、HTTPで指定してください。HTTPSで指定するとエラーが発生します。

ProxyPassReverse – ProxyPassと同じ内容を指定します。リダイレクトなど幾つかのケースで、レスポンス内のRedmineサーバーのURLを、リバースプロキシのURLに書き換えます。(筆者は今回のケースでこれが必要かどうか確認できていません。実際この定義をしなくても取り敢えず問題ありませんでした。対象が”/”の場合は必要ないとの記述も見かけましたがどうなんでしょうか …)

URLの最後は”/”で閉じるようにしてください。

次に通常サイト向けの構成ファイルを変更します。

sudo vim /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>のセクションに、次の内容を追加します。

<VirtualHost *:80>
        # 既存の定義
        Redirect "/" "<リバースプロキシサーバーの HTTPS URL>"
</VirtualHost>

Redirect – HTTPでのアクセスをHTTPSにリダイレクトします。このためリバースプロキシサーバーのURLはHTTPSを指定してください。またURLの最後は”/”で閉じるようにしてください。

モジュールを組み込んで、Apacheサーバーを再起動します。

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo systemctl restart apache2

動作確認

Webブラウザから、https://<Reverse Proxy Serverのアドレス> を入力します。

Redmineの画面が表示されれば正しく構成されています。

自己署名証明書の注意点

リバースプロキシのサーバーに自己署名証明書を使った場合、Redmineの画面にアクセスすると、ブラウザのセキュリティチェックに引っかかります。Chromeの場合は次のような警告画面が表示されます。この場合は指示に従ってアクセスを許可してください。(自分の立てたサーバーなので素性は分かっているということで …)

実はRedSyncからRedmineと同期を実行したり、カードを表示したりした時に、同じチェックに引っかかっている場合があります。その場合は、見かけ上は通信エラーとして表示されます。Redmineの画面を表示して、セキュリティ警告が出ていないか確認してください。アカウントリンクの画面から、Redmineの個人設定の画面を開くのリンクをクリックしても、Redmineの画面を表示できます。

おわりに

Redmineを単純にインストールしただけではCORS対応とはなりません。一緒に使用するWebサーバーの設定変更が必要になりますが、IT部門などで管理されている場合、簡単には応じてもらえない可能性があります。また外部のSaaSでRedmineを利用している場合も同様です。その場合はリバースプロキシが解決策になります。

ただセキュリティ要件などで、例え社内向けでもサーバーを立てることが難しい場合もあるかと思います。その場合はリバースプロキシのサーバーも立てられない可能性があります。そうなると正直手詰まりです。管理部門などに粘り強く交渉して頂くしかないのかなと思います。

変更履歴

日時内容
2022/06/13初版リリース

コメント

タイトルとURLをコピーしました