こんにちは、SCSKでAWSの内製化支援『テクニカルエスコートサービス』を担当している貝塚です。よろしくお願いします。
東京リージョンのNetwork Firewallでアウトバウンド(Egress) TLS インスペクションが使えるようになりましたね。
TLSインスペクションとは
SSL/TLSで暗号化された通信内容をチェックする機能です。
HTTPSなどのSSL/TLSで保護された通信は、クライアント-サーバ間で通信内容が暗号化されているため、通常、中継するネットワークデバイスで通信内容をチェックすることができません。SSLサーバ証明書をうまく使って中継デバイスで通信内容をチェックできるようにしたのがTLSインスペクションです。
インバウンド(Ingress) TLSインスペクション
これまで、AWS Network Firewallは、インバウンド(AWSのドキュメントではIngressと呼ばれる)のTLSインスペクションにのみ対応していました。Ingress TLSインスペクションは、自サイトのウェブサーバ等を保護するために使用されます。たとえば自サイトでwww.example.comというサーバ証明書をインストールしたサイトを運営しているとしたら、Network Firewallにも同じwww.example.comの証明書をインストールしてやります。Network Firewallはウェブサーバに向かう通信を、そのサーバ証明書を用いて復号化し、検査した後に再びサーバ証明書を用いて暗号化して、何食わぬ顔でウェブサーバに転送します。
検査したい対象サーバのサーバ証明書を入手しなければ検査ができないので、必然的に自身の管理下にあるサーバしか検査対象にできませんでした。
アウトバウンド(Egress) TLSインスペクション
今回、新たに対応したのは、アウトバウンド(AWSのドキュメントではEgressと呼ばれる)方向、つまり、自分たちの管理下にあるクライアントPCが、自分たちの管理下にないSSLサーバ証明書をインストールした外部のウェブサーバと通信するときに通信内容を検査できるようになりました。
方式としては、Network FirewallがクライアントPCに代わって外部のウェブサーバwww.example.comとTLS接続を行い、Network Firewallは自身でwww.example.comのサーバ証明書を発行してクライアントPCとの間にTLS接続を確立します。Network FirewallがクライアントPCとのTLS接続、サーバとのTLS接続、両方を終端するため、Network Firewallで通信内容が検査できるということになります。
動的にサーバ証明書を発行するためにNetwork Firewallには認証局(CA)証明書をインストールする必要があります。
以下、Egress TLS インスペクション機能を検証したときの設定手順と動作確認について説明しますが、Network Firewall自体は既に作成したことがあるか、他のドキュメントを参考にして新規作成できることを前提に、キモとなる部分のみを解説します。
Egress TLSインスペクション設定の流れ
Egress TLSインスペクション機能検証のために実施した設定は以下の通りです。Network Firewall自体は既にデプロイされている前提で、TLSインスペクションの設定手順のみを記載しています。
- プライベート認証局のルート証明書を作成する
- ACMに、作成したルート証明書をインポートする
- Network FirewallのTLS検査設定を作成する
- Network Firewallのファイアウォールポリシーを作成する
- Network Firewallにファイアウォールポリシーを関連付ける
動作確認の流れ
Egress TLSインスペクションの動作確認で実施した内容は以下の通りです。
- クライアントPCにルート証明書をインストールする
- クライアントPCからHTTPSアクセスして証明書を確認する
- Network FirewallのルールグループにHTTPの内容をチェックするルールを追加する
- HTTPの内容をチェックできていることを確認する
Egress TLSインスペクション設定
プライベート認証局のルート証明書を作成する
Egress TLS インスペクションには、プライベート認証局(CA)のルート証明書が必要になります。
作成は、こちらの記事を参考にさせていただきました。
「4.2 認証局の証明書の作成」まで実行し、証明書と秘密鍵を作成します。
ACMに、作成したルート証明書をインポートする
AWSマネジメントコンソールからACM(AWS Certificate Manager)を起動して「インポート」をクリック、「証明書本文」と「証明書のプライベートキー」に作成した証明書、秘密鍵を張り付けてインポートを完了させます。
インポートした証明書は以下のようになりました。
Network FirewallのTLS検査設定を作成する
AWSマネジメントコンソール、ネットワークファイアウォールのTLS検査設定から「TLS検査設定を作成」をクリックします。
「アウトバウンド SSL/TLS インスペクション用の CA 証明書」で、インポートしたCA証明書を選択します。
「TLS 検査設定の詳細」を埋めた後、スコープ設定で検査対象とする送信元/送信先IPとポートを指定します。検査対象としたいトラフィックの範囲をきっちり定義してあげましょう。ここでTLS以外のトラフィックも含めてしまうと、それらは正常に通信できなくなってしまいます。基本的には送信先ポートを443番のみに限定しておくのがよいでしょう。
以降の設定項目も適切に入力して、TLS検査設定を作成します。
Network Firewallのファイアウォールポリシーを作成する
ファイアウォールポリシー作成時にTLS検査設定を指定します。既に作成済みのファイアウォールポリシーにTLS検査設定を追加することはできないので、使用中のファイアウォールポリシーがある場合はあきらめてファイアウォールポリシーを作り直します。
作成途中で「TLS検査設定を追加」というステップがありますので、先ほど作成したTLS検査設定を指定します。それ以外は通常のファイアウォールポリシー作成と同様の手順で、ファイアウォールポリシーの作成を完了させます。
Network Firewallにファイアウォールポリシーを関連付ける
作成したファイアウォールポリシーをNetwork Firewallにひもづけます。
手順はNetwork Firewallのドキュメントなどをご参照ください。
動作確認
クライアントPCにルート証明書をインストールする
プライベートCAの発行したサーバ証明書が提示されると、クライアントPCのウェブブラウザで警告が出てしまうので、クライアントPCにはルート証明書をインストールします。
下記サイトを参考にして、「プライベート認証局のルート証明書を作成する」のところで作成したルート証明書を、動作確認に使用するクライアントPCにインストールしました。
クライアントPCからHTTPSアクセスして証明書を確認する
クライアントPCからウェブサーバにHTTPSアクセスします。
今回は、自前で立てたウェブサーバの前にELBを置き、ACMで発行した証明書をELBにインストールしてHTTPS化しています。
まずはTLSインスペクション設定前の状態を確認しておきます。クライアントPCのウェブブラウザからこのウェブサーバにアクセスして証明書を確認してみると、たしかにAmazon(ACM)が発行した証明書です。
次に、TLSインスペクション設定後にアクセスし証明書を確認します。発行者(Issued By)が先ほど作成したCAになっているのが分かります。うまくいっているようですね。クライアントPCにCAのルート証明書をインストールしているので、証明書の警告も表示されません。
Network FirewallのルールグループにHTTPの内容をチェックするルールを追加する
Network FirewallのHTTPチェックのルールで、HTTPSの通信をチェックできるようになっているはずです。今回の検証では、URIをチェックしてindex.htmlへのアクセスはドロップし、scsk.htmlへのアクセスは許可するルールにしてみます。
ルールグループのルールに、以下のSuricata互換ルールを追加しました。TLSは終端しているのでプロトコルにはtlsではなくhttpを、ポート番号はhttps通信のデフォルトでTCP 443を使っているので443を指定しています。
drop http $HOME_NET any -> $EXTERNAL_NET 443 (msg:"Detected access to tcp port 443 /index.html"; http.uri; content:"index.html"; sid:1000102; rev:1;) alert http $HOME_NET any -> $EXTERNAL_NET 443 (msg:"Detected access to tcp port 443 /scsk.html"; http.uri; content:"scsk.html"; sid:1000111; rev:1;) pass http $HOME_NET any -> $EXTERNAL_NET 443 (http.uri; content:"scsk.html"; sid:1000112; rev:1;)
HTTPの内容をチェックできていることを確認する
/index.htmlにアクセスしてみます。以下の通りコンテンツは表示されません。
/scsk.htmlにアクセスしてみます。こちらは問題なくコンテンツを表示できました。
Network Firewallのアラートログを確認したところ、以下のログが確認できました。意図通りにHTTPの内容をチェックし、URIに基づいて通信を制御できていることが分かります。
まとめ
Network FirewallのEgress TLS Inspectionについて、簡単な検証の結果をまとめてみました。
AWSのマネージドサービスを使って高度なネットワークセキュリティを確保したいというニーズはわりとあるのではないかと感じているので、Network Firewallが今後さらに機能を充実させていくことを期待しています。