Amazon GuardDuty の検出結果に対する自動インシデント対応を Terraform で設定する方法

0 株式
0
0
0
0

導入

このチュートリアルでは、Terraform を使用して AWS セキュリティソリューションを構成する方法を学習します。Amazon GuardDuty、Amazon SNS、AWS Lambda、Amazon EvenBridge の各サービスを使用します。.

多くの組織にとって、脅威検出とインシデント対応(TDIR)は、時間のかかる手作業のプロセスになりがちです。これは、対応プロセスの一貫性のなさ、セキュリティ成果の一貫性のなさ、そしてリスクの増大につながります。このチュートリアルでは、脅威検出の結果を自動化し、インシデント対応プロセスを自動化することで、脅威への対応時間を短縮する方法を学びます。多くの組織は、ベンダー間で一貫した構成を実現するために、標準的なインフラストラクチャ・アズ・コード(IaC)ツールの使用を好んでいるため、このチュートリアルでは、Terraformを使用してこのソリューションを構成する方法を説明します。.

前提条件
  • AWSアカウント

Amazon GuardDutyについて

チュートリアルに進む前に、使用するツールの基本的な機能について理解しておくと役立ちます。Amazon GuardDuty は、AWS アカウント、ワークロード、Amazon Simple Storage Service (S3) に保存されているデータを継続的に監視および保護できる脅威検出機能を提供します。GuardDuty は、AWS CloudTrail イベント、Amazon Virtual Private Cloud (VPC) フローログ、ドメインネームシステム (DNS) ログに含まれるアカウントおよびネットワークアクティビティから生成される継続的なメタデータストリームを分析します。GuardDuty は、既知の悪意のある IP アドレス、異常検出、機械学習 (ML) などの統合された脅威インテリジェンスを使用して、脅威をより正確に特定します。.

GuardDuty はお客様のリソースから完全に独立して動作するため、ワークロードのパフォーマンスや可用性に影響を及ぼすリスクはありません。このサービスは、脅威インテリジェンス、異常検出、機械学習を統合したフルマネージドサービスです。Amazon GuardDuty は、既存のイベント管理システムやワークフローに容易に統合でき、正確で実用的なアラートを提供します。初期費用は不要で、分析したイベントに対してのみ料金が発生します。追加のソフトウェアの導入や脅威インテリジェンスフィードのサブスクリプションは必要ありません。.

TerraformとCloud9について

Terraformは、Hashicorpが開発したInfrastructure-as-Code(IaC)ツールです。ユーザーインターフェースではなく設定ファイルでインフラストラクチャを管理できます。Terraformを使えば、人間が読める宣言型の設定ファイルを使って、インフラストラクチャを構築、変更、破棄できます。もちろん、Terraformプラグイン「Provider」を使えば、AWSインフラストラクチャもTerraformで構築、変更、破棄できます。AWS Providerは、TerraformがAWSアプリケーションプログラミングインターフェース(API)と連携できるようにします。.

このチュートリアルでは、AWS Cloud9 を使用して Terraform の設定を行います。AWS Cloud9 は、ブラウザだけでコードの作成、実行、デバッグができるクラウドベースの統合開発環境 (IDE) です。コードエディタ、デバッガ、ターミナルも含まれています。Cloud9 には、JavaScript、Python、PHP、Terraform など、一般的なプログラミング言語に必要なツールがあらかじめパッケージ化されているため、このワークショップを始めるためにファイルをインストールしたり、開発マシンを設定したりする必要はありません。Cloud9 は、ワークショップ開始時に自動的に作成される EC2 インスタンス上で実行されます。.

何をするか

  1. 「コンタクト」ホストが「危険」ホストと対話し、GuardDuty が検出結果を報告します。.
  2. この検出結果は、Terraform を使用して作成する EventBridge ルールに一致します。EventBridge ルールは次の 2 つの処理を行います。
  3. Terraform を使用して作成する SNS ルールを作成します。この SNS ルールは、定義済みの管理者に、検出結果を説明する判読可能なテキストを含むメールを送信します。.
  4. これは、Terraform を使用して作成する Lambda 関数をトリガーします。Lambda 関数は、侵害されたホストをフォレンジックセキュリティグループに渡し、そこで隔離してさらなる調査を行います。.

