IIS をリバースプロキシに設定 － セキュアな Yellowfin 環境を構築

### はじめに
Yellowfin に SSL 接続する場合、SSL 証明書を配置したリバースプロキシを経由してアクセスする形式を取ることが一般的です。[Yellowfin Tomcat のキーストアに証明書を配置する](https://qiita.com/ExtremeCarvFJ/items/398c66a02c11daa5f85d)よりも、証明書の扱いがしやすいことが主な理由です。

Linux 環境で Apache をリバースプロキシの役割として設置する方法は、 [『EC2にYellowfinのベストなテスト環境を構築するまでのメモ』](https://qiita.com/hadatuna/items/d0782d78498f535b08ca)で紹介しています。

本記事では、Windows 環境で、IIS をリバースプロキシとする構成を実装する手順を紹介します。

# 概要
下記構成で、Yellowfin 環境を構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/5eeb2c63-d38e-3249-16de-7c605662929d.png)

簡単に構成要素を説明します。
・IIS をリバースプロキシとして構成します。リバースプロキシとして、ブラウザからの https アクセスを、http に転換して Yellowfin サーバーに転送する役割を果たします。
・SSL 接続を有効にするための証明書を IIS に配置する必要があります。そのために、win-acme を用いて、IIS サイトに Let’s Encrypt が発行する SSL 証明書を配置し、証明書の更新を自動化します。

# Yellowfin の設定
### インストールと初期設定
Yellowfin のインストールや初期設定は下記をご参照ください。

[・ Yellowfin インストール手順](https://support.yellowfin.co.jp/hc/ja/articles/360001025428-Yellowfin%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86)

[・ Yellowfin の初期設定をおこないましょう](https://support.yellowfin.co.jp/hc/ja/articles/360001025528-Yellowfin%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%8A%E3%81%93%E3%81%AA%E3%81%84%E3%81%BE%E3%81%97%E3%82%87%E3%81%86)

### Yellowfin Tomcat の設定
Yellowfin Tomocat の server.xml に以下の設定を加えます。
Yellowfin へのアクセスを 80 番ポートで設定している場合、Connector port="80" から始まるノードの末尾の部分に、proxyName、proxyPort、scheme、secure の設定を追記します。Reverse Proxy である web.example.jp に対して、https (443) でアクセスされるものがリダイレクトされることを定義している感じです。

```xml:server.xml
<Connector port="80" ...
    proxyName="web.example.jp" proxyPort="443" scheme="https" secure="true"/>
```

# Web サーバー / リバースプロキシの設定

以下の手順は Web サーバー (web.example.jp) 上で実行します。

### サイトバインドの設定
IIS サイトと DNS 名をバインドします。
下記例では、IIS をインストールすると規定で作成される Default Web Site に対して、web.yellowfin.co.jp をバインドしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/52c54fe6-2353-d80d-dc9d-e6e140955edb.png)

### win-acme モジュールのダウンロードとインストール
IIS に Let’s Encrypt が発行する SSL 証明書を割り当てるためには、win-acme とモジュールを使用するととても便利です。
下記にアクセスして GitHub からモジュールを取得します。

https://github.com/win-acme/win-acme/releases

2023 年 11 月 28 日現在では、v2.2.6 が最新でした。
v.2.2.6 に関わる画面の Assets 欄から 64bit 版インストーラー (win-acme.v2.2.6.1571.x64.pluggable.zip) を入手します。

インストールは、ダウンロードした zip ファイルを任意のディレクトリに展開するだけです。
展開したフォルダ内に、wasm.exe が確認できます。この実行ファイルを起動して win-acme を利用します。

### SSL 証明書の入手とサイトへの配置
Command Prompt を管理者権限で起動し、wasm.exe が存在するディレクトリに移動した後、wasm.exe を実行します。実行後は、対話式で設定内容が尋ねられるため、それぞれに回答する流れで設定を進めていきます。

```cmd:wasm.exe
C:\win-acme\wasm.exe
```

最初に操作種類一覧から、N: Create certificate (default settings) を選択して、新規証明書の作成を開始します。

```cmd:wasm.exe
N: Create certificate (default settings)
M: Create certificate (full options)
R: Run renewals (0 currently due)
A: Manage renewals (0 total)
O: More options...
Q: Quit

Please choose from the menu: N
```

サイトバインディングが設定されている IIS サイトが抽出されてきます。その中から SSL 証明書を配置するサイトを選択します。
```cmd:wasm.exe
1: Default Web Site (1 binding)

Site identifier(s) or <Enter> to choose all: 1
```

選択した IIS サイトに対してバインドされている DNS 名一覧が抽出されてきます。バインドされている DNS名が １ つである場合は、絞り込む必要は無いので、A: Pick &#42;all&#42; bindings を選択します。
 ```cmd:wasm.exe
1: web.example.jp (Site 1)
   …
P: Pick bindings based on a search pattern
A: Pick *all* bindings

Binding identifiers(s) or menu option: A
```

続く 3 つの問いには、yes で回答し、続いて Let’s Encrypt からの通知を受け取る管理者のメールアドレスを入力します。

```cmd:wasm.exe
1: web.example.jp (Site 1)

Continue with this selection? (y*/n) - yes

Open in default application? (y/n*) - yes

Do you agree with the terms? (y*/n) - yes
Enter email(s) for notifications about problems and abuse (comma-separated): taro.tuna@example.jp
```

これで、SSL 証明書が発行され、IIS の該当サイトにSSL 証明書が割り当てられます。
サイトバインドの設定に、https が追加されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/8c36c1a0-7d87-8403-5d8c-0a55a07880f8.png)


発効された SSL 証明書が自動で紐づいていることも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/467bd93a-570a-ea67-96ce-de297c5f35ea.png)

