AWS Network FirewallでアウトバウンドトラフィックをTLSインスペクションする

こんにちは、SCSKでAWSの内製化支援『テクニカルエスコートサービス』を担当している貝塚です。よろしくお願いします。

東京リージョンのNetwork Firewallでアウトバウンド(Egress) TLS インスペクションが使えるようになりましたね。

AWS Network Firewall egress TLS inspection is now available in all regions

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はウェブサーバに向かう通信を、そのサーバ証明書を用いて復号化し、検査した後に再びサーバ証明書を用いて暗号化して、何食わぬ顔でウェブサーバに転送します。

検査したい対象サーバのサーバ証明書を入手しなければ検査ができないので、必然的に自身の管理下にあるサーバしか検査対象にできませんでした。

nwfw_inbound_inspection

 

アウトバウンド(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)証明書をインストールする必要があります。

nwfw_outbound_inspection

以下、Egress TLS インスペクション機能を検証したときの設定手順と動作確認について説明しますが、Network Firewall自体は既に作成したことがあるか、他のドキュメントを参考にして新規作成できることを前提に、キモとなる部分のみを解説します。

 

Egress TLSインスペクション設定の流れ

Egress TLSインスペクション機能検証のために実施した設定は以下の通りです。Network Firewall自体は既にデプロイされている前提で、TLSインスペクションの設定手順のみを記載しています。

  1. プライベート認証局のルート証明書を作成する
  2. ACMに、作成したルート証明書をインポートする
  3. Network FirewallのTLS検査設定を作成する
  4. Network Firewallのファイアウォールポリシーを作成する
  5. Network Firewallにファイアウォールポリシーを関連付ける

 

動作確認の流れ

Egress TLSインスペクションの動作確認で実施した内容は以下の通りです。

  1. クライアントPCにルート証明書をインストールする
  2. クライアントPCからHTTPSアクセスして証明書を確認する
  3. Network FirewallのルールグループにHTTPの内容をチェックするルールを追加する
  4. HTTPの内容をチェックできていることを確認する

 

Egress TLSインスペクション設定

プライベート認証局のルート証明書を作成する

Egress TLS インスペクションには、プライベート認証局(CA)のルート証明書が必要になります。
作成は、こちらの記事を参考にさせていただきました。

プライベート認証局によるサーバー証明書の発行
プライベート認証局を構築して、Webサーバー向けのサーバー証明書を発行する手順について紹介します。認証局の証明書をWebブラウザやOSの証明書ストアに読み込むことで、自己署名証明書を使ったサーバーに、警告なしにアクセスすることができます。

「4.2 認証局の証明書の作成」まで実行し、証明書と秘密鍵を作成します。

ACMに、作成したルート証明書をインポートする

AWSマネジメントコンソールからACM(AWS Certificate Manager)を起動して「インポート」をクリック、「証明書本文」と「証明書のプライベートキー」に作成した証明書、秘密鍵を張り付けてインポートを完了させます。

  import_ca_cert

インポートした証明書は以下のようになりました。

cert_imported

Network FirewallのTLS検査設定を作成する

AWSマネジメントコンソール、ネットワークファイアウォールのTLS検査設定から「TLS検査設定を作成」をクリックします。

configure_tls_inspection

「アウトバウンド SSL/TLS インスペクション用の CA 証明書」で、インポートしたCA証明書を選択します。

associate_cert

「TLS 検査設定の詳細」を埋めた後、スコープ設定で検査対象とする送信元/送信先IPとポートを指定します。検査対象としたいトラフィックの範囲をきっちり定義してあげましょう。ここでTLS以外のトラフィックも含めてしまうと、それらは正常に通信できなくなってしまいます。基本的には送信先ポートを443番のみに限定しておくのがよいでしょう。

define_scope_1define_scope_2

以降の設定項目も適切に入力して、TLS検査設定を作成します。

Network Firewallのファイアウォールポリシーを作成する

ファイアウォールポリシー作成時にTLS検査設定を指定します。既に作成済みのファイアウォールポリシーにTLS検査設定を追加することはできないので、使用中のファイアウォールポリシーがある場合はあきらめてファイアウォールポリシーを作り直します。

作成途中で「TLS検査設定を追加」というステップがありますので、先ほど作成したTLS検査設定を指定します。それ以外は通常のファイアウォールポリシー作成と同様の手順で、ファイアウォールポリシーの作成を完了させます。

create_policy

Network Firewallにファイアウォールポリシーを関連付ける

作成したファイアウォールポリシーをNetwork Firewallにひもづけます。
手順はNetwork Firewallのドキュメントなどをご参照ください。

 

動作確認

クライアントPCにルート証明書をインストールする

プライベートCAの発行したサーバ証明書が提示されると、クライアントPCのウェブブラウザで警告が出てしまうので、クライアントPCにはルート証明書をインストールします。

下記サイトを参考にして、「プライベート認証局のルート証明書を作成する」のところで作成したルート証明書を、動作確認に使用するクライアントPCにインストールしました。

Windows環境にルート証明書をインストールする方法

クライアントPCからHTTPSアクセスして証明書を確認する

クライアントPCからウェブサーバにHTTPSアクセスします。

今回は、自前で立てたウェブサーバの前にELBを置き、ACMで発行した証明書をELBにインストールしてHTTPS化しています。

まずはTLSインスペクション設定前の状態を確認しておきます。クライアントPCのウェブブラウザからこのウェブサーバにアクセスして証明書を確認してみると、たしかにAmazon(ACM)が発行した証明書です。

cert_before

次に、TLSインスペクション設定後にアクセスし証明書を確認します。発行者(Issued By)が先ほど作成したCAになっているのが分かります。うまくいっているようですね。クライアントPCにCAのルート証明書をインストールしているので、証明書の警告も表示されません。

cert_after

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にアクセスしてみます。以下の通りコンテンツは表示されません。

access_to_index

/scsk.htmlにアクセスしてみます。こちらは問題なくコンテンツを表示できました。

access_to_scsk

Network Firewallのアラートログを確認したところ、以下のログが確認できました。意図通りにHTTPの内容をチェックし、URIに基づいて通信を制御できていることが分かります。

nwfw_alert_log_1 nwfw_alert_log_2

 

まとめ

Network FirewallのEgress TLS Inspectionについて、簡単な検証の結果をまとめてみました。
AWSのマネージドサービスを使って高度なネットワークセキュリティを確保したいというニーズはわりとあるのではないかと感じているので、Network Firewallが今後さらに機能を充実させていくことを期待しています。

著者について

SCSKにて、AWSの技術支援を提供するAWSテクニカルエスコートサービスの業務に従事しています。
自称ネットワークエンジニア。
CloudFormationは触っていても面白みが感じられないけれどCDKは好き。

所持資格は、
AWS Certified Solutions Architect - Professional
AWS Certified Advanced Networking - Specialty
AWS Certified Security - Specialty
AWS Certified DevOps Engineer - Professional
IPA 情報処理安全確保支援士
など。

好きなすみっコはとかげ。

貝塚広行をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
AWSクラウドクラウドセキュリティソリューションネットワーク
シェアする
タイトルとURLをコピーしました