ステップ1. 初期設定をダウンロードする

このチュートリアルでは、AWS CloudFormation テンプレートを使用して初期リソースをプロビジョニングします。これにより、セキュリティソリューションの基本設定に集中できます。CloudFormation テンプレートはスタックを作成します。スタックは AWS Cloud9 IDE インスタンスで構成されます。この Cloud9 インスタンスを使用することで、このチュートリアルを実行するすべてのユーザーが同じ編集およびデプロイエクスペリエンスを得られるようになります。また、US-WEST-2 にスタックをデプロイする際は、t3.small インスタンスが存在することを確認してください。テンプレートを他のリージョンにデプロイする場合、t3.small が利用できないときは、別のインスタンスタイプを使用するようにテンプレートを修正する必要があるかもしれません。.

1.1. AWS マネジメントコンソールの AWS CloudFormation に移動し、[スタックの作成] ボタンをクリックしてスタックを作成します。.

1.2. 「テンプレートファイルのアップロード」を選択し、上記のサンプルコードリポジトリからgd-iac-initial.ymlファイルをアップロードします。「次へ」をクリックします。.

1.3. スタック名を入力し、「次へ」をクリックします。.

1.4. 「スタック オプションの構成」ページで、「次へ」をクリックします。.

1.5. 確認ページで下にスクロールし、チェックボックスをクリックして AWS CloudFormation が IAM リソースを作成できることを確認し、「次へ」をクリックします。.

1.6. スタックが完全に作成された状態であることを確認します。.


この時点で、このチュートリアルを独自に進めるために使用する初期リソースがデプロイされました。次のステップでは、スタックを作成したCloud9インスタンスにアクセスし、Terraformを初期化します。.

ステップ2. Cloud9にアクセスしてTerraformを起動する

2.1. AWS マネジメントコンソールで AWS Cloud9 を開き、Cloud9 IDE で環境を開きます。.
https://community.aws/_next/image?url=https%3A%2F%2Fcommunity.aws%2Fraw-post-images%2Ftutorials%2Fusing-terraform-to-configure-automated-guardduty-findings%2Fimages%2F0007.png&w=750&q=75
2.2. Cloud9 の設定で、AWS 管理の一時認証情報の使用を無効にします。.

2.3. Cloud9 インスタンスのターミナルから、ソースコード リポジトリをシミュレートします。.
git clone https://github.com/build-on-aws/automating-amazon-guardduty-with-iac.git
2.4. automating-amazon-guardduty-with-iac ディレクトリに移動し、terraform init、terraform plan、terraform apply を実行します。.


成功したリクエストは次のようになります。


2.5. 「IAC チュートリアル: 侵害されたインスタンス」と「IAC チュートリアル: 悪意のあるインスタンス」という名前の 2 つの新しい EC2 インスタンスがあることを確認します。.


この時点で、VPCと2つのEC2インスタンスがデプロイされています。2つのEC2インスタンスは相互に通信し、後ほどEC2 Elasticインスタンスの1つからIPアドレスを脅威リストに追加すると、GuardDutyがトリガーされ、検出結果が作成されます。ここからは、実際のセキュリティソリューションを構成する各リソースを作成していきます。.

ステップ3: 脅威リストを保存するためのS3バケットを作成する

GuardDutyは、信頼できるIPリストと脅威IPリストの2種類のリストを参照できます。GuardDutyは、信頼できるIPリストに含まれるIPアドレスについては検出結果を作成しませんが、脅威IPリストに含まれるIPアドレスについては検出結果を作成します。このチュートリアルでは検出結果を強制的に生成したいため、脅威IPリストを使用します。.

