Как настроить автоматическое реагирование на инциденты с помощью Amazon GuardDuty с помощью Terraform

0 Акции
0
0
0
0

Введение

В этом руководстве вы узнаете, как настроить решение безопасности AWS с помощью Terraform. Вы будете использовать сервисы 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-адреса, обнаружение аномалий и машинное обучение (МО), для более точного выявления угроз.

GuardDuty работает полностью независимо от ваших ресурсов, поэтому нет риска снижения производительности или доступности ваших рабочих нагрузок. Сервис полностью управляется с помощью интегрированной аналитики угроз, обнаружения аномалий и машинного обучения. Amazon GuardDuty предоставляет точные и эффективные оповещения, которые легко интегрируются с существующими системами управления событиями и рабочими процессами. Авансовые платежи отсутствуют, вы платите только за проанализированные события, не требуя развертывания дополнительного программного обеспечения или подписки на каналы аналитики угроз.

О Terraform и Cloud9

Terraform — это инструмент инфраструктуры как кода (IaC), созданный компанией Hashicorp, который позволяет управлять инфраструктурой с помощью файлов конфигурации вместо пользовательского интерфейса. Terraform позволяет создавать, изменять и удалять инфраструктуру, используя понятные человеку декларативные файлы конфигурации. Да, вы также можете создавать, изменять и удалять инфраструктуру AWS с помощью Terraform, используя плагин Terraform под названием Provider. AWS Provider позволяет Terraform взаимодействовать с API AWS.

В этом руководстве для настройки Terraform используется AWS Cloud9. AWS Cloud9 — это облачная интегрированная среда разработки (IDE), которая позволяет писать, запускать и отлаживать код, используя всего лишь браузер. Она включает в себя редактор кода, отладчик и терминал. Cloud9 поставляется с необходимыми инструментами для популярных языков программирования, включая JavaScript, Python, PHP и Terraform, поэтому вам не нужно устанавливать какие-либо файлы или настраивать компьютер для разработки, чтобы начать работу с этим семинаром. Cloud9 работает на экземпляре EC2, который будет создан для вас при запуске этого семинара.

Что ты будешь делать?

  1. “Контактный” хост взаимодействует с “рискованным” хостом, в результате чего GuardDuty сообщает о находке.
  2. Этот результат соответствует правилу EventBridge, которое вы создадите с помощью Terraform. Правило EventBridge выполняет две функции:
  3. Создаёт правило SNS, которое вы создадите с помощью Terraform. Это правило SNS отправляет электронное письмо указанному администратору с понятным текстом, поясняющим результаты.
  4. Он запускает лямбда-функцию, которую вы создадите с помощью Terraform. Лямбда-функция передаёт скомпрометированный хост в группу криминалистической безопасности, где он изолируется для дальнейшего исследования.

Шаг 1. Загрузите начальные настройки.

В этом руководстве для подготовки начальных ресурсов используется шаблон AWS CloudFormation. Это позволяет вам сосредоточиться только на базовой настройке вашего решения безопасности. Шаблон CloudFormation создает стек. Стек состоит из экземпляра IDE AWS Cloud9. Мы используем этот экземпляр Cloud9, чтобы все участники этого руководства имели одинаковый опыт редактирования и развертывания. Кроме того, при развертывании стека в регионе US-WEST-2 необходимо убедиться, что существует экземпляр t3.small. Если шаблон развернут в других регионах, вам может потребоваться изменить его, чтобы использовать другой тип экземпляра, если t3.small недоступен.

1.1. Перейдите в AWS CloudFormation в консоли управления AWS и создайте стек, нажав кнопку «Создать стек».

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 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 apply.


Успешный запрос будет выглядеть следующим образом:


2.5. Убедитесь, что существуют два новых экземпляра EC2: один с именем IAC Tutorial: Compromised Instance, а другой с именем IAC Tutorial: Malicious Instance.


На этом этапе вы развернули VPC и два экземпляра EC2. Два экземпляра EC2 взаимодействуют друг с другом, и позднее, когда вы добавляете IP-адрес одного из экземпляров EC2 Elastic в список угроз, 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 в контейнере 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 созданы автоматически, но они пустые, как и файлы S3. Начните с файла modules/guardduty/variables.tf. Здесь вам нужно создать две переменные. Первая — это переменная bucket, которую мы будем использовать для определения деталей списка угроз в контейнере S3. Вторая — это вредоносный IP-адрес, который мы добавили в контейнер.
variable "bucket" {
}
variable "malicious_ip" {
}
4.2. Затем перейдите в файл modules/guardduty/main.tf.

В этом файле вы добавите три источника. Первый источник — детектор GuardDuty. В документации поставщика вы увидите, что все параметры необязательны — не требуется ничего, кроме объявления источника. Однако в нашем примере мы установим значение enabled на true, а также изменим значение found_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, создали список угроз и добавили в него Elastic IP-адрес вредоносного экземпляра EC2. Далее мы создадим правило SNS.

Шаг 5: Создайте модуль SNS Terraform

В этом разделе мы создадим правило SNS с помощью Terraform. 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
}

В приведённом выше коде вы создаёте ресурс gd_sns_topic от Terraform. В консоли 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]"
}

В этом разделе вы создали темы в социальных сетях, чтобы при обнаружении определенного результата вам отправлялось электронное письмо.

