

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Network Firewall を使用して、アウトバウンドトラフィックのサーバー名表示から DNS ドメイン名をキャプチャする
<a name="use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic"></a>

*Amazon Web Services、Kirankumar Chandrashekar*

## 概要
<a name="use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic-summary"></a>

このパターンは、AWS Network Firewall を使用して、アウトバウンドネットワークトラフィックの HTTPS ヘッダー内のサーバー名表示 (SNI) によって提供される DNS ドメイン名を収集する方法を示しています。Network Firewall は、Amazon Virtual Private Cloud (Amazon VPC) の重要なネットワーク保護を簡単にデプロイできるようにするマネージド型サービスです。これには、特定のセキュリティ要件を満たさないパケットをブロックするファイアウォールでアウトバウンドトラフィックを保護する機能が含まれます。特定の DNS ドメイン名へのアウトバウンドトラフィックを保護することをエグレスフィルタリングと呼びます。これは、あるネットワークから別のネットワークへのアウトバウンド情報の流れを監視し、場合によっては制限する手法です。

Network Firewall を通過する SNI データをキャプチャしたら、Amazon CloudWatch Logs と AWS Lambda を使用して、E メール通知を生成する Amazon Simple Notification Service (Amazon SNS) トピックにデータを公開できます。E メール通知には、サーバー名とその他の関連する SNI 情報が含まれます。さらに、このパターンの出力を使用して、ファイアウォールルールを使用して SNI 内のドメイン名によるアウトバウンドトラフィックを許可または制限できます。詳細については、Network Firewall ドキュメントの「[AWS Network Firewall のステートフルルールグループの操作](https://docs.aws.amazon.com/network-firewall/latest/developerguide/stateful-rule-groups-ips.html)」をご参照ください。

## 前提条件と制限
<a name="use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント。
+ 「[AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)」バージョン 2 (Linux、macOS、Windows にインストールおよび設定済み)。
+ Amazon VPC でセットアップおよび設定され、アウトバウンドトラフィックの検査に使用されている「[Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/getting-started.html)」。Network Firewall は、次の VPC 設定のいずれかを使用するように設定できます。
  + 「[インターネットゲートウェイを備えたシンプルなシングルゾーンアーキテクチャ](https://docs.aws.amazon.com/network-firewall/latest/developerguide/arch-single-zone-igw.html)」
  + 「[インターネットゲートウェイを備えたマルチのゾーンアーキテクチャ](https://docs.aws.amazon.com/network-firewall/latest/developerguide/arch-two-zone-igw.html)」 
  + 「[インターネットゲートウェイと NAT ゲートウェイを使用するアーキテクチャ](https://docs.aws.amazon.com/network-firewall/latest/developerguide/arch-igw-ngw.html)」

## アーキテクチャ
<a name="use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic-architecture"></a>

次の図は、ネットワークファイアウォールを使用してアウトバウンドネットワークトラフィックから SNI データを収集し、CloudWatch Logs と Lambda を使用してそのデータを SNS トピックに公開する方法を示しています。

![Network Firewall、CloudWatch Logs、Lambda、Amazon SNS 間のワークフロー。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9eb1e9e3-f459-4ea3-8e6d-60fec6b7ea98/images/1094b5f6-33e3-42bc-8fb8-7409b5b826b0.png)


この図表は、次のワークフローを示しています:

1. Network Firewall は、アウトバウンドネットワークトラフィックの HTTPS ヘッダーにある SNI データからドメイン名を収集します。

1. CloudWatch Logs は SNI データを監視し、アウトバウンドネットワークトラフィックが Network Firewall を通過するたびに Lambda 関数を呼び出します。

1. Lambda 関数は CloudWatch Logs によってキャプチャされた SNI データを読み取り、そのデータを SNS トピックに公開します。

1. SNS トピックから SNI データを含むメール通知が送信されます。

**自動化とスケール**
+ 「[AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)」を使用して、「[インフラストラクチャをコードとして](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)」使用することでこのパターンを作成できます。

テクノロジースタック
+ Amazon CloudWatch Logs
+ Amazon SNS
+ Amazon VPC
+ AWS Lambda 
+ AWS Network Firewall

## ツール
<a name="use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic-tools"></a>

**AWS サービス**
+ 「[Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)」— Amazon CloudWatch Logs を使用して、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、AWS CloudTrail、Amazon Route 53 およびその他のソースからログファイルを監視、保存、およびアクセスすることができます。
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) – Amazon Simple Notiﬁcation Service (Amazon SNS) は、パブリッシャーからサブスクライバー (または生産者から消費者) へのメッセージ配信を提供するマネージドサービスです。
+ 「[Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)」— Amazon Virtual Private Cloud (Amazon VPC) では、AWS クラウドの論理的に隔離されたセクションをプロビジョニングすることで、ユーザーが定義した仮想ネットワーク内で AWS リソースを起動できます。仮想ネットワークは、お客様自身のデータセンターで運用されていた従来のネットワークによく似ていますが、AWS のスケーラブルなインフラストラクチャを使用できるというメリットがあります。
+ 「[AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)」— AWS Lambda はサーバーをプロビジョニングまたは管理しなくてもコードを実行できるコンピュートサービスです。
+ 「[AWS Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/what-is-aws-network-firewall.html)」— AWS Network Firewall は、すべてのAmazon VPC に不可欠なネットワーク保護を簡単に導入できる管理サービスです。

## エピック
<a name="use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic-epics"></a>

### Network Firewall の CloudWatch Logs ロググループの作成
<a name="create-a-cloudwatch-log-group-for-network-firewall"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| CloudWatch Logs ロググループを作成します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic.html)詳細については、CloudWatch Logs ドキュメントの「[ロググループとログストリームの操作](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)」を参照してください。 | クラウド管理者 | 

### SNS トピックおよびサブスクリプションの作成
<a name="create-an-sns-topic-and-subscription"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| SNS トピックを作成します。 | SNS トピックを作成するには、「[Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html#create-topic-aws-console)」ドキュメントの指示に従ってください。 | クラウド管理者 | 
| SNS トピックにエンドポイントを登録します。 | 作成した SNS トピックのエンドポイントとしてメールアドレスを登録するには、「[Amazon SNS ドキュメント](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)」の指示に従います。**[プロトコル]** には「[Email/Email-JSON](https://docs.aws.amazon.com/sns/latest/dg/sns-email-notifications.html)」を選択します。要件に基づいて別のエンドポイントを選択することもできます。 | クラウド管理者 | 

### Network Firewall へのログインをセットアップする
<a name="set-up-logging-in-network-firewall"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ファイアウォールロギングを有効にする。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic.html)CloudWatch Logs をネットワークファイアウォールのログ送信先として使用する方法の詳細については、Network Firewall ドキュメントの「[Amazon CloudWatch Logs](https://docs.aws.amazon.com/network-firewall/latest/developerguide/logging-cw-logs.html)」を参照してください。  | クラウド管理者 | 

### Network Firewall でステートフルルールを設定する
<a name="set-up-a-stateful-rule-in-network-firewall"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ステートフルルールグループの作成 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic.html) | クラウド管理者 | 
| ステートフルルールをNetwork Firewall に関連付けます。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic.html) | クラウド管理者 | 

### ログを読み取る Lambda 関数を作成します。
<a name="create-a-lambda-function-to-read-the-logs"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Lambda 関数のコードを作成します。 | アウトバウンドトラフィックのNetwork Firewall から CloudWatch Logs イベントを読み取ることができる統合開発環境 (IDE) で、次の Python 3 コードを貼り付け、`<SNS-topic-ARN>` を指定した値に置き換えます。<pre>import json<br />import gzip<br />import base64<br />import boto3<br />sns_client = boto3.client('sns')<br />def lambda_handler(event, context):<br />    decoded_event = json.loads(gzip.decompress(base64.b64decode(event['awslogs']['data'])))<br />    body = '''<br />    {filtermatch}<br />    '''.format(<br />        loggroup=decoded_event['logGroup'],<br />        logstream=decoded_event['logStream'],<br />        filtermatch=decoded_event['logEvents'][0]['message'],<br />    )<br />    print(body)<br />    filterMatch = json.loads(body)<br />    data = []<br />    if 'http' in filterMatch['event']:<br />        data.append(filterMatch['event']['http']['hostname'])<br />    elif 'tls' in filterMatch['event']:<br />        data.append(filterMatch['event']['tls']['sni'])<br />    result = 'Domain accessed ' + 1*' ' + (data[0]) + 1*' ' 'via AWS Network Firewall ' + 1*' '  + (filterMatch['firewall_name'])<br />    print(result)<br />    message = {'ServerName': result}<br />    send_to_sns = sns_client.publish(<br />        TargetArn=<SNS-topic-ARN>,          #Replace with the SNS topic ARN<br />        Message=json.dumps({'default': json.dumps(message),<br />                        'sms': json.dumps(message),<br />                        'email': json.dumps(message)}),<br />        Subject='Server Name passed through the Network Firewall',<br />        MessageStructure='json'<br />    )</pre><br />このコードサンプルは、CloudWatch Logs のコンテンツを解析し、SNI によって提供されたサーバー名を HTTPS ヘッダーにキャプチャします。 | アプリ開発者 | 
| Lambda 関数の作成 | Lambda 関数を作成するには、「[Lambda ドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function)」の手順に従い、**[ランタイム]** に **[Python 3.9]** を選択します。 | クラウド管理者 | 
| Lambda 関数にコードを追加します。 | 前に作成した Lambda 関数に Python コードを追加するには、「[Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html#configuration-function-update)」ドキュメントの指示に従ってください。 | クラウド管理者 | 
| CloudWatch Logs をトリガーとして Lambda 関数に追加します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic.html)詳細については、Lambda ドキュメントの「[CloudWatch ログで Lambda の使用](https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchlogs.html)」を参照してください。 | クラウド管理者 | 
| SNS 公開権限を追加します。 | Lambda 実行ロールに **[sns:Publish]** アクセス許可を追加して、Lambda が API コールを行って SNS にメッセージを発行できるようにします。 [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic.html)<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Sid": "AllowSNSPublish",<br />            "Effect": "Allow",<br />            "Action": [<br />                "sns:GetTopicAttributes",<br />                "sns:Subscribe",<br />                "sns:Unsubscribe",<br />                "sns:Publish"<br />            ],<br />            "Resource": "*"<br />        }<br />    ]<br />}</pre> | クラウド管理者 | 

### SNS 通知の機能をテストしてください。
<a name="test-the-functionality-of-your-sns-notification"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Network Firewall 経由でトラフィックを送信します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic.html)<pre>{<br />    "Type": "Notification",<br />    "MessageId": "<messageID>",<br />    "TopicArn": "arn:aws:sns:us-west-2:123456789:testSNSTopic",<br />    "Subject": "Server Name passed through the Network Firewall",<br />    "Message": "{\"ServerName\": \"Domain 'aws.amazon.com' accessed via AWS Network Firewall 'AWS-Network-Firewall-Multi-AZ-firewall\"}",<br />    "Timestamp": "2022-03-22T04:10:04.217Z",<br />    "SignatureVersion": "1",<br />    "Signature": "<Signature>",<br />    "SigningCertURL": "<SigningCertUrl>",<br />    "UnsubscribeURL": "<UnsubscribeURL>"<br />}</pre>次に、「[Amazon CloudWatch ドキュメント](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SearchDataFilterPattern.html)」の指示に従って、Amazon CloudWatch の Network Firewall アラートログを確認します。アラートログには次のように出力されます。<pre>{<br />    "firewall_name": "AWS-Network-Firewall-Multi-AZ-firewall",<br />    "availability_zone": "us-east-2b",<br />    "event_timestamp": "<event timestamp>",<br />    "event": {<br />        "timestamp": "2021-03-22T04:10:04.214222+0000",<br />        "flow_id": <flow ID>,<br />        "event_type": "alert",<br />        "src_ip": "10.1.3.76",<br />        "src_port": 22761,<br />        "dest_ip": "99.86.59.73",<br />        "dest_port": 443,<br />        "proto": "TCP",<br />        "alert": {<br />            "action": "allowed",<br />            "signature_id": 2,<br />            "rev": 0,<br />            "signature": "",<br />            "category": "",<br />            "severity": 3<br />        },<br />        "tls": {<br />            "subject": "CN=aws.amazon.com",<br />            "issuerdn": "C=US, O=Amazon, OU=Server CA 1B, CN=Amazon",<br />            "serial": "<serial number>",<br />            "fingerprint": "<fingerprint ID>",<br />            "sni": "aws.amazon.com",<br />            "version": "TLS 1.2",<br />            "notbefore": "2020-09-30T00:00:00",<br />            "notafter": "2021-09-23T12:00:00",<br />            "ja3": {},<br />            "ja3s": {}<br />        },<br />        "app_proto": "tls"<br />    }<br />}</pre> | テストエンジニア | 