3.1. まず、modules/s3/variables.tf に vpc_id の変数を作成します。.
variable "vpc_id" {
}
3.2. 次に、modules/s3/main.tf ファイルで、現在の AWS アカウント番号を取得し、S3 バケットリソースを作成します。.
# GET CURRENT AWS ACCOUNT NUMBER
data "aws_caller_identity" "current" {}
# CREATE TWO S3 BUCKETS
resource "aws_s3_bucket" "bucket" {
bucket = "guardduty-example-${data.aws_caller_identity.current.account_id}-us-east-1"
force_destroy = true
}
resource "aws_s3_bucket" "flow-log-bucket" {
bucket = "vpc-flow-logs-${data.aws_caller_identity.current.account_id}-us-east-1"
force_destroy = true
}
3.3. 次に、S3バケットでVPCフローログを有効にします。これは必須ではありませんが、GuardDutyが記録するログを確認できるようになります。.
# VPC FLOW LOGS
resource "aws_flow_log" "flow_log_example" {
log_destination = aws_s3_bucket.flow-log-bucket.arn
log_destination_type = "s3"
traffic_type = "ALL"
vpc_id = var.vpc_id
}
3.4. 最後に、bucket_idとbucket_arnの値をmodules/s3/outputs.tfファイルに出力します。.
# S3 Bucket id
output "bucket_id" {
value = aws_s3_bucket.bucket.id
description = "Output of s3 bucket id."
}
# S3 Bucket arn
output "bucket_arn" {
value = aws_s3_bucket.bucket.arn
description = "Output of s3 bucket arn."
}
3.5. 次に、root/main.tf ファイルに戻り、S3 バケットを追加します。.
# CREATES S3 BUCKET
module "s3_bucket" {
source = "./modules/s3"
vpc_id = module.iac_vpc.vpc_attributes.id
}

この時点で、2つのS3バケットが作成されました。ご自身で確認したい場合は、1つのバケットはVPCフローログ用です。もう1つのバケットには、次のステップで作成する脅威リストが含まれています。.

ステップ4: GuardDuty Terraformモジュールを作成する

4.1. GuardDutyモジュールファイルは既に作成されていますが、S3ファイルと同様に空です。modules/guardduty/variables.tfファイルから始めましょう。ここで2つの変数を作成する必要があります。1つ目はbucketという変数で、S3バケットの脅威リストの詳細を定義するために使用します。2つ目は、バケットに追加した悪意のあるIPアドレスです。.
variable "bucket" {
}
variable "malicious_ip" {
}
4.2. 次に、ファイル modules/guardduty/main.tf に移動します。.

このファイルでは、3つのソースを追加します。最初のソースはGuardDuty検出器です。プロバイダーのドキュメントに記載されているように、これらのオプションはすべてオプションであり、ソースを宣言する以外は何も必須ではありません。ただし、この例ではenabledの値をtrueに設定し、finding_publishing_frequentlyを15分に変更します。デフォルトは1時間です。.

# ENABLE THE DETECTOR
resource "aws_guardduty_detector" "gd-tutorial" {
enable = true
finding_publishing_frequency = "FIFTEEN_MINUTES"
}
4.3. 次に、前の手順で作成したS3バケットにファイルをアップロードします。これは必須ではありませんが、デモの目的で、このチュートリアルの検出結果が生成されるように、EC2インスタンスの1つのIPアドレスを使用します。以下のコードでは、MyThreatIntelSetというテキストファイルをS3バケットにアップロードします。ファイルの内容は、変数var.malicious_ipに含まれるIPアドレスになります。.
# ADD THE EIP/MALICIOUS IP TO THE BUCKET AS A TEXT FILE.
resource "aws_s3_object" "MyThreatIntelSet" {
content = var.malicious_ip
bucket = var.bucket
key = "MyThreatIntelSet"
}
4.4. 最後に、aws_guardduty_threatintelset というリソースを作成します。これは、GuardDuty に定義された場所にあるファイルを使用するように指示します (これは activate = true によって実行されます)。.
# HAVE GUARDDUTY LOOK AT THE TEXT FILE IN S3
resource "aws_guardduty_threatintelset" "Example-Threat-List" {
activate = true
detector_id = aws_guardduty_detector.gd-tutorial.id
format = "TXT"
location = "https://s3.amazonaws.com/${aws_s3_object.MyThreatIntelSet.bucket}/${aws_s3_object.MyThreatIntelSet.key}"
name = "MyThreatIntelSet"
}
4.5. 次に、root/main.tf ファイルに移動し、GuardDuty モジュールを呼び出します。バケット ID と悪意のある IP アドレスを指定する必要があります。これらは S3 モジュールとコンピューティングモジュールから取得されていることがわかります。.
# Enable GuardDuty
module "guardduty" {
source = "./modules/guardduty"
bucket = module.s3_bucket.bucket_id
malicious_ip = module.compute.malicious_ip
}

