نحوه پیکربندی پاسخ خودکار حادثه برای یافته های Amazon GuardDuty با Terraform

مقدمه

در این آموزش، نحوه پیکربندی راه حل امنیتی AWS با استفاده از Terraform را خواهید آموخت. شما از خدمات Amazon GuardDuty، Amazon SNS، AWS Lambda و Amazon EvenBridge استفاده خواهید کرد.

تشخیص تهدید و پاسخ به حادثه (TDIR) می تواند برای بسیاری از سازمان ها فرآیندی زمان بر و دستی باشد. این منجر به فرآیندهای پاسخ ناسازگار، نتایج امنیتی ناسازگار و افزایش ریسک می شود. در این آموزش، یاد خواهید گرفت که چگونه یافته های تشخیص تهدید را خودکار کنید و فرآیند پاسخ به حادثه خود را خودکار کنید و زمان پاسخگویی به تهدیدات را کاهش دهید. از آنجایی که بسیاری از سازمان‌ها ترجیح می‌دهند از ابزار استاندارد زیرساخت به‌عنوان کد (IaC) برای پیکربندی‌های ثابت در میان فروشندگان استفاده کنند، این آموزش نحوه پیکربندی این راه‌حل را با استفاده از Terraform نشان می‌دهد.

پیش نیازها
  • حساب AWS

درباره Amazon GuardDuty

قبل از اینکه وارد آموزش شویم، درک عملکرد اساسی برخی از ابزارهایی که استفاده خواهیم کرد مفید است. Amazon GuardDuty تشخیص تهدید را ارائه می دهد که به شما امکان می دهد به طور مداوم حساب های AWS، بارهای کاری و داده های ذخیره شده در سرویس ذخیره سازی ساده آمازون (S3) را نظارت و محافظت کنید. GuardDuty جریان‌های متادیتای پیوسته تولید شده از حساب و فعالیت شبکه شما را که در رویدادهای AWS CloudTrail، گزارش‌های جریان ابر خصوصی مجازی آمازون (VPC) و گزارش‌های سیستم نام دامنه (DNS) یافت می‌شود، تجزیه و تحلیل می‌کند. GuardDuty همچنین از هوش تهدید یکپارچه مانند آدرس های IP مخرب شناخته شده، تشخیص ناهنجاری و یادگیری ماشین (ML) برای شناسایی دقیق تر تهدیدها استفاده می کند.

GuardDuty کاملاً مستقل از منابع شما عمل می کند، بنابراین هیچ خطری برای تأثیر عملکرد یا در دسترس بودن بر حجم کاری شما وجود ندارد. این سرویس به طور کامل با اطلاعات یکپارچه تهدید، تشخیص ناهنجاری و ML مدیریت می شود. Amazon GuardDuty هشدارهای دقیق و کاربردی را ارائه می دهد که به راحتی با سیستم های مدیریت رویداد و گردش کار موجود ادغام می شوند. هیچ هزینه اولیه ای وجود ندارد و شما فقط برای رویدادهای تجزیه و تحلیل شده پرداخت می کنید، بدون نیاز به نرم افزار اضافی برای استقرار یا اشتراک فید اطلاعاتی تهدید.

درباره Terraform و Cloud9

Terraform یک ابزار Infrastructure-as-Code (IaC) است که توسط Hashicorp ایجاد شده است که به شما امکان می دهد زیرساخت را با فایل های پیکربندی به جای رابط کاربری مدیریت کنید. با Terraform می‌توانید زیرساخت‌های خود را با استفاده از فایل‌های پیکربندی خوانا و اعلامی بسازید، تغییر دهید و نابود کنید. بله، شما همچنین می توانید زیرساخت AWS را با استفاده از Terraform بسازید، تغییر دهید و از بین ببرید – با استفاده از یک پلاگین Terraform به نام Provider. ارائه دهنده AWS به Terraform اجازه می دهد تا با رابط برنامه نویسی برنامه AWS (API) تعامل داشته باشد.

این آموزش از AWS Cloud9 برای انجام پیکربندی Terraform استفاده می کند. AWS Cloud9 یک محیط توسعه یکپارچه مبتنی بر ابر (IDE) است که به شما امکان می دهد کد خود را فقط با یک مرورگر بنویسید، اجرا کنید و اشکال زدایی کنید. این شامل یک ویرایشگر کد، دیباگر و ترمینال است. Cloud9 با ابزارهای ضروری برای زبان های برنامه نویسی محبوب از جمله جاوا اسکریپت، پایتون، PHP و Terraform از پیش بسته بندی شده است، بنابراین برای راه اندازی این کارگاه نیازی به نصب فایل ها یا پیکربندی دستگاه توسعه خود ندارید. Cloud9 بر روی یک نمونه EC2 اجرا می شود که هنگام شروع این کارگاه برای شما ایجاد شده است.

