SSL Insight の検証

# 環境
| 機器 | バージョン |
|:-:|:-:|
|vThunder   |5.2.1-p5, build 114   |
|FortiGate-VM   |v6.4.13 build2092 (GA)   |
|WindowsServer   |Windows Server 2019  |
|CentOS8   |CentOS 8.5.2111   |
|httpd   |2.4.37-43   |
|openssl   |1.1.1.k-5   |
|mod_ssl   |2.4.37-43   |

# 構成イメージ図
<img width="500" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/22ca940b-30b9-a906-850a-1f4af6e0b5fb.png">

# webサーバ構築
以下を参照
https://qiita.com/motimotinoyamayama/items/6b3a3ee0ff8db9471219

# 証明書類を作成
以下を参照。
ルートCA証明書と鍵はvThunderに適用、サーバ証明書と鍵はwebサーバに適用する。
https://qiita.com/motimotinoyamayama/items/344ba7797caca61eef5b


# Clientの設定
ブラウザにルートCA証明書のPEMファイルをインポートする


# Forigate-VM
I/Fの設定。port3は管理セグメント。
AccessModeとして動作させるため、物理I/Fに設定している。
<img width="600" alt="キャプチャ1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/7f8793db-0e5a-870f-01d7-6de5669dd642.png">

port1,2にスタティックルートを設定。
<img width="600" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/8f0655ae-0ca8-1f13-7d4d-17f8475bee58.png">

Foriは平文のパケットを通過させるだけなので、全てのパケットを許可する。
NATはvThunder exのaclが100.0.0.0 /24を指定しているので、無効化にする。 
<img width="600" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/0fac423f-cd49-8d1f-f056-80b46c3ce533.png">



# vThunder
## ADP作成
vThunderでSSLiする際、システムpromiscuous モードを設定
promiscuousモードとは、ネットワーク上を流れる全てのデータパケットを受信するモード。
```
A10(config)#system promiscuous-mode
```

同一筐体の複数パーティションを連結する際のMacアドレス重複を避けるために設定を行い、リロードする。
```
A10(config)#system ve-mac-scheme system-mac
A10(config)#write memory
A10(config)#exit
A10#reload
```

SSL Insight 用の ADP（内側パーティション・外側パーティション）を作成します。パーティション設定。
アプリケーションデリバリコントローラ（ADC）とは、サーバの負荷分散装置の一種で、高度な制御機能やサーバ負荷の一部を肩代わりする機能を持ったもの。
```
A10(config)# partition in id 1 application-type adc
A10(config)# partition ex id 2 application-type adc
```
```php:#show partition all
Partition Name   Id     L3V/SP     Parent L3V           App Type   Admin Count  Active
--------------------------------------------------------------------------------------
in               1       L3V       -                    ADC          0            *
ex               2       L3V       -                    ADC          0            *
```


## Partition in 作成
internalパーティションへ移動
```
A10(config)# active-partition in
```

CA証明書と鍵のインポート
GUIで操作。
ルートCA証明書のインポート。
<img width="600" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/82389d3f-2e53-c260-d0cc-60402ca0e1c0.png">

ルートCA秘密鍵をインポート
<img width="600" alt="キャプチャ5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/f62a623f-6f24-93ee-8210-b227adf764f9.png">

インポートした証明書を確認
<img width="600" alt="キャプチャ6.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/d47324e9-288d-dcc6-5bae-a4e11571cbc8.png">


## ネットワークの設定
```
vlan 10 
  untagged ethernet 1
  router-interface ve 10 
  exit-module
!
vlan 50 
  untagged ethernet 2
  router-interface ve 50 
  exit-module
!
!
interface ethernet 1 
  enable 
  exit-module
!
interface ethernet 2 
  enable 
  exit-module
!
interface ve 10 
  ip address 100.0.0.1 255.255.255.0 
  ip allow-promiscuous-vip 
  exit-module
!
interface ve 50 
  ip address 10.0.5.1 255.255.255.0 
  exit-module
!
!
ip route 0.0.0.0 /0 10.0.5.254 
```

SSLiの対象となるClientNetworkをACLで定義
```
a10[in](config)#access-list 100 permit ip 100.0.0.0 /24 any vlan 10
```

## realserverの設定
復号化トラフィックの転送先を定義。
slb serverにはサーバ名とIPアドレス、portには、ポート番号とL4プロトコルの種別を指定します。