このセクションでは、GuardDuty を有効化し、脅威リストを作成し、悪意のある EC2 インスタンスの Elastic IP アドレスをリストに追加しました。次に、SNS ルールを作成します。.

ステップ5: SNS Terraformモジュールを作成する

このセクションでは、Terraformを使用してSNSルールを作成します。SNSは、特定の条件が満たされたときに通知を送信できるシンプルな通知サービスです。SNS自体は、メッセージを送信するアクションには対応していません。そこで、EventBridgeを使用します。ただし、EventBridgeは通知を送信するためのルールを必要とするため、まずSNSルールを作成する必要があります。.

5.1. まず、modules/sns/variables.tf ファイルで、2 つの変数を作成する必要があります。
  1. sns_name は、作成する SNS トピックに名前を付けます。.
  2. 通知を購読するために使用する電子メール アドレスを保持する電子メール。.

以下は SNS の変数の例です。.

variable "sns_name" {
description = "Name of the SNS Topic to be created"
default = "GuardDuty-Example"
}
variable "email" {
description = "Email address for SNS"
}
5.2. 次に、modules/sns/main.tf ファイルに SNS トピックとサブスクリプションを作成します。.

まずトピック リソースを作成します。.

# Create the SNS topic
resource "aws_sns_topic" "gd_sns_topic" {
name = var.sns_name
}

上記のコードでは、Terraform によって gd_sns_topic というリソースを作成しています。AWS コンソールでは、このリソースは「GuardDuty-Example」という名前で表示されます。これは、変数 var.sns_name を呼び出しており、そのデフォルト設定が「GuardDuty-Example」であるためです。.

5.3. 次に、SNSポリシーリソースを作成します。arnとPolicyの値は必須です。ここで作成するポリシーは、AWS IAMポリシードキュメントです。このポリシードキュメントにより、サービスプリンシパル events.amazonaws.com が対象のトピックにパブリッシュできるようになります。.
resource "aws_sns_topic_policy" "gd_sns_topic_policy" {
arn = aws_sns_topic.gd_sns_topic.arn
policy = jsonencode(
{
Id = "ID-GD-Topic-Policy"
Statement = [
{
Action = "sns:Publish"
Effect = "Allow"
Principal = {
Service = "events.amazonaws.com"
}
Resource = aws_sns_topic.gd_sns_topic.arn
Sid = "SID-GD-Example"
},
]
Version = "2012-10-17"
}
)
}
5.4. 次に、トピックサブスクリプションを作成します。トピックサブスクリプションはARNを呼び出し、使用するプロトコル(この場合はメール)と通知の送信先メールアドレスを設定します。メールアドレスはハードコードされていますが、Terraformの適用時にメールアドレスの入力を求めるように設定できます。また、endpoint_auto_confirmをfalseに設定すると、メールの所有者は通知をサブスクライブするためのリンクが記載されたメールを受け取ります。.
# Create the topic subscription 
resource "aws_sns_topic_subscription" "user_updates_sqs_target" {
topic_arn = aws_sns_topic.gd_sns_topic.arn
protocol = "email"
endpoint = var.email
endpoint_auto_confirms = false
}
5.5. 次に、modules/sns/outputs.tf ファイルでトピック ARN を出力し、後で行う EventBridge 設定で参照できるようにします。.
output "sns_topic_arn" {
value = aws_sns_topic.gd_sns_topic.arn
description = "Output of ARN to call in the eventbridge rule."
}
5.6. 最後に、root/main.tf ファイルに戻り、SNS トピックを追加します。ここで、サブスクリプション用のメールアドレスを指定します。.
# Creates an SNS Topic
module "guardduty_sns_topic" {
source = "./modules/sns"
email = "[email protected]"
}

このセクションでは、特定の検出結果が生成された場合に電子メールが送信されるように SNS トピックを作成しました。.

ステップ6: EventBridge Terraformモジュールを作成する

このセクションでは、Terraform を使用して EventBridge ルールを作成します。EventBridge ルールは、このソリューションの 2 つの要素を結び付けます。.