Шаг 6: Создайте модуль EventBridge Terraform

В этом разделе вы создадите правило EventBridge с помощью Terraform. Правило EventBridge связывает два элемента этого решения.

Как работает EventBridge? По сути, EventBridge получает событие — индикатор изменения в среде — и применяет правило для перенаправления события к целевому объекту. Правила сопоставляют события с целевыми объектами на основе структуры события, называемой шаблоном событий, или на основе расписания. В этом случае GuardDuty генерирует событие в Amazon EventBridge при каждом изменении данных. Событие сопоставляется, и Amazon EventBridge перенаправляет правило к целевому объекту. В данном случае целью правила является SNS. Правило SNS берёт найденные данные и генерирует уведомление по электронной почте подписчику.

6.1. Правило EventBridge требует информации о GuardDuty и SNS. Начните с создания переменной, которую можно использовать для ARN субъекта SNS. Это можно сделать в файле 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. В первом созданном нами правиле события мы ищем событие 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, которая выполняет функцию восстановления нашей среды. В этом руководстве мы хотим переместить наш скомпрометированный хост в новую группу безопасности. Подобно тому, как EventBridge использовал социальные сети для генерации электронных писем, EventBridge инкапсулирует лямбда-функцию.

Важно помнить, что существует множество возможных подходов. Подробнее см. в документации по созданию специальных ответов на результаты 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. Наконец, создаём исходный код лямбда-функции. Для этого нам нужно создать несколько переменных, которые позволят передавать информацию. Отредактируйте файл modules/lambda/variables.tf, добавив следующие переменные:
variable "sns_topic_arn" {
}
variable "compromised_instance_id" {
}
variable "forensic_sg_id" {
}
7.7. Затем вернитесь к файлу modules/lambda/main.tf и создайте исходный код лямбда-функции. Обратите внимание, что в следующем блоке кода мы используем Python 3.9. Мы также ссылаемся на код Python, заархивированный в index.zip. И наконец, мы задаём несколько переменных окружения в исходном коде: INSTANCE_ID, FORENSICS_SG и TOPIC_ARN. Они будут переданы из созданных нами переменных в окружение лямбда-функции.
# 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, укажите ARN субъекта SNS, идентификатор скомпрометированного экземпляра и группу Forensic Security. Обратите внимание, что эти значения берутся из модулей 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 и вывести идентификатор группы безопасности.
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. Его можно получить из модуля 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. И наконец, добавьте 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
}

В этом разделе вы создали лямбда-функцию, которая изолирует хост, подверженный риску, помещая его в другую группу безопасности. Эта лямбда-функция вызывается EventBridge, когда обнаружение GuardDuty совпадает с правилом EventBridge. В следующем разделе вы примените всю конфигурацию.

Шаг 8: Примените настройки к своей учетной записи AWS.

8.1. Запустите команду terraform init. Это инициализирует все модули, добавленные в этом руководстве. Результат должен выглядеть примерно так:.

8.2. Составьте план этажа.
8.3. Чтобы применить изменения к AWS, запустите приложение Terraform. После применения ваши результаты должны выглядеть следующим образом:


В этом разделе вы применили конфигурацию Terraform к своей учётной записи AWS. На данном этапе у вас есть два экземпляра EC2, взаимодействующих друг с другом. Один из них вредоносный, и его IP-адрес был добавлен в наш список IP-адресов угроз. Когда GuardDuty обнаруживает, что этот IP-адрес взаимодействует с нашим скомпрометированным экземпляром, он создаёт обнаружение. У нас есть правило EventBridge, которое соответствует этому обнаружению и выполняет две функции: во-первых, отправляет нам электронное письмо с информацией о произошедшем, а во-вторых, вызывает лямбда-функцию для изменения группы безопасности скомпрометированного хоста. В следующем разделе мы проверим конфигурацию в консоли AWS.

Шаг 9: Проверьте решение в консоли управления AWS

В этом разделе мы рассмотрим все решение в консоли AWS и убедимся, что группа безопасности была перенесена, когда результаты появляются в GuardDuty, а EventBridge запускает функцию Lambda.

Вы также должны были получить электронное письмо с подтверждением подписки. Помните, что для получения настроенных уведомлений необходимо оформить подписку.


После подписки перейдите в консоль управления AWS, чтобы убедиться, что есть два экземпляра EC2 и оба находятся в основной группе безопасности.

Сначала проверьте наличие скомпрометированных хостов.


Затем проверьте наличие вредоносных хостов.


Затем убедитесь, что GuardDuty сообщает о результатах проверки.


Теперь проверьте, что обнаружило правило EventBridge.


Затем проверьте целевой объект правила EventBridge. Вы должны увидеть целевой объект SNS и целевой объект Lambda.


Проверьте правило SNS, чтобы узнать, что оно делает. Оно должно отправить электронное письмо на указанный вами адрес.


Затем проверьте лямбда-функцию. Вы можете перейти туда из правила EventBridge или напрямую.


Наконец, убедитесь, что функция Lambda переместила скомпрометированный хост в новую группу безопасности.


Если ваша конфигурация соответствует представленным выше снимкам экрана, то, в зависимости от продолжительности ожидания, вы успешно создали комплексное решение по безопасности AWS с использованием Terraform.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может понравиться