8080番ポートは80番ポートの代替。
0番ポートはエニーポート（any port）と呼ばれ、アプリケーションに対して、動的に別番号の空きポートを割り当てるために用意された特殊なポート番号。
health-check-disable はリアルサーバに対してpingによるヘルスチェック、公開ポートに対してL4ポートのヘルスチェックを無効にする（デフォルトは有効）
```
a10[in](config)#slb server gw1 10.0.5.254 
a10[in](config-real server)#port 0 tcp 
a10[in](config-real server-node port)#health-check-disable 
a10[in](config-real server)#port 0 udp 
a10[in](config-real server-node port)#health-check-disable 
a10[in](config-real server)#port 8080 tcp 
a10[in](config-real server-node port)health-check-disable 
```

## service groupに割り当て
real server から service group を作成します。
service group により real server をグループ化します。 このグループ化されたサーバ群に対して、ロードバランシングが実行されます。
slb service-groupには、サービスグループ名とL4プロトコルの種別を指定。memberには、リアルサーバの設定で指定したサーバ名とポート番号を指定。
```
a10[in](config)#slb service-group gw-http tcp 
a10[in](config-slb svc group)#member gw1 8080 
a10[in](config)#slb service-group gw-tcp tcp 
a10[in](config-slb svc group)#member gw1 0 
a10[in](config)#slb service-group gw-udp udp 
a10[in](config-slb svc group)#member gw1 0
```

## client-ssl template の設定
SSL Insight の内側デバイスとして動作させるよう定義します。
SSLオフロードの復号化処理を行う。
SSLテンプレートを作成し、先ほどimportした証明書と秘密鍵を紐付けます。
```
A10[in](config)#slb template client-ssl cs1  
A10[in](config-client ssl)#forward-proxy-ca-cert ca1 
A10[in](config-client ssl)#forward-proxy-ca-key ca1 
A10[in](config-client ssl)#forward-proxy-enable
```


## virtual server の設定
SSL通信を受け入れる wild card VIP を設定します。
slb virtual-serverには、バーチャルサーバ名と、ロードバランサ自身で保持する仮想IPを指定します。
```
A10[in](config)#slb virtual-server wc1 0.0.0.0 acl 100 
```
portには、バーチャルサーバがリッスンするポート番号とL4プロトコルの種別を指定します。このポートは、リアルサーバのポート番号と異なる番号を指定することも可能です。
service-groupには、負荷分散先のリアルサーバが所属するサービスグループ名を指定します。
no-dest-nat は受信したパケットの宛先NATをしない。（デフォルトはリアルサーバのIPアドレスにNATするので、これを抑止）

anyポートとanyポートに紐づけられたtcp、udp以外のL4プロトコルを指定。サービスグループはgw-udpを紐づけ。
```
A10[in](config-slb vserver)#port 0 others 
A10[in](config-slb vserver-vport)#service-group gw-udp 
A10[in](config-slb vserver-vport)#no-dest-nat 
```
 anyポートとtcpを指定。サービスグループはgw-tcpを紐づけ。
 ```
A10[in](config-slb vserver)#port 0 tcp 
A10[in](config-slb vserver-vport)#service-group gw-tcp 
A10[in](config-slb vserver-vport)#no-dest-nat 
```
anyポートとudpを指定。サービスグループはgw-udpを紐づけ。
```
A10[in](config-slb vserver)#port 0 udp
A10[in](config-slb vserver-vport)#service-group gw-udp 
A10[in](config-slb vserver-vport)#no-dest-nat
```
443ポートとhttpsを指定。サービスグループはgw-http、先ほど定義したclient-ssl templateを紐づけ。
port-translation を指定した場合、宛先Portはリアルサーバのものに変更。

```
A10[in](config-slb vserver)#port 443 https 
A10[in](config-slb vserver-vport)#service-group gw-http 
A10[in](config-slb vserver-vport)#no-dest-nat port-translation 
A10[in](config-slb vserver-vport)#template client-ssl cs1 ※
```


## Partition ex 作成
externalパーティションへ移動
```
A10(config)#active-partition ex
```


## ACLの設定
SSL Insight の対象となるクライアントネットワーク（および宛先）をACLで定義
```
A10[ex](config)#access-list 100 permit ip 100.0.0.0 0.0.0.255 any ethernet 3 
```


## ネットワークの設定
```
vlan 30 
  untagged ethernet 4
  router-interface ve 30 
  exit-module
!
vlan 60 
  untagged ethernet 3
  router-interface ve 60 
  exit-module
!
!
interface ethernet 3 
  enable 
  exit-module
!
interface ethernet 4 
  enable 
  exit-module
!
interface ve 30 
  ip address 10.0.2.1 255.255.255.0 
  exit-module
!
interface ve 60 
  ip address 10.0.6.1 255.255.255.0 
  ip allow-promiscuous-vip 
  exit-module
!
!
ip route 0.0.0.0 /0 10.0.6.254 
```