آنچه شما انجام خواهید داد

  1. یک میزبان “مخاطب” با یک میزبان “در خطر” تعامل می کند و باعث می شود GuardDuty یک یافته را گزارش کند.
  2. این یافته در یک قانون EventBridge که با استفاده از Terraform ایجاد خواهید کرد، مطابقت داده می شود. قانون EventBridge دو کار زیر را انجام می دهد:
  3. یک قانون SNS را ایجاد می کند که با استفاده از Terraform ایجاد خواهید کرد. این قانون SNS یک ایمیل به یک مدیر تعریف شده با متنی خوانا ارسال می کند که یافته ها را توضیح می دهد.
  4. یک تابع Lambda را فعال می کند که با استفاده از Terraform ایجاد خواهید کرد. تابع Lambda میزبان در معرض خطر را به یک گروه امنیتی پزشکی قانونی منتقل می کند که در آنجا برای بررسی بیشتر جدا می شود.

مرحله 1. تنظیمات اولیه را بارگیری کنید

این آموزش از یک الگوی AWS CloudFormation برای تهیه منابع اولیه استفاده می کند. این کار به این دلیل انجام می شود که بتوانید فقط بر روی پیکربندی زمینی راه حل امنیتی خود تمرکز کنید. الگوی CloudFormation یک پشته ایجاد می کند. پشته از یک نمونه AWS Cloud9 IDE تشکیل شده است. ما از این نمونه Cloud9 استفاده می کنیم تا همه کسانی که این آموزش را اجرا می کنند تجربه ویرایش و پیاده سازی یکسانی داشته باشند. علاوه بر این، هنگامی که پشته را در US-WEST-2 پیاده سازی می کنید، مطمئن می شوید که یک نمونه t3.small وجود دارد. اگر الگو در مناطق دیگر مستقر است، ممکن است لازم باشد الگو را تغییر دهید تا از نوع نمونه دیگری استفاده کنید اگر t3.small در دسترس نیست.

1.1. به AWS CloudFormation در کنسول مدیریت AWS بروید و با کلیک بر روی دکمه ایجاد پشته یک پشته ایجاد کنید.

1.2. آپلود فایل الگو را انتخاب کنید و فایل gd-iac-initial.yml را از مخزن کد نمونه ارائه شده در بالا آپلود کنید. سپس روی Next کلیک کنید.

1.3. یک نام پشته وارد کنید و روی Next کلیک کنید.

1.4. در صفحه Configure stack options روی Next کلیک کنید.

1.5. در صفحه بررسی، به پایین بروید و روی کادر تأیید کلیک کنید تا تأیید کنید که AWS CloudFormation ممکن است منابع IAM ایجاد کند، سپس روی Next کلیک کنید.

1.6. مراقب باشید که پشته در حالت ایجاد کامل باشد.


در این مرحله شما منابع اولیه ای را که برای دنبال کردن این آموزش استفاده خواهید کرد به تنهایی مستقر کرده اید. در مرحله بعد به نمونه Cloud9 که پشته ایجاد کرده دسترسی خواهید داشت و Terraform را مقداردهی اولیه می کنید.

مرحله 2. به Cloud9 دسترسی پیدا کرده و Terraform را راه اندازی کنید

2.1. AWS Cloud9 را در کنسول مدیریت AWS باز کنید و محیط را در 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 اعمال کنید.


یک درخواست موفق شبیه موارد زیر خواهد بود:


2.5. بررسی کنید که دو نمونه جدید EC2 وجود دارد، یکی با نام IAC Tutorial: Compromised Instance و دیگری با نام IAC Tutorial: Malicious Instance.


در این مرحله، شما یک VPC و دو نمونه EC2 را مستقر کرده اید. دو نمونه EC2 با یکدیگر صحبت می‌کنند و بعداً وقتی یکی از نمونه‌های EC2 Elastic آدرس IP را به لیست تهدید اضافه می‌کنید، باعث می‌شود GuardDuty یک یافته را ایجاد کند. از این مرحله به بعد، شما هر یک از منابعی را که بخشی از راه حل امنیتی واقعی هستند ایجاد خواهید کرد.

مرحله 3: یک سطل S3 برای ذخیره لیست تهدید ایجاد کنید