EventBridge はどのように機能するのでしょうか?基本的に、EventBridge はイベント(環境の変化を示す指標)を受け取り、そのイベントをターゲットにルーティングするためのルールを適用します。ルールは、イベントの構造(イベントパターンと呼ばれる)またはスケジュールに基づいて、イベントをターゲットにマッチングします。今回のケースでは、GuardDuty は検出結果に変化が生じるたびに Amazon EventBridge にイベントを生成します。イベントがマッチングされると、Amazon EventBridge はルールをターゲットにルーティングします。今回のケースでは、ルールのターゲットは SNS です。SNS ルールは検出されたデータを受け取り、サブスクライバーにメール通知を送信します。.

6.1. EventBridge ルールには、GuardDuty と SNS に関する情報が必要です。まず、SNS サブジェクト ARN に使用できる変数を作成します。これは modules/eventbridge/variables.tf ファイルで行います。.
variable "sns_topic_arn" {
}
6.2. 次に、modules/eventbridge/main.tf ファイルにイベントルールソースを作成します。必要なイベントのソースとタイプを定義する必要があります。.
 # EVENT RULE RESOURCE
resource "aws_cloudwatch_event_rule" "GuardDuty-Event-EC2-MaliciousIPCaller" {
name = "GuardDuty-Event-EC2-MaliciousIPCaller"
description = "GuardDuty Event: UnauthorizedAccess:EC2/MaliciousIPCaller.Custom"
event_pattern = <<EOF
{
"source": ["aws.guardduty"],
"detail": {
"type": ["UnauthorizedAccess:EC2/MaliciousIPCaller.Custom"]
}
}
EOF
}
6.3. 次に、イベントターゲットソースを定義します。このソースを作成する際に、入力トランスフォーマーを定義することで、メール通知の読みやすさを向上させることができます。これにより、EventBridgeがイベントターゲットに送信する内容をカスタマイズできます。以下では、GuardDuty ID、リージョン、EC2インスタンスIDを取得し、メッセージについて簡単に説明する入力テンプレートを作成しています。以下では、送信されたメールメッセージ内のGuardDutyの検出結果の詳細情報を使用する入力テンプレートを作成したことがわかります。.
# EVENT TARGET RESOURCE FOR SNS NOTIFICATIONS
resource "aws_cloudwatch_event_target" "sns" {
rule = aws_cloudwatch_event_rule.GuardDuty-Event-EC2-MaliciousIPCaller.name
target_id = "GuardDuty-Example"
arn = var.sns_topic_arn
input_transformer {
input_paths = {
gdid = "$.detail.id",
region = "$.detail.region",
instanceid = "$.detail.resource.instanceDetails.instanceId"
}
input_template = "\"First GuardDuty Finding for the GuardDuty-IAC tutorial. | ID:<gdid> | The EC2 instance: <instanceid>, may be compromised and should be investigated. Go to https://console.aws.amazon.com/guardduty/home?region=<region>#/findings?macros=current&fId=<gdid>\""
}
}
6.4. 最初に作成したイベントルールでは、GuardDuty-Event-EC2-MaliciousIPCaller イベントを検索します。2つ目のイベントルールでは、GuardDuty-Event-IAMUser-MaliciousIPCaller を検索し、このイベントについてもメール通知を送信します。.
# EVENT RULE RESOURCE
resource "aws_cloudwatch_event_rule" "GuardDuty-Event-IAMUser-MaliciousIPCaller" {
name = "GuardDuty-Event-IAMUser-MaliciousIPCaller"
description = "GuardDuty Event: UnauthorizedAccess:IAMUser/MaliciousIPCaller.Custom"
event_pattern = <<EOF
{
"source": ["aws.guardduty"],
"detail": {
"type": ["UnauthorizedAccess:IAMUser/MaliciousIPCaller.Custom", "Discovery:S3/MaliciousIPCaller.Custom"]
}
}
EOF
}
#EVENT TARGET RESOURCE FOR SNS NOTIFICATIONS
resource "aws_cloudwatch_event_target" "iam-sns" {
rule = aws_cloudwatch_event_rule.GuardDuty-Event-IAMUser-MaliciousIPCaller.name
target_id = "GuardDuty-Example"
arn = var.sns_topic_arn
input_transformer {
input_paths = {
gdid = "$.detail.id",
region = "$.detail.region",
userName = "$.detail.resource.accessKeyDetails.userName"
} 
input_template = "\"Second GuardDuty Finding for the GuardDuty-IAC tutorial. | ID:<gdid> | AWS Region:<region>. An AWS API operation was invoked (userName: <userName>) from an IP address that is included on your threat list and should be investigated.Go to https://console.aws.amazon.com/guardduty/home?region=<region>#/findings?macros=current&fId=<gdid>\""
}
}
6.5. モジュールにリソースを作成したら、root/main.tf ファイルに戻り、EventBridge ルールを追加します。.
# Create the EventBridge rule
module "guardduty_eventbridge_rule" {
source = "./modules/eventbridge"
sns_topic_arn = module.guardduty_sns_topic.sns_topic_arn
}