タスクスケジューラ を起動すると、win-acme renew に関するタスクスケジューラが追加されていることが分かります。
規定では、毎日 9:00 に証明書の有効期限を確認・更新するタスクが起動するように設定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/655f40c3-95ec-bb16-b83d-3e891e97ac72.png)


### リバースプロキシの設定

##### URL Rewrite モジュールの入手とインストール

下記から URL Rewrite モジュールを入手します。64 bit サーバー OS の場合、Japanese: x64 installer を選択します。

https://www.iis.net/downloads/microsoft/url-rewrite

rewrite_amd64_ja-JP.msi を起動してインストールします。オプション設定は無いので、起動してインストーラーを進めていけば、問題無くインストールが完了します。

##### リダイレクト設定

インターネットインフォメーションサービス (IIS) マネージャーを起動し、該当サイトの機能ビューを確認すると、[ URL 書き換え] の項目が追加されているのが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/4ae4f6e2-b133-e9ba-eff1-16a00e02ae1d.png)
 
[URL 書き換え] > [規則の追加] > [リバースプロキシ] の順に選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/50b244d7-1a68-c468-1d6f-bd49f6081e01.png)

HTTP 要求の転送先サーバー名、つまり Yellowfin サーバーの DNS 名 (例 : yellowfin.example.jp) を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/e56e1cb5-156d-0766-173b-64a9ab1cca6b.png)

結果、以下のような書き換え規則が作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/8c4a7f04-59d7-28aa-3176-dc636b76fc41.png)

# 動作確認
ブラウザから Web サーバー (https\://web.example.jp) にアクセスすると、Yellowfin サーバー (yellowfin.example.jp) にリダイレクトされて、Yellowfin のログイン画面が表示されます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/046f9e8a-040a-48ef-1ea1-0ec525e8a7a4.png)
 
# 最後に
[『Let's Encrypt を活用して Yellowfin にセキュアアクセス』 ](https://qiita.com/ExtremeCarvFJ/items/d1c65734bec59c37acc2)で紹介した、Let's Encrypt が発行する証明書と鍵を Yellowfin Tomcatに格納する方法と比べて、証明書の扱いが格段に楽なのがお分かりいただけたかと思います。

では皆様、良いデータ分析を! Cheers!!

# 参考情報

https://www.aiik.net/2019/12/01/iis%E3%81%A7lets-encrypt%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/#toc5

https://qiita.com/yaju/items/a86f26d6dd7977695457