GuardDuty می تواند به دو نوع لیست اشاره کند: یک لیست IP مورد اعتماد و یک لیست IP تهدید. 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. سپس VPC Flow log ها را در سطل S3 فعال کنید. این مورد نیاز نیست، اما به ما امکان می دهد گزارش هایی را که 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
}

در این مرحله شما دو سطل S3 ایجاد کرده اید. اگر می‌خواهید خودتان آنها را بررسی کنید، یک سطل برای گزارش‌های جریان VPC است. سطل دیگر حاوی لیست تهدیداتی است که در مرحله بعد ایجاد خواهید کرد.

مرحله 4: ماژول های GuardDuty Terraform را ایجاد کنید

4.1. فایل های GuardDuty Module برای شما ساخته شده اند، اما مانند فایل های S3 خالی هستند. با فایل modules/guardduty/variables.tf شروع کنید. در اینجا باید دو متغیر ایجاد کنید. اولی متغیری به نام bucket است که از آن برای تعریف جزئیات لیست تهدید سطل S3 استفاده می کنیم. دومی مربوط به IP مخربی است که به سطل اضافه کرده ایم.
variable "bucket" {
}
variable "malicious_ip" {
}
4.2. سپس به فایل modules/guardduty/main.tf بروید.

در این فایل شما سه منبع را اضافه خواهید کرد. اولین منبع آشکارساز GuardDuty است. شما در اسناد ارائه دهنده یادداشت خواهید کرد که گزینه ها همه اختیاری هستند – هیچ چیز دیگری جز اعلام منبع مورد نیاز نیست. با این حال، مقدار فعال شده را در مثال خود روی true قرار می دهیم و همچنین finding_publishing_frequency را به 15 دقیقه تغییر می دهیم. پیش فرض یک ساعت است.

# ENABLE THE DETECTOR
resource "aws_guardduty_detector" "gd-tutorial" {
enable = true
finding_publishing_frequency = "FIFTEEN_MINUTES"
}
4.3. در مرحله بعد فایلی را در سطل S3 که در مرحله قبل ایجاد کردیم آپلود می کنیم. این مورد نیاز نیست، اما برای اهداف نمایشی می‌خواهیم از آدرس IP یکی از نمونه‌های EC2 استفاده کنیم تا اطمینان حاصل کنیم که یافته‌ها در این آموزش ایجاد می‌شوند. در کد زیر ما یک فایل متنی را در سطل S3 خود آپلود می کنیم که آن را MyThreatIntelSet می نامیم و محتوای فایل آدرس IP موجود در متغیر var.malicious_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 را فراخوانی کنید. باید شناسه سطل و IP مخرب را ارائه کنیم. می بینید که اینها از ماژول S3 و ماژول محاسباتی می آیند.
# Enable GuardDuty
module "guardduty" {
source = "./modules/guardduty"
bucket = module.s3_bucket.bucket_id
malicious_ip = module.compute.malicious_ip
}

در این بخش، GuardDuty را فعال کردید، لیست تهدید را ایجاد کردید و آدرس IP Elastic نمونه مخرب EC2 را به آن لیست اضافه کردید. در مرحله بعد، ما یک قانون SNS ایجاد می کنیم.

مرحله 5: ماژول SNS Terraform را ایجاد کنید

در این بخش از Terraform برای ایجاد یک قانون SNS استفاده می کنیم. SNS سرویس اعلان ساده است و به شما امکان می دهد در صورت رعایت معیارهای خاص، اعلان ارسال کنید. خود SNS با اقدامی برای ارسال پیام مطابقت ندارد. ما از EventBridge برای آن استفاده خواهیم کرد. با این حال، از آنجایی که EventBridge برای ارسال اعلان‌ها به یک قانون نیاز دارد، ابتدا باید قانون SNS را ایجاد کنیم.

5.1. در ابتدا در فایل modules/sns/variables.tf، باید دو متغیر ایجاد کنید:
  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. سپس موضوع SNS و اشتراک را در فایل modules/sns/main.tf ایجاد می کنیم.

با ایجاد یک منبع موضوع شروع کنید.

# 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 است. این سند خط مشی به سرویس principal 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 = "youremailaddress@domain.com"
}

در این بخش شما موضوعات SNS را ایجاد کردید تا در صورت تولید یک یافته خاص، ایمیلی برای شما ارسال شود.

مرحله 6: ماژول EventBridge Terraform را ایجاد کنید

در این بخش از Terraform برای ایجاد یک قانون EventBridge استفاده خواهید کرد. قانون EventBridge دو عنصر این راه حل را به هم گره می زند.