このセクションでは、作成したSNSトピックを使用して、GuardDutyの検出結果が一致したときにメールを送信するEventBridgeルールを作成しました。次のセクションでは、Lambdaを使用してこの機能を拡張します。.

ステップ7: Lambda Terraformモジュールを作成する

このセクションでは、Terraform を使用して、環境の修復機能を実行する Lambda 関数を作成します。このチュートリアルでは、侵害を受けたホストを新しいセキュリティグループに移動します。EventBridge が SNS を使用してメールを生成したのと同様に、EventBridge は Lambda 関数をカプセル化します。.

ここで留意すべき点は、様々なアプローチが考えられるということです。詳細については、「Amazon CloudWatch Events を使用して GuardDuty の検出結果に対するカスタムレスポンスを作成する」および「AWS Network Firewall と Amazon GuardDuty を使用して疑わしいトラフィックを自動的にブロックする」に関するドキュメントをご覧ください。.

始める前に、これを実現するために何が必要かを見てみましょう。.

現在、GuardDuty の検出結果は、ターゲット(メールを送信する SNS ルール)を持つ EventBridge ルールにマッチングされます。この機能を強化するため、EventBridge は AWS Lambda をターゲットとして使用します。.

AWS Lambda 自体の代わりに他のリソースにアクセスする予定なので、サービスに権限を付与する IAM ロールを作成する必要があります。このロールはサービスと呼ばれ、EC2 インスタンスのセキュリティグループを変更すると、AWS Lambda はこのロールを引き継ぎます。.

以下の画像は、最初の 3 つのコード ブロックがどのように組み合わされて、AWS Lambda サービスが EC2 インスタンスに割り当てられたセキュリティ グループに変更を加えることができるロールを引き受けることができるかを示しています。.


7.1. まず、modules/lambda/main.tf に IAM ポリシードキュメントを作成します。これはポリシーの信頼関係です。.
data "aws_iam_policy_document" "GD-EC2MaliciousIPCaller-policy-document" {
statement {
effect = "Allow"
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["lambda.amazonaws.com"]
}
}
}
7.2. 次に、AWS Lambda が引き受けるロールに適用するインラインポリシーを作成します。.
resource "aws_iam_role_policy" "GD-EC2MaliciousIPCaller-inline-role-policy" {
name = "GD-EC2MaliciousIPCaller-inline-role-policy"
role = aws_iam_role.GD-Lambda-EC2MaliciousIPCaller-role.id
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Action" : [
"ssm:PutParameter",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateSecurityGroup",
"ec2:DescribeSecurityGroups",
"ec2:RevokeSecurityGroupEgress",
"ec2:RevokeSecurityGroupIngress",
"ec2:UpdateSecurityGroupRuleDescriptionsEgress",
"ec2:UpdateSecurityGroupRuleDescriptionsIngress",
"ec2:DescribeInstances",
"ec2:UpdateSecurityGroupRuleDescriptionsIngress",
"ec2:DescribeVpcs",
"ec2:ModifyInstanceAttribute",
"lambda:InvokeFunction",
"cloudwatch:PutMetricData",
"xray:PutTraceSegments",
"xray:PutTelemetryRecords"
],
"Resource" : "*",
"Effect" : "Allow"
},
{
"Action" : [
"logs:*"
],
"Resource" : "arn:aws:logs:*:*:*",
"Effect" : "Allow"
},
{
"Action" : [
"sns:Publish"
],
"Resource" : var.sns_topic_arn,
"Effect" : "Allow"
} 
]
})
}
7.3. 次に、AWS Lambda が引き受ける IAM ロールを作成します。.
resource "aws_iam_role" "GD-Lambda-EC2MaliciousIPCaller-role" {
name = "GD-Lambda-EC2MaliciousIPCaller-role1"
assume_role_policy = data.aws_iam_policy_document.GD-EC2MaliciousIPCaller-policy-document.json
}
7.4. コードを指すデータ ソースを作成します。.
data "archive_file" "python_lambda_package" {
type = "zip"
source_file = "${path.module}/code/index.py"
output_path = "index.zip"
}
7.5. 次に、EventBridgeにLambdaへのアクセスを許可する必要があります。.
resource "aws_lambda_permission" "GuardDuty-Hands-On-RemediationLambda" {
statement_id = "GuardDutyTerraformRemediationLambdaEC2InvokePermissions"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.GuardDuty-Example-Remediation-EC2MaliciousIPCaller.function_name
principal = "events.amazonaws.com"
}

