今回は、Network FirewallをLoad Balancerの後ろで構成する方式を考えてみます。まずは、こちらのスライドをご覧ください。

Network Firewallをプライベート・サブネットに配置し、Load BalancerがプライベートIPでバックエンドのVMにアクセスする途中でNetwork Firewallがトラフィックを検査します。パブリックからのアクセスはLoad Balancerで変換されたPrivateIPだけが対象になりますが、DRG経由でのFastConnectやVPNなどのPrivateIPアクセスなど、Network Firewallを中心とした幅広いトラフィック監視としての応用も可能です。
では実際の設定方法について紹介します。
VCNの作成
VCNウィザードを使用して下記アドレスのVCNを作成する
| VCN名 | CIDR | パブリック・サブネット | プライベート・サブネット |
|---|---|---|---|
| 任意 | 172.16.0.0/21 | 172.16.0.0/24 | 172.16.1.0/24 |
下記のように、Load BalancerとNetwork Firewall用のプライベート・サブネットをそれぞれ追加で作成する

Network Firewallの作成
今回は、Network FirewallをIPSとしての動作テストを行うので、通信をブロックさせるポリシーを作成する
まず最初にNetwork Firewallのポリシーをひとつ作成。作成後、ポリシーの詳細設定画面からセキュリティルールの作成をクリックし、すべてデフォルトのままで、最後のアクションだけを侵入防止を指定する

Network FirewallをNFW用のプライベート・サブネットに作成する。ポリシーは上記で作成したものを指定し、NATは有効化せずに作成。作成が完了したらNFWに割り当てられるプライベートIPアドレスを控えておく

ルート・ルールの設定
まず、新規でルート・ルールの作成と機能のルールの編集を行う
Load Balancerのサブネット用にルート・ルールを作成。デフォルトのプライベート・サブネットへのアクセスはNetwork Firewallを経由させる

Network Firewallのサブネット用にルート・ルールを作成。ルールは何も追加しない

デフォルトのプライベート・サブネットのルート・ルールを編集。ロードバランサーのパブリック・サブネットへのアクセスは、Network Firewallを経由させる

次に作成したルートルールを適用する
Load Balancerのサブネットの編集から、作成したルート表に変更する

Network Firewallのサブネットの編集から、作成したルート表に変更する

デフォルトのパブリックとプライベートのセキュリティリストのイングレス・ルールを下記のように変更する

WEBサーバーの設定
下記の2つのVMを指定のサブネットに作成する
| VM名 | サブネット | 用途 |
|---|---|---|
| PublicVM | Load Balancerのパブリック・サブネット | 通信確認用&踏み台 |
| PrivateVM | デフォルトのプライベート・サブネット | LBのバックエンド・サーバ |
PublicVMからPrivateVMにログインして、以下のWEBサーバ関連の設定を実行
$ sudo systemctl stop firewalld
$ sudo yum install httpd
$ sudo systemctl start httpd
テスト用のhtmlを作成して配置
$ sudo vi /var/www/html/test.html
<!doctype html>
<html>
<head><meta charset="utf-8"><title>XSS Demo</title></head>
<body>
<h1>XSS Demo</h1>
<form><input name="name"><button>送信</button></form>
<div><script>let p=new URLSearchParams(location.search).get('name'); if(p)document.write(p);</script></div>
</body>
</html>
PublicVMからURLアクセスできるか確認しておく。このアクセスはNetwork Firewallを経由しているので、接続できない場合はルート・ルールの設定が間違っている
$ curl http://PrivateVM IP/test.html
<!doctype html>
<html>
<head><meta charset="utf-8"><title>XSS Demo</title></head>
<body>
<h1>XSS Demo</h1>
<form><input name="name"><button>送信</button></form>
<div><script>let p=new URLSearchParams(location.search).get('name'); if(p)document.write(p);</script></div>
</body>
Load Balancerの作成
名前は、任意。サブネットは、LBのパブリック・サブネットを指定

バックエンド・サーバーは、PrivateVMを指定。ヘルスチェックポリシーは、プロトコルをHTTPに変更し、URLパスをHTMLのある/test.htmlにする

リスナーのトラフィック・タイプはHTTPに変更。以降は、ログ・グループなどの指定なので、お好みで指定してLBを作成する

http://Load BalancerのPublic IP/test.htmlでアクセスできれば準備完了
以下のJava Scriptを入力して送信し、接続ができなければNetwork FirewallがXSSとして認識してブロックしていることになる
<script>alert("It's XSS ")</script>
Network FirewallのThereat Logを有効化しておけば、ログの詳細を確認できる。ログについて詳しくは、こちらのチュートリアルを参考に

また、プライベート・サブネットからのIntrenetへのアウトバンド・アクセスは、下記スライドのようにNetwork Firewallを経由させて制御させることが可能です。

必要な設定としては、以下3つ
- プライベート・サブネットのルート・ルールで、0.0.0.0/0はNetwork Firewallに飛ばす
- Network Firewallサブネットのルート・ルールで、0.0.0.0/0はNAT Gatewayに飛ばす
- NAT Gatewayのルート表を新規作成し、プライベート・サブネットのアドレス(172.16.1.0/24)はNetwork Firewallに飛ばす
設定は以上です。今回はひとつのVCN内での制御でしたが、Load Balancerのバックエンドセットは異なるVCNを指定することもできるので、その場合でもNetwork FirewallのHub&Spokeという構成で組み入れることも可能です。
応用的な使い方ですが、こちらの資料で紹介していますのでご参考にして下さい。