EventBridge چگونه کار می کند؟ اساسا، EventBridge یک رویداد – نشانگر تغییر در محیط – را دریافت می کند و یک قانون را برای مسیریابی رویداد به یک هدف اعمال می کند. قوانین بر اساس ساختار رویداد، که الگوی رویداد نامیده می شود، یا بر اساس یک برنامه، رویدادها را با اهداف مطابقت می دهند. در این مورد، GuardDuty یک رویداد برای Amazon EventBridge ایجاد می کند که هر تغییری در یافته ها رخ دهد. رویداد مطابقت دارد و آمازون EventBridge به یک هدف حکم می‌کند. در این مورد، هدف قانون anSNS است. قانون 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، منطقه و شناسه نمونه EC2 را دریافت می کنیم – و در حال ایجاد یک الگوی ورودی هستیم که کمی در مورد پیام توضیح می دهد. در زیر می بینید که ما یک الگوی ورودی ایجاد کرده ایم که از اطلاعات جزئیات موجود در یافته 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. در اولین قانون Event که ایجاد کردیم، به دنبال رویداد GuardDuty-Event-EC2-MaliciousIPCaller هستیم. یک قانون رویداد دوم ایجاد کنید تا به دنبال یافتن 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
}

در این بخش یک قانون EventBridge ایجاد کردید که از موضوع SNS که ایجاد کرده‌اید برای ارسال ایمیل در صورت تطبیق یافته‌های GuardDuty استفاده می‌کند. در بخش بعدی این عملکرد را با استفاده از Lambda افزایش خواهید داد.

مرحله 7: ماژول Lambda Terraform را ایجاد کنید

در این بخش ما از Terraform برای ایجاد یک تابع Lambda استفاده می کنیم که یک تابع اصلاح را برای محیط ما انجام می دهد. کاری که ما می خواهیم با این آموزش انجام دهیم این است که میزبان در معرض خطر ما به یک گروه امنیتی جدید منتقل شود. مشابه روشی که EventBridge از SNS برای تولید ایمیل استفاده کرد، EventBridge تابع Lambda را در بر خواهد گرفت.

نکته ای که باید در نظر داشت این است که بسیاری از رویکردهای ممکن در اینجا وجود دارد. برای اطلاعات بیشتر، لطفاً به مستندات مربوط به ایجاد پاسخ‌های سفارشی به یافته‌های GuardDuty با رویدادهای Amazon CloudWatch و مسدود کردن خودکار ترافیک مشکوک با فایروال شبکه AWS و Amazon GuardDuty مراجعه کنید.

قبل از شروع، بیایید ببینیم چه اتفاقی باید بیفتد تا این کار انجام شود.

در حال حاضر، یافته‌های GuardDuty ما در یک قانون EventBridge با یک هدف تطبیق داده شده است – در حال حاضر یک قانون SNS که یک ایمیل ارسال می‌کند. برای ارتقای این قابلیت، EventBridge از AWS Lambda به عنوان هدف استفاده می کند.

از آنجایی که ما قصد داریم از طرف خود AWS Lambda به منابع دیگری دسترسی داشته باشیم، باید یک نقش IAM ایجاد کنیم تا مجوزها را به سرویس واگذار کنیم. این نقش یک سرویس نامیده می شود و AWS Lambda زمانی که گروه امنیتی نمونه EC2 ما را تغییر می دهد، این نقش را بر عهده می گیرد.

تصویر زیر نشان می‌دهد که چگونه سه بلوک کد اول با هم قرار می‌گیرند تا به سرویس AWS Lambda اجازه دهند نقشی را بر عهده بگیرند که می‌تواند تغییراتی در گروه‌های امنیتی اختصاص داده شده به نمونه‌های EC2 ایجاد کند.


7.1. با ایجاد سند سیاست IAM در modules/lambda/main.tf شروع کنید. این رابطه اعتماد برای سیاست است.
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. و اکنون نقش IAM را ایجاد کنید که AWS Lambda آن را بر عهده خواهد گرفت.
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 زیپ کرده ایم، ارجاع می دهیم. و در آخر ما چند متغیر محیطی را در منبع تنظیم می کنیم: 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، شناسه نمونه در معرض خطر و گروه Forensic Security را تنظیم کنید. توجه داشته باشید که این مقادیر از ماژول GuardDuty، ماژول محاسبه و ماژول 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. برای دسترسی به گروه امنیتی-قانونی، باید آن را خروجی بگیریم. در فایل root/outputs.tf و خروجی شناسه گروه امنیت.
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. اکنون باید قانون EventBridge را تنظیم کنیم تا داده های یافته را به Lambda ارسال کنیم. در بخش بعدی این کار را انجام خواهیم داد. به فایل modules/eventbridge/main.tf برگردید. یک منبع هدف رویداد برای تابع Lambda اضافه کنید که به قانون aws_cloudwatch_event_rule.GuardDuty-Event-EC2-MaliciousIPCaller.name نگاه می کند و شناسه هدف را روی GuardDuty-Example-Remediation تنظیم می کند. در اینجا به 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. اگر قبلاً این کار را نکرده اید، خروجی را به ماژول لامبدا (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. و در نهایت lambda_remediation_function_arn را به فایل root/main.tf اضافه کنید. این در قانون 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 ایجاد کردید که یک میزبان در معرض خطر را در یک گروه امنیتی متفاوت جدا می کند. این تابع لامبدا زمانی توسط EventBridge فراخوانی می شود که یک یافته GuardDuty با قانون EventBridge مطابقت داده شود. در بخش بعدی کل تنظیمات را اعمال خواهید کرد.

مرحله 8: تنظیمات را در حساب AWS خود اعمال کنید

8.1. یک init terraform را اجرا کنید. با این کار تمام ماژول هایی که در این آموزش کد اضافه کرده اید مقداردهی اولیه می شود. خروجی باید شبیه موارد زیر باشد.

8.2. یک پلان زمینی انجام دهید.
8.3. برای اعمال تغییرات به AWS، یک terraform application انجام دهید. پس از اعمال، خروجی شما باید شبیه موارد زیر باشد:


در این بخش پیکربندی Terraform را در حساب AWS خود اعمال کردید. در این مرحله شما دو نمونه EC2 دارید که با یکدیگر در ارتباط هستند. One مخرب است و آدرس IP آن به لیست IP تهدید ما اضافه شده است. هنگامی که GuardDuty می بیند که این IP با نمونه در معرض خطر ما صحبت می کند، یافته ای را ایجاد می کند. ما یک قانون EventBridge داریم که با آن یافته مطابقت دارد و دو کار را انجام می دهد: اول، یک ایمیل برای ما ارسال می کند که به ما اطلاع می دهد که چه اتفاقی افتاده است، و دوم، تابع Lambda را فراخوانی می کند تا گروه امنیتی میزبان در معرض خطر را تغییر دهد. در بخش بعدی، پیکربندی را در کنسول AWS خود تأیید خواهیم کرد.

مرحله 9: راه حل را در کنسول مدیریت AWS تأیید کنید

در این بخش، کل راه‌حل موجود در کنسول AWS را بررسی می‌کنیم و بررسی می‌کنیم که وقتی یافته‌ها در GuardDuty ظاهر شد و EventBridge عملکرد Lambda را فعال کرد، گروه امنیتی منتقل شده است.

همچنین باید یک ایمیل برای تایید اشتراک خود دریافت کرده باشید. به یاد داشته باشید که برای دریافت اعلان هایی که پیکربندی کرده اید باید مشترک شوید.


پس از اشتراک، به کنسول مدیریت AWS بروید تا بررسی کنید که دو نمونه EC2 وجود دارد و هر دو در گروه امنیت اولیه هستند.

ابتدا هاست در معرض خطر را بررسی کنید.


سپس هاست مخرب را بررسی کنید.


سپس اطمینان حاصل کنید که GuardDuty یافته‌ها را گزارش می‌کند.


اکنون بررسی کنید که قانون EventBridge به دنبال آن یافته است.


سپس هدف قانون EventBridge را بررسی کنید. شما باید یک هدف SNS و یک هدف Lambda را ببینید.


قانون SNS را بررسی کنید تا ببینید چه کاری انجام می دهد. باید به آدرسی که تعیین کرده اید ایمیل بفرستید.


سپس عملکرد Lambda را بررسی کنید. می توانید از قانون EventBridge یا با پیمایش مستقیم به آنجا بروید.


در نهایت بررسی کنید که تابع Lambda میزبان در معرض خطر را به یک گروه امنیتی جدید منتقل کرده است.


بسته به مدت زمانی که منتظر بوده اید، اگر پیکربندی شما با اسکرین شات های بالا مطابقت داشته باشد، یک راه حل امنیتی کامل AWS را با استفاده از Terraform با موفقیت ایجاد کرده اید.

[تعداد: 1   میانگین: 5/5]
دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شاید دوست داشته باشید