上記のブロックにより、EventBridge は Lambda 関数を呼び出すことができます。.

7.6. 最後に、Lambda関数のソースを作成します。そのためには、情報を渡すための変数をいくつか作成する必要があります。modules/lambda/variables.tfファイルを編集し、以下の変数を追加してください。
variable "sns_topic_arn" {
}
variable "compromised_instance_id" {
}
variable "forensic_sg_id" {
}
7.7. 次に、modules/lambda/main.tf ファイルに戻り、Lambda 関数のソースを作成します。以下のコードブロックでは Python 3.9 を使用していることに注意してください。また、index.zip に圧縮した Python コードも参照しています。最後に、ソースに環境変数 INSTANCE_ID、FORENSICS_SG、TOPIC_ARN を設定します。これらの変数は、作成した変数から Lambda 関数の環境に渡されます。.
# Create the Lambda function Resource
resource "aws_lambda_function" "GuardDuty-Example-Remediation-EC2MaliciousIPCaller" {
function_name = "GuardDuty-Example-Remediation-EC2MaliciousIPCaller"
filename = "index.zip"
source_code_hash = data.archive_file.python_lambda_package.output_base64sha256
role = aws_iam_role.GD-Lambda-EC2MaliciousIPCaller-role.arn
runtime = "python3.9"
handler = "index.handler"
timeout = 10
environment {
variables = {
INSTANCE_ID = var.compromised_instance_id
FORENSICS_SG = var.forensic_sg_id
TOPIC_ARN = var.sns_topic_arn
}
}
}
7.8. root/main.tf ファイルで、Lambda モジュールを呼び出し、SNS サブジェクト ARN、侵害を受けたインスタンス ID、およびフォレンジックセキュリティグループを設定します。これらの値は、GuardDuty モジュール、Compute モジュール、および VPC モジュールから取得されることに注意してください。.
# CREATE THE LAMBDA FUNCTION
module "lambda" {
source = "./modules/lambda"
sns_topic_arn = module.guardduty_sns_topic.sns_topic_arn
compromised_instance_id = module.compute.compromised_instance_id
forensic_sg_id = module.forensic-security-group.security_group_id
}
7.9. 法的セキュリティグループがまだ作成されていません。使用するセキュリティグループを追加してください。.
# CREATES THE FORENSICS_SG SECURITY GROUP
module "forensic-security-group" {
source = "terraform-aws-modules/security-group/aws"
version = "4.17.1"
name = "FORENSIC_SG"
description = "Forensic Security group "
vpc_id = module.iac_vpc.vpc_attributes.id
}
7.10. security-legal グループにアクセスするには、root/outputs.tf ファイルにセキュリティグループIDを出力します。.
output "forensic_sg_id" {
value = module.forensic-security-group.security_group_id
description = "Output of forensic sg id created - to place the EC2 instance(s)."
}
7.11. 次に、検出されたデータをLambdaに送信するようにEventBridgeルールを設定する必要があります。これは次のセクションで行います。modules/eventbridge/main.tfファイルに戻ります。aws_cloudwatch_event_rule.GuardDuty-Event-EC2-MaliciousIPCaller.nameルールを参照するLambda関数のイベントターゲットソースを追加し、ターゲットIDをGuardDuty-Example-Remediationに設定します。ここで、Lambda関数のARNが必要になります。これはLambdaモジュールから出力できます。.
#EVENT TARGET RESOURCE FOR LAMBDA REMEDIATION FUNCTION
resource "aws_cloudwatch_event_target" "lambda_function" {
rule = aws_cloudwatch_event_rule.GuardDuty-Event-EC2-MaliciousIPCaller.name
target_id = "GuardDuty-Example-Remediation"
arn = var.lambda_remediation_function_arn
}
7.12. まだ行っていない場合は、出力を Lambda モジュール (modules/lambda/outputs.tf) に追加します。.
output "lambda_remediation_function_arn" {
value = aws_lambda_function.GuardDuty-Example-Remediation-EC2MaliciousIPCaller.arn
}
7.13. この変数はEventBridgeモジュール(modules/eventbridge/variables.tf)にも適用する必要があります。.
variable "lambda_remediation_function_arn" {
}
7.14. 最後に、root/main.tf ファイルに lambda_remediation_function_arn を追加します。これは、先ほど作成した EventBridge ルールに組み込みます。以下の出力はコードブロック全体であり、一部は既に存在します。既存のブロックには、必ず lambda_remediation_function_arn = module.lambda.lambda_remediation_function_arn というコードのみを追加してください。.
module "guardduty_eventbridge_rule" {
source = "./modules/eventbridge"
sns_topic_arn = module.guardduty_sns_topic.sns_topic_arn
lambda_remediation_function_arn = module.lambda.lambda_remediation_function_arn
}

このセクションでは、リスクのあるホストを別のセキュリティグループに隔離するLambda関数を作成しました。このLambda関数は、GuardDutyの検出結果がEventBridgeのルールに一致した場合にEventBridgeによって呼び出されます。次のセクションでは、設定全体を適用します。.

ステップ8: AWSアカウントに設定を適用する

8.1. terraform init を実行します。これにより、このコードチュートリアルで追加したすべてのモジュールが初期化されます。出力は次のようになります。.

8.2. フロアプランを作成します。.
8.3. AWSに変更を適用するには、Terraformアプリケーションを実行します。適用後、出力は次のようになります。


このセクションでは、Terraform 設定を AWS アカウントに適用しました。この時点で、2 つの EC2 インスタンスが相互に通信しています。1 つは悪意のある IP アドレスで、その IP アドレスは脅威 IP リストに追加されています。GuardDuty は、この IP アドレスが侵害されたインスタンスと通信していることを検出すると、検出結果を生成します。この検出結果に一致する EventBridge ルールは、2 つの処理を実行します。1 つ目は、発生した事象を通知するメールを送信すること、2 つ目は、侵害されたホストのセキュリティグループを変更する Lambda 関数を呼び出すことです。次のセクションでは、AWS コンソールで設定を確認します。.

ステップ9: AWSマネジメントコンソールでソリューションを確認する

このセクションでは、AWS コンソールでソリューション全体を確認し、GuardDuty に結果が表示され、EventBridge が Lambda 関数をトリガーしたときにセキュリティグループが移行されていることを確認します。.

登録確認メールも届いているはずです。設定した通知を受け取るには、必ず登録してください。.


サブスクライブ後、AWS マネジメントコンソールに移動し、2 つの EC2 インスタンスがあり、両方がプライマリセキュリティグループに含まれていることを確認します。.

まず、侵害されたホストを確認します。.


次に、悪意のあるホストがないか確認します。.


次に、GuardDuty が調査結果を報告していることを確認します。.


次に、EventBridge ルールが見つけたものを確認します。.


次に、EventBridgeルールのターゲットを確認します。SNSターゲットとLambdaターゲットが表示されます。.


SNSルールを確認して、どのような動作をするのか確認してください。指定したアドレスにメールが送信されるはずです。.


次に、Lambda 関数を確認します。EventBridge ルールから、または直接移動してアクセスできます。.


最後に、Lambda 関数によって侵害されたホストが新しいセキュリティ グループに移動されたことを確認します。.


待機時間の長さにもよりますが、設定が上記のスクリーンショットと一致する場合は、Terraform を使用して完全な AWS セキュリティソリューションを正常に作成しました。.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

あなたも気に入るかもしれない