## server-ssl templateの設定
SSL Insight の外側デバイスとして動作させるよう定義します。
SSLオフロードの暗号化処理を行う。
```
A10[ex](config)#slb template server-ssl ss1 
A10[ex](config-server ssl)#forward-proxy-enable 
```


## real server の設定
暗号化トラフィックの転送先を定義。
slb serverにはサーバ名とIPアドレス、portには、ポート番号とL4プロトコルの種別を指定します。
```
A10[ex](config)#slb server gw1 10.0.2.254 
```
```
A10[ex](config-real server)#port 0 tcp 
A10[ex](config-real server-node port)#health-check-disable 
A10[ex](config-real server)#port 0 udp 
A10[ex](config-real server-node port)#health-check-disable 
A10[ex](config-real server)#port 443 tcp
A10[ex](config-real server-node port)#health-check-disable 
```


## service group の設定
real server から service group を作成します。
service group により real server をグループ化します。 このグループ化されたサーバ群に対して、ロードバランシングが実行されます。
slb service-groupには、サービスグループ名とL4プロトコルの種別を指定。memberには、リアルサーバの設定で指定したサーバ名とポート番号を指定。
```
A10[ex](config)#slb service-group gw-http tcp 
A10[ex](config-slb svc group)#member gw1 443 
A10[ex](config)#slb service-group gw-tcp tcp 
A10[ex](config-slb svc group)#member gw1 0
A10[ex](config)#slb service-group gw-udp udp 
A10[ex](config-slb svc group)#member gw1 0 
```


## virtual server の設定
wildcard VIP を作成し、クライアントからのトラフィクを処理。
slb virtual-serverには、バーチャルサーバ名と、ロードバランサ自身で保持する仮想IPを指定します。
```
A10[ex](config)slb virtual-server wc1 0.0.0.0 acl 100
```
portには、バーチャルサーバがリッスンするポート番号とL4プロトコルの種別を指定します。このポートは、リアルサーバのポート番号と異なる番号を指定することも可能です。
service-groupには、負荷分散先のリアルサーバが所属するサービスグループ名を指定します。
no-dest-nat は受信したパケットの宛先NATをしない。（デフォルトはリアルサーバのIPアドレスにNATするので、これを抑止）
use-rcv-hop-for-respはサーバからのリプライパケットをリクエストパケットのソースMACアドレス宛に戻したい場合に利用。これがない場合はルーティングテーブルを参照しネクストホップのMACアドレスに戻す。

anyポートとanyポートに紐づけられたtcp、udp以外のL4プロトコルを指定。サービスグループはgw-udpを紐づけ。
```
A10[ex](config-slb vserver)port 0 others 
A10[ex](config-slb vserver-vport)service-group gw-udp 
A10[ex](config-slb vserver-vport)use-rcv-hop-for-resp 
A10[ex](config-slb vserver-vport)no-dest-nat 
```
anyポートとtcpを指定。サービスグループはgw-tcpを紐づけ。
```
A10[ex](config-slb vserver)port 0 tcp 
A10[ex](config-slb vserver-vport)service-group gw-tcp 
A10[ex](config-slb vserver-vport)use-rcv-hop-for-resp
A10[ex](config-slb vserver-vport)no-dest-nat
```
anyポートとudpを指定。サービスグループはgw-udpを紐づけ。
```
A10[ex](config-slb vserver)port 0 udp
A10[ex](config-slb vserver-vport)service-group gw-udp 
A10[ex](config-slb vserver-vport)use-rcv-hop-for-resp
A10[ex](config-slb vserver-vport)no-dest-nat
```
8080ポートとhttpを指定。サービスグループはgw-http、先ほど定義したserver-ssl templateを紐づけ。
```
A10[ex](config-slb vserver)port 8080 http
A10[ex](config-slb vserver-vport)service-group gw-http
A10[ex](config-slb vserver-vport)use-rcv-hop-for-resp
A10[ex](config-slb vserver-vport)template server-ssl ss1
A10[ex](config-slb vserver-vport)no-dest-nat port-translation
```

# SSL Insight 検証
Forigateのport1でパケットキャプチャ取得するため、port1を指定してキャプチャをスタートさせる。
<img width="600" alt="キャプチャ9.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/a686819c-2bab-1da6-6d06-a2d17f942996.png">

clientからwebサーバのアドレスへアクセス
<img width="600" alt="キャプチャ7.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/2c22417a-5274-0261-ac03-b300980d038e.png">

Forigate-VMのport1で取得したキャプチャ。
WebサーバからWebブラウザへ送られるHTTPステータスコード(200 OK)に平文化されたことで、webフォームに入力した文字列`WebServer_test`を確認出来る。
<img width="600" alt="キャプチャ8.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/fb1daea6-7cb8-6535-f59e-9497cfb16c7b.png">