

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

# AWS Network Firewall から Slack チャネルにアラートを送信
<a name="send-alerts-from-aws-network-firewall-to-a-slack-channel"></a>

*Venki Srivatsav と Aromal Raj Jayarajan、Amazon Web Services*

## 概要
<a name="send-alerts-from-aws-network-firewall-to-a-slack-channel-summary"></a>

このパターンでは、Amazon Web Services (AWS) ネットワークファイアウォールを分散デプロイモデルで使用してファイアウォールをデプロイする方法と、AWS Network Firewall によって生成されたアラートを設定可能な Slack チャネルに伝達する方法について説明します。 

Payment Card Industry Data Security Standard (PCI DSS) などのコンプライアンス基準では、顧客データを保護するためにファイアウォールをインストールして維持する必要があります。AWS クラウドでは、これらのコンプライアンス要件の観点から、仮想プライベートクラウド (VPC) は物理ネットワークと同じと見なされます。Network Firewall を使用して VPC 間のネットワークトラフィックを監視し、コンプライアンス標準に準拠する VPC で実行されるワークロードを保護できます。Network Firewall は、同じアカウントの他の VPC からの不正アクセスを検出すると、アクセスをブロックするか、アラートを生成します。ただし、Network Firewall がサポートするアラートの配信先の数は限られています。これらの送信先には、Amazon Simple Storage Service (Amazon S3) バケット、Amazon CloudWatch Log グループ、Amazon Data Firehose 配信ストリームが含まれます。これらの通知に対してさらにアクションを行うには、Amazon Athena または Amazon Kinesis のいずれかを使用したオフライン分析が必要です。 

このパターンは、Network Firewall によって生成されたアラートを設定可能な Slack チャネルに伝播させ、ほぼリアルタイムで次のアクションを実行できるようにします。PagerDuty、Jira、メールなどの他のアラートメカニズムにも機能を拡張できます。(これらのカスタマイズは、このパターンの範囲外です。) 

## 前提条件と制限事項
<a name="send-alerts-from-aws-network-firewall-to-a-slack-channel-prereqs"></a>

**前提条件**
+ Slack チャネル (Slack ヘルプセンターの 「[はじめに](https://slack.com/help/articles/206845317-Create-a-Slack-workspace)」 を参照)
+ チャンネルにメッセージを送信するのに必要な権限
+ Slack エンドポイント URL と API トークン (「[アプリを選択し](https://api.slack.com/apps)」、受信ウェブフックを選択すると URL が表示されます。詳細については、Slack API ドキュメントの 「[受信ウェブフックの作成](https://api.slack.com/messaging/webhooks#create_a_webhook)」 を参照してください) 
+ ワークロードサブネット内の Amazon Elastic Compute Cloud (Amazon EC2) テストインスタンス
+ Network Firewall テストルール
+ テストルールをトリガーする実際のトラフィックまたはシミュレートされたトラフィック
+ デプロイするソースファイルを保持する S3 バケット

**制限事項**
+ 現在、このソリューションは送信元 IP と送信先 IP のフィルタとして 1 つの Classless Inter-Domain Routing (CIDR) の範囲のみをサポートします。

## アーキテクチャ
<a name="send-alerts-from-aws-network-firewall-to-a-slack-channel-architecture"></a>

**ターゲットテクノロジースタック**
+ 単一の VPC
+ 4 つのサブネット (ファイアウォール用に 2 つ、ワークロード用に 2 つ) 
+ インターネットゲートウェイ
+ 4 つのルートテーブルとルール 
+ Lambda 関数を実行するためのバケットポリシーとイベント設定で設定された、アラート送信先として使用される S3 バケット
+ Slack 通知を送信するための実行ロールを持つ Lambda 関数
+ Slack URL を保存するための AWS Secrets Manager のシークレット
+ アラート設定付きのネットワークファイアウォール
+ Slack チャンネル

Slack チャネルを除くすべてのコンポーネントは、このパターンで提供される CloudFormation テンプレートと Lambda 関数によってプロビジョニングされます (「[コード](#send-alerts-from-aws-network-firewall-to-a-slack-channel-tools)」 セクションを参照)。

**ターゲットアーキテクチャ**

このパターンは、Slack 統合による分散型ネットワークファイアウォールを設定します。このアーキテクチャは 2 つのアベイラビリティーゾーンを持つ VPC で構成されています。VPC には、保護された 2 つのサブネットと、ネットワークファイアウォールのエンドポイントを持つ 2 つのファイアウォールサブネットがあります。保護対象サブネットに出入りするすべてのトラフィックは、「[ファイアウォールポリシー](https://docs.aws.amazon.com/waf/latest/developerguide/network-firewall-policies.html)」 とルールを作成することで監視できます。ネットワークファイアウォールは、すべてのアラートを S3 バケットに格納するように設定されています。この S3 バケットは、`put` イベントを受信したときに Lambda 関数を呼び出すように設定されています。Lambda 関数は、設定された Slack URL を Secrets Manager から取得し、通知メッセージを Slack ワークスペースに送信します。

![Slack 統合による分散型ネットワークファイアウォールのターゲットアーキテクチャ。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/7207fd56-094e-4af4-9ecd-75b122b82275/images/b1320776-c010-49b9-96bf-15e97ebe09ba.png)


このアーキテクチャの詳細については、AWS ブログ記事 「[AWS Network Firewall デプロイモデル](https://aws.amazon.com/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/)」 を参照してください。

## ツール
<a name="send-alerts-from-aws-network-firewall-to-a-slack-channel-tools"></a>

**AWS サービス**
+ [AWS Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/what-is-aws-network-firewall.html) は、ステートフルでマネージド型のネットワークファイアウォールならびに侵入検知および防止サービスです。Network Firewall を使用して、VPC の境界でトラフィックをフィルターして、 AWS でワークロードを保護します。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) は、認証情報を保存および取得するためのサービスです。Secrets Manager を使用して、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールに置き換えて、シークレットをプログラムで取得できます。このパターンでは、Secrets Manager を使用して Slack URL を保存します。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)は、オブジェクトストレージを提供します。Simple Storage Service (Amazon S3) を使用すると、いつでもウェブ上の任意の場所から任意の量のデータを保存および取得できます。このパターンでは、Amazon S3 を使用して CloudFormation テンプレートと Lambda 関数用の Python スクリプトを保存します。また、ネットワークファイアウォールのアラートの送信先として S3 バケットを使用します。
+ 「[AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)」は、AWS リソースのモデル化と設定、迅速かつ一貫したプロビジョニング、ライフサイクル全体にわたる管理を支援します。リソースを個別に管理する代わりに、テンプレートを使用してリソースとその依存関係を記述し、それらをスタックとしてまとめて起動して設定できます。このパターンでは、AWS CloudFormation を使用してFirewall Manager の分散アーキテクチャを自動的にデプロイします。

**コード**

このパターンのコードは、GitHub 内の「[Network Firewall Slack 統合](https://github.com/aws-samples/aws-network-firewall-automation-examples/tree/main/NfwSlackIntegration/src)」リポジトリで利用できます。`src ` リポジトリのフォルダには以下があります。
+ YAML 形式のCloudFormation ファイルのセット。これらのテンプレートを使用して、このパターンのコンポーネントをプロビジョニングします。
+ Lambda 関数を作成するための Python ソースファイル (`slack-lambda.py`)。
+ Lambda 関数コードをアップロードするための.zip アーカイブデプロイパッケージ (`slack-lambda.py.zip`)。

これらのファイルを使用するには、次のセクションの指示に従います。

## エピック
<a name="send-alerts-from-aws-network-firewall-to-a-slack-channel-epics"></a>

### S3 バケットのセットアップ
<a name="set-up-the-s3-bucket"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| S3 バケットを作成する。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/send-alerts-from-aws-network-firewall-to-a-slack-channel.html)詳細については、Amazon S3 ドキュメントの「[バケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)」 を参照してください。  | アプリ開発者、アプリ所有者、クラウド管理者 | 
| CloudFormation テンプレートと Lambda コードをアップロードします。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/send-alerts-from-aws-network-firewall-to-a-slack-channel.html) | アプリ開発者、アプリ所有者、クラウド管理者 | 

### CloudFormation テンプレートをデプロイ
<a name="deploy-the-cloudformation-template"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| CloudFormation のテンプレートを起動します。 | 同じAWS リージョンで S3 バケットとして「[AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)」 を開き、テンプレート `base.yml` をデプロイします。このテンプレートは、アラートを Slack チャネルに送信するために必要な AWS リソースと Lambda 関数を作成します。<br />CloudFormation テンプレートのデプロイに関する詳細については、CloudFormation ドキュメントの 「[AWS CloudFormation コンソールでのスタックの作成](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)」 を参照してください。 | アプリ開発者、アプリ所有者、クラウド管理者 | 
| テンプレートのパラメータを入力します。 | スタック名を指定し、パラメータ値を設定します。パラメータの一覧、説明、デフォルト値については、「[追加情報](#send-alerts-from-aws-network-firewall-to-a-slack-channel-additional)」セクションの *CloudFormation パラメータ*を参照してください。 | アプリ開発者、アプリ所有者、クラウド管理者 | 
| スタックを作成します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/send-alerts-from-aws-network-firewall-to-a-slack-channel.html) | アプリ開発者、アプリ所有者、クラウド管理者 | 

### ソリューションを検証する
<a name="verify-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| デプロイをテストします。 | AWS CloudFormation コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用して、「[ターゲットテクノロジースタック](#send-alerts-from-aws-network-firewall-to-a-slack-channel-architecture)」 セクションにリストされているリソースが作成されていることを確認します。 <br />CloudFormation テンプレートが正常にデプロイされない場合は、`pAvailabilityZone1 ` および `pAvailabilityZone2 ` パラメータに指定した値を確認してください。これらは、ソリューションをデプロイする AWS リージョンに適したものでなければなりません。各リージョンのアベイラビリティーゾーンのリストについては、Amazon EC2 ドキュメントの 「[リージョンとゾーン](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones)」 を参照してください。  | アプリ開発者、アプリ所有者、クラウド管理者 | 
| 機能をテストします。 | 1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。<br />2. 保護されたサブネットの 1 つに EC2 インスタンスを作成します。HTTPS サーバーとして使用する Amazon Linux 2 AMI (HVM) を選択します。手順については、Amazon EC2 ドキュメントの 「[インスタンスの起動](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-launch-instance)」 を参照してください。Amazon Linux 2 のサポートは間もなく終了します。詳細については、「[Amazon Linux 2 のよくある質問](https://aws.amazon.com/amazon-linux-2/faqs/)」を参照してください。<br />3. EC2 インスタンスにウェブサーバーをインストールするには、次のユーザーデータを使用します。<pre>#!/bin/bash<br />yum install httpd -y<br />systemctl start httpd<br />systemctl stop firewalld<br />cd /var/www/html<br />echo "Hello!! this is a NFW alert test page, 200 OK" > index.html</pre><br />4. 以下のネットワークファイアウォールルールを作成します。<br />ステートレスルール:<pre>Source: 0.0.0.0/0<br />Destination 10.0.3.65/32 (private IP of the EC2 instance)<br />Action: Forward </pre><br />ステートフルルール:<pre>Protocol: HTTP<br />Source ip/port: Any / Any<br />Destination ip/port: Any /Any</pre><br />5. ステップ 3 で作成した Web サーバーのパブリック IP を取得します。<br />6. ブラウザでパブリック IP にアクセスします。ブラウザで次のメッセージが表示されます。<pre>Hello!! this is a NFW alert test page, 200 OK </pre><br />Slack チャンネルにも通知が届きます。メッセージのサイズによっては、通知が遅れる場合があります。テスト目的で、狭すぎない CIDR フィルターを提供することを検討します (たとえば、/32 の CIDR 値は狭すぎ、/8 は広すぎると見なされます)。詳細については、「[追加情報](#send-alerts-from-aws-network-firewall-to-a-slack-channel-additional)」の「*フィルター動作*」セクションを参照してください。 | アプリ開発者、アプリ所有者、クラウド管理者 | 

## 関連リソース
<a name="send-alerts-from-aws-network-firewall-to-a-slack-channel-resources"></a>
+ 「[AWS Network Firewall デプロイモデル](https://aws.amazon.com/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/)」 (AWS ブログ記事)
+ 「[AWS Network Firewall ポリシー](https://docs.aws.amazon.com/waf/latest/developerguide/network-firewall-policies.html)」 (AWS ドキュメント)
+ 「[Network Firewall Slack インテグレーション](https://github.com/aws-samples/aws-network-firewall-automation-examples/tree/main/NfwSlackIntegration/src)」 (GitHub リポジトリ)
+ 「[Slack ワークスペースの作成](https://slack.com/help/articles/206845317-Create-a-Slack-workspace)」 (Slack ヘルプセンター)

## 追加情報
<a name="send-alerts-from-aws-network-firewall-to-a-slack-channel-additional"></a>

CloudFormation パラメーター


| 
| 
| パラメータ  | 説明  | デフォルト値またはサンプル値  | 
| --- |--- |--- |
| `pVpcName` | 作成する VPC の名前。 | インスペクション | 
| `pVpcCidr` | VPC が作成する CIDR 範囲。 | 10.0.0.0/16 | 
| `pVpcInstanceTenancy` | EC2 インスタンスが物理ハードウェアにわたって分散される方法。オプションは `default ` (共有テナンシー) または `dedicated ` (シングルテナンシー) です。 | デフォルト | 
| `pAvailabilityZone1` | インフラストラクチャーの最初のアベイラビリティーゾーン。  | us-east-2a  | 
| `pAvailabilityZone2` | インフラストラクチャの 2 つ目のアベイラビリティーゾーン。 | us-east-2b | 
| `pNetworkFirewallSubnet1Cidr` | 1 つ目のファイアウォールサブネットの CIDR 範囲 (最低 /28)。 | 10.0.1.0/24 | 
| `pNetworkFirewallSubnet2Cidr` | 2 番目のファイアウォールサブネットの CIDR 範囲 (最低 /28)。 | 10.0.2.0/24 | 
| `pProtectedSubnet1Cidr` | 最初に保護された (ワークロード) サブネットの CIDR 範囲。 | 10.0.3.0/24 | 
| `pProtectedSubnet2Cidr` | 2 番目の保護 (ワークロード) サブネットの CIDR 範囲。 | 10.0.4.0/24 | 
| `pS3BucketName` | Lambda ソースコードをアップロードした既存の S3 バケットの名前。 | us - w2 - あなたの名前 - Lambda 関数 | 
| `pS3KeyPrefix` | Lambda ソースコードをアップロードした S3 バケットのプリフィックス。 | AOD テスト  | 
| `pAWSSecretName4Slack` | Slack URL を保持するシークレットの名前。 | スラッケンポイント-CFN | 
| `pSlackChannelName` | 作成した Slack チャンネルの名前。 | 一部の名前通知 | 
| `pSlackUserName` | Slack ユーザー名。 | Slack ユーザー | 
| `pSecretKey` | どのキーでもかまいません。デフォルトを使用することをお勧めします。 | ウェブフック URL | 
| `pWebHookUrl` | スラック URL の値。 | https://hooks.slack.com/services/T???9T??/A031885JRM7/9D4Y????? | 
| `pAlertS3Bucket` | ネットワークファイアウォールのアラート送信先として使用する S3 バケットの名前。このバケットが作成されます。 | us - w2 - あなたの名前 - セキュリティ - aod - アラート | 
| `pSecretTagName` | シークレットのタグ名。 | AppName | 
| `pSecretTagValue` | 指定されたタグ名のタグ値。 | ラムダとスラックインテグレーション | 
| `pdestCidr` | デスティネーション CIDR 範囲のフィルター。詳細については、次のセクションの「*フィルター動作*」をご覧ください。 | 10.0.0.0/16 | 
| `pdestCondition` | デスティネーションマッチを除外するか含めるかを示すフラグ。詳細については、次のセクションをご覧ください。有効な値は、`include ` および `exclude` です。 | include | 
| `psrcCidr` | 警告するソース CIDR 範囲のフィルター。詳細については、次のセクションをご覧ください。  | 118.2.0.0/16 | 
| `psrcCondition` | ソースマッチを除外または含めるフラグ。詳細については、次のセクションをご覧ください。 | include | 

フィルター動作

AWS Lambda でフィルターを設定していない場合、生成されたすべてのアラートは Slack チャンネルに送信されます。生成されたアラートの送信元 IP と送信先 IP は、CloudFormation テンプレートをデプロイしたときに設定した CIDR 範囲と照合されます。一致が検出された場合、条件が適用されます。送信元または送信先のどちらかが設定された CIDR 範囲内にあり、そのうち 1 つでも `include` 条件が設定されている場合、アラートが生成されます。以下の表は、CIDR の値、条件、結果の例を示しています。


| 
| 
|  | CIDR  | アラート IP  | Configured  | アラート  | 
| --- |--- |--- |--- |--- |
| **ソース**  | 10.0.0.0/16  | 10.0.0.25  | include  | はい  | 
| **送信先**  | 100.0.0.0/16  | 202.0.0.13  | include  | 


| 
| 
|  | CIDR  | アラート IP  | Configured  | アラート  | 
| --- |--- |--- |--- |--- |
| **ソース**  | 10.0.0.0/16  | 10.0.0.25  | exclude  | 不可  | 
| **送信先**  | 100.0.0.0/16  | 202.0.0.13  | include  | 


| 
| 
|  | CIDR  | アラート IP  | Configured  | アラート  | 
| --- |--- |--- |--- |--- |
| **ソース**  | 10.0.0.0/16  | 10.0.0.25  | include  | はい  | 
| **送信先**  | 100.0.0.0/16  | 100.0.0.13  | include  | 


| 
| 
|  | CIDR  | アラート IP  | Configured  | アラート  | 
| --- |--- |--- |--- |--- |
| **ソース**  | 10.0.0.0/16  | 90.0.0.25  | include  | はい  | 
| **送信先**  | Null  | 202.0.0.13  | include  | 


| 
| 
|  | CIDR  | アラート IP  | Configured  | アラート  | 
| --- |--- |--- |--- |--- |
| **ソース**  | 10.0.0.0/16  | 90.0.0.25  | include  | 不可  | 
| **送信先**  | 100.0.0.0/16  | 202.0.0.13  | include  | 