Terraform ile Amazon GuardDuty bulguları için otomatik olay yanıtı nasıl yapılandırılır?

0 Hisse senetleri
0
0
0
0

giriiş

Bu eğitimde, Terraform kullanarak bir AWS güvenlik çözümünün nasıl yapılandırılacağını öğreneceksiniz. Amazon GuardDuty, Amazon SNS, AWS Lambda ve Amazon EvenBridge hizmetlerini kullanacaksınız.

Tehdit Algılama ve Olay Müdahalesi (TDIR), birçok kuruluş için zaman alıcı ve manuel bir süreç olabilir. Bu durum, tutarsız müdahale süreçlerine, tutarsız güvenlik sonuçlarına ve artan riske yol açar. Bu eğitimde, tehdit tespit bulgularını ve olay müdahale sürecinizi otomatikleştirerek tehdit müdahale süresini nasıl azaltacağınızı öğreneceksiniz. Birçok kuruluş, tedarikçiler arasında tutarlı yapılandırmalar için standart kod olarak altyapı (IaC) araçlarını kullanmayı tercih ettiğinden, bu eğitim, bu çözümün Terraform kullanılarak nasıl yapılandırılacağını göstermektedir.

Ön koşullar
  • AWS hesabı

Amazon GuardDuty Hakkında

Eğitime başlamadan önce, kullanacağımız bazı araçların temel işlevlerini anlamak faydalı olacaktır. Amazon GuardDuty, AWS hesaplarını, iş yüklerini ve Amazon Simple Storage Service'da (S3) depolanan verileri sürekli olarak izlemenize ve korumanıza olanak tanıyan tehdit algılama özelliği sunar. GuardDuty, hesabınızdan oluşturulan sürekli meta veri akışlarını ve AWS CloudTrail olaylarında, Amazon Virtual Private Cloud (VPC) akış günlüklerinde ve Alan Adı Sistemi (DNS) günlüklerinde bulunan ağ etkinliğini analiz eder. GuardDuty ayrıca, tehditleri daha doğru bir şekilde tespit etmek için bilinen kötü amaçlı IP adresleri, anormallik tespiti ve makine öğrenimi (ML) gibi entegre tehdit istihbaratını kullanır.

GuardDuty, kaynaklarınızdan tamamen bağımsız çalışır, bu nedenle iş yükleriniz üzerinde performans veya kullanılabilirlik açısından herhangi bir etki riski yoktur. Hizmet, entegre tehdit istihbaratı, anormallik tespiti ve makine öğrenimi (ML) ile tamamen yönetilir. Amazon GuardDuty, mevcut olay yönetim sistemleri ve iş akışlarıyla kolayca entegre olan doğru ve eyleme geçirilebilir uyarılar sunar. Ön maliyet yoktur ve yalnızca analiz edilen olaylar için ödeme yaparsınız; ek bir yazılım dağıtımı veya tehdit istihbaratı akışı abonelikleri gerekmez.

Terraform ve Cloud9 Hakkında

Terraform, Hashicorp tarafından geliştirilen ve altyapınızı kullanıcı arayüzü yerine yapılandırma dosyalarıyla yönetmenize olanak tanıyan bir Altyapı Kod (IaC) aracıdır. Terraform ile altyapınızı, insanlar tarafından okunabilir, bildirimsel yapılandırma dosyaları kullanarak oluşturabilir, değiştirebilir ve yok edebilirsiniz. Evet, Terraform'u kullanarak AWS altyapısını da oluşturabilir, değiştirebilir ve yok edebilirsiniz; bu da Sağlayıcı adlı bir Terraform eklentisidir. AWS Sağlayıcısı, Terraform'un AWS Uygulama Programlama Arayüzü (API) ile etkileşim kurmasını sağlar.

Bu eğitimde Terraform yapılandırması için AWS Cloud9 kullanılmaktadır. AWS Cloud9, yalnızca bir tarayıcı kullanarak kodunuzu yazmanıza, çalıştırmanıza ve hata ayıklamanıza olanak tanıyan bulut tabanlı bir entegre geliştirme ortamıdır (IDE). Bir kod düzenleyici, hata ayıklayıcı ve terminal içerir. Cloud9, JavaScript, Python, PHP ve Terraform gibi popüler programlama dilleri için temel araçlarla önceden paketlenmiş olarak gelir, bu nedenle bu atölyeye başlamak için herhangi bir dosya yüklemeniz veya geliştirme makinenizi yapılandırmanız gerekmez. Cloud9, bu atölyeye başladığınızda sizin için oluşturulan bir EC2 örneğinde çalışır.

Ne yapacaksın?

  1. Bir "temas" sunucusu, "risk altındaki" bir sunucuyla etkileşime girer ve GuardDuty'nin bir bulgu bildirmesine neden olur.
  2. Bu bulgu, Terraform kullanarak oluşturacağınız bir EventBridge kuralında da yer almaktadır. EventBridge kuralı iki işlevi yerine getirir:
  3. Terraform kullanarak oluşturacağınız bir SNS kuralı oluşturur. Bu SNS kuralı, bulguları açıklayan, insan tarafından okunabilir bir metin içeren bir e-postayı tanımlı bir yöneticiye gönderir.
  4. Terraform kullanarak oluşturacağınız bir Lambda işlevini tetikler. Lambda işlevi, ele geçirilen ana bilgisayarı, daha ayrıntılı inceleme için izole edildiği bir adli güvenlik grubuna iletir.

Adım 1. İlk ayarları indirin

Bu eğitimde, ilk kaynakları sağlamak için bir AWS CloudFormation şablonu kullanılmaktadır. Bu, güvenlik çözümünüzün yalnızca temel yapılandırmasına odaklanabilmeniz için yapılır. CloudFormation şablonu bir yığın oluşturur. Yığın, bir AWS Cloud9 IDE örneğinden oluşur. Bu Cloud9 örneğini, bu eğitimi çalıştıran herkesin aynı düzenleme ve dağıtım deneyimine sahip olması için kullanıyoruz. Ayrıca, yığını US-WEST-2'ye dağıttığınızda, bir t3.small örneğinin mevcut olduğundan emin olursunuz. Şablon başka bölgelere dağıtılmışsa ve t3.small mevcut değilse, şablonu farklı bir örnek türü kullanacak şekilde değiştirmeniz gerekebilir.

1.1. AWS Yönetim Konsolu'nda AWS CloudFormation'a gidin ve Yığın Oluştur düğmesine tıklayarak bir yığın oluşturun.

1.2. Şablon Dosyasını Yükle'yi seçin ve yukarıda verilen örnek kod deposundan gd-iac-initial.yml dosyasını yükleyin. Ardından İleri'ye tıklayın.

1.3. Bir yığın adı girin ve İleri'ye tıklayın.

1.4. Yığın seçeneklerini yapılandır sayfasında İleri'ye tıklayın.

1.5. İnceleme sayfasında aşağı kaydırın ve AWS CloudFormation'ın IAM kaynakları oluşturabileceğini onaylamak için onay kutusunu tıklayın, ardından İleri'ye tıklayın.

1.6. Yığının tamamen oluşturulmuş durumda olduğundan emin olun.


Bu noktada, bu eğitimi kendi başınıza takip etmek için kullanacağınız ilk kaynakları dağıtmış oldunuz. Bir sonraki adımda, yığını oluşturan Cloud9 örneğine erişecek ve Terraform'u başlatacaksınız.

Adım 2. Cloud9'a erişin ve Terraform'u başlatın

2.1. AWS Yönetim Konsolu'nda AWS Cloud9'u açın ve ortamı Cloud9 IDE'de açın.
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 tercihlerinde AWS tarafından yönetilen geçici kimlik bilgilerinin kullanımını devre dışı bırakın.

2.3. Cloud9 örneğindeki terminalden kaynak kod deposunu simüle edin.
git clone https://github.com/build-on-aws/automating-amazon-guardduty-with-iac.git
2.4. automating-amazon-guardduty-with-iac dizinine geçin ve terraform init, terraform plan ve terraform apply komutlarını çalıştırın.


Başarılı bir istek aşağıdaki gibi görünecektir:


2.5. İki yeni EC2 örneği olduğunu doğrulayın, biri IAC Eğitimi: Tehlikeye Atılmış Örnek, diğeri ise IAC Eğitimi: Kötü Amaçlı Örnek olarak adlandırıldı.


Bu noktada, bir VPC ve iki EC2 örneği dağıtmış olursunuz. İki EC2 örneği birbirleriyle iletişim kurar ve daha sonra EC2 Elastic örneklerinden birinden tehdit listesine bir IP adresi eklediğinizde, GuardDuty bir bulgu oluşturması için tetiklenir. Bu noktadan itibaren, gerçek güvenlik çözümünün parçası olan kaynakların her birini oluşturacaksınız.

Adım 3: Tehdit listesini depolamak için bir S3 kovası oluşturun

GuardDuty iki tür listeye atıfta bulunabilir: güvenilir IP listesi ve tehdit IP listesi. GuardDuty, güvenilir IP listelerinde yer alan IP adresleri için bulgu oluşturmaz, ancak tehdit IP listelerinde yer alan IP adresleri için bulgu oluşturur. Bu eğitimde bir bulguyu zorunlu kılmak istediğimiz için bir tehdit IP listesi kullanacağız.

3.1. Öncelikle modules/s3/variables.tf dosyasında vpc_id için bir değişken oluşturun.
variable "vpc_id" {
}
3.2. Ardından modules/s3/main.tf dosyasında güncel AWS hesap numarasını alın ve bir S3 kova kaynağı oluşturun.
# 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. Ardından S3 kovasında VPC Akışı günlüklerini etkinleştirin. Bu zorunlu değildir, ancak GuardDuty'nin gördüğü günlükleri görmemizi sağlar.
# 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. Son olarak modules/s3/outputs.tf dosyasına bucket_id ve bucket_arn değerlerini çıktı olarak verin.
# 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. Şimdi root/main.tf dosyasına geri dönün ve S3 kovasını ekleyin.
# CREATES S3 BUCKET
module "s3_bucket" {
source = "./modules/s3"
vpc_id = module.iac_vpc.vpc_attributes.id
}

Bu noktada iki S3 kovası oluşturdunuz. Bunları kendiniz incelemek isterseniz, kovalardan biri VPC akış günlükleri içindir. Diğeri ise bir sonraki adımda oluşturacağınız tehdit listesini içerir.

Adım 4: GuardDuty Terraform modülleri oluşturun

4.1. GuardDuty Modülü dosyaları sizin için oluşturuldu, ancak S3 dosyaları gibi boşlar. modules/guardduty/variables.tf dosyasıyla başlayın. Burada iki değişken oluşturmanız gerekiyor. İlki, S3 kova tehdit listesinin ayrıntılarını tanımlamak için kullanacağımız "bucket" adlı değişken. İkincisi ise kovaya eklediğimiz kötü amaçlı IP adresi.
variable "bucket" {
}
variable "malicious_ip" {
}
4.2. Daha sonra modules/guardduty/main.tf dosyasına gidin.

Bu dosyaya üç kaynak ekleyeceksiniz. İlk kaynak GuardDuty dedektörüdür. Sağlayıcı belgelerinde, tüm seçeneklerin isteğe bağlı olduğunu göreceksiniz; kaynağı belirtmek dışında başka bir şey gerekmiyor. Ancak, örneğimizde enabled değerini true olarak ayarlayıp finding_publishing_frequency değerini de 15 dakika olarak değiştireceğiz. Varsayılan değer bir saattir.

# ENABLE THE DETECTOR
resource "aws_guardduty_detector" "gd-tutorial" {
enable = true
finding_publishing_frequency = "FIFTEEN_MINUTES"
}
4.3. Ardından, önceki adımda oluşturduğumuz S3 kovasına bir dosya yüklüyoruz. Bu zorunlu değil, ancak bu eğitimdeki bulguların üretildiğinden emin olmak için EC2 örneklerinden birinin IP adresini kullanmak istiyoruz. Aşağıdaki kodda, MyThreatIntelSet adını vereceğimiz bir metin dosyasını S3 kovamıza yüklüyoruz ve dosyanın içeriği var.malicious_ip değişkeninde bulunan IP adresi olacak.
# 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. Son olarak, GuardDuty'e tanımlanan konumda bulunan dosyayı kullanmasını söyleyen aws_guardduty_threatintelset adlı bir kaynak oluşturacağız (activate = true komutu bunu yapar).
# 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. Ardından root/main.tf dosyasına gidin ve GuardDuty modülünü çağırın. Kova kimliğini ve kötü amaçlı yazılımın IP adresini sağlamamız gerekiyor. Bunların S3 modülünden ve compute modülünden geldiğini görebilirsiniz.
# Enable GuardDuty
module "guardduty" {
source = "./modules/guardduty"
bucket = module.s3_bucket.bucket_id
malicious_ip = module.compute.malicious_ip
}

Bu bölümde, GuardDuty'yi etkinleştirdiniz, tehdit listesini oluşturdunuz ve kötü amaçlı EC2 örneğinin Elastic IP adresini bu listeye eklediniz. Ardından, bir SNS kuralı oluşturacağız.

Adım 5: SNS Terraform modülünü oluşturun

Bu bölümde, bir SNS kuralı oluşturmak için Terraform kullanacağız. SNS, belirli kriterler karşılandığında bildirim göndermenizi sağlayan basit bir bildirim hizmetidir. SNS'nin kendisi bir mesaj gönderme eylemine karşılık gelmez. Bunun için EventBridge kullanacağız. Ancak, EventBridge bildirim göndermek için bir kural gerektirdiğinden, önce bir SNS kuralı oluşturmamız gerekiyor.

5.1. İlk olarak modules/sns/variables.tf dosyasında iki değişken oluşturmanız gerekiyor:
  1. sns_name, oluşturacağımız SNS konusuna isim vermek için kullanılır.
  2. Bildirimlerimize abone olmak için kullandığımız e-posta adresini içeren e-posta.

Aşağıda SNS için değişkenlerimize dair bir örnek bulunmaktadır.

variable "sns_name" {
description = "Name of the SNS Topic to be created"
default = "GuardDuty-Example"
}
variable "email" {
description = "Email address for SNS"
}
5.2. Daha sonra modules/sns/main.tf dosyasında SNS konusunu ve aboneliğini oluşturuyoruz.

Öncelikle bir konu kaynağı oluşturarak başlayın.

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

Yukarıdaki kodda, Terraform tarafından gd_sns_topic adlı bir kaynak oluşturuyorsunuz. AWS konsolunda ise bu kaynak "GuardDuty-Example" olarak adlandırılıyor. Bunun nedeni, var.sns_name değişkenini çağırıyor olmamız ve varsayılan ayarının "GuardDuty-Example" olmasıdır.

5.3. Ardından, bir SNS politika kaynağı oluşturun. arn ve Politika değerleri gereklidir. Burada oluşturulan politika bir AWS IAM politika belgesidir. Bu politika belgesi, hizmet sorumlusunun events.amazonaws.com adresindeki ilgili konuya yayın yapmasına olanak tanır.
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. Ardından konu aboneliğini oluşturun. Konu aboneliği ARN'yi çağırır, kullanılacak protokolü (bu durumda e-posta) ve bildirimin gönderileceği e-posta adresini belirler. E-posta adresi bu durumda sabit kodlanmıştır, ancak Terraform uygulandığında e-posta adresini soracak şekilde yapılandırabilirsiniz. Ayrıca, endpoint_auto_confirm parametresini false olarak ayarlamak, e-posta sahibinin bildirimlere abone olmak için tıklaması gereken bir bağlantı içeren bir e-posta alacağı anlamına gelir.
# 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. Daha sonra modules/sns/outputs.tf dosyasında, daha sonra yapacağımız EventBridge yapılandırmasında referans alabilmemiz için konu ARN'sini çıktı olarak almak istiyoruz.
output "sns_topic_arn" {
value = aws_sns_topic.gd_sns_topic.arn
description = "Output of ARN to call in the eventbridge rule."
}
5.6. Son olarak, root/main.tf dosyasına geri dönün ve SNS konusunu ekleyin. Abonelik için e-posta adresini burada belirtin.
# Creates an SNS Topic
module "guardduty_sns_topic" {
source = "./modules/sns"
email = "[email protected]"
}

Bu bölümde, belirli bir bulgu elde edildiğinde size e-posta gönderilmesini sağlamak için SNS konuları oluşturdunuz.

Adım 6: EventBridge Terraform modülünü oluşturun

Bu bölümde, bir EventBridge kuralı oluşturmak için Terraform'u kullanacaksınız. EventBridge kuralı, bu çözümün iki unsurunu birbirine bağlar.

EventBridge nasıl çalışır? Esasen EventBridge, ortamdaki bir değişikliğin göstergesi olan bir olay alır ve olayı bir hedefe yönlendirmek için bir kural uygular. Kurallar, olayları hedeflerle, olay örüntüsü adı verilen olayın yapısına veya bir zamanlamaya göre eşleştirir. Bu durumda, GuardDuty, bulgularda bir değişiklik meydana geldiğinde Amazon EventBridge'e bir olay gönderir. Olay eşleştirilir ve Amazon EventBridge kuralı bir hedefe yönlendirir. Bu durumda, kuralın hedefi bir SNS'dir. SNS kuralı, bulunan verileri alır ve aboneye bir e-posta bildirimi gönderir.

6.1. EventBridge kuralı, GuardDuty ve SNS hakkında bilgi gerektirir. SNS konu ARN'si için kullanılabilecek bir değişken oluşturarak başlayın. Bunu modules/eventbridge/variables.tf dosyasında yapın.
variable "sns_topic_arn" {
}
6.2. Ardından, modules/eventbridge/main.tf dosyasında bir olay kuralı kaynağı oluşturun. İstediğimiz olayın kaynağını ve türünü tanımlamanız gerekiyor.
 # 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. Ardından, olay hedefi kaynağını tanımlayın. Bu kaynağı oluştururken, bir giriş dönüştürücüsü tanımlayarak e-posta bildirimine biraz daha okunabilirlik katabilirsiniz. Bu, EventBridge'in olay hedefine ne göndereceğini özelleştirir. Aşağıda GuardDuty Kimliği, bölge ve EC2 örnek kimliğini alıyoruz ve mesaj hakkında biraz bilgi veren bir giriş şablonu oluşturuyoruz. Aşağıda, gönderilen e-posta mesajındaki GuardDuty bulgusundan alınan ayrıntılı bilgileri kullanan bir giriş şablonu oluşturduğumuzu görebilirsiniz.
# 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. Oluşturduğumuz ilk Olay kuralında, GuardDuty-Event-EC2-MaliciousIPCaller olayını arıyoruz. GuardDuty-Event-IAMUser-MaliciousIPCaller olayını aramak ve bunun için de bir e-posta bildirimi göndermek üzere ikinci bir Olay kuralı oluşturuyoruz.
# 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. Modülde kaynaklar oluşturulduktan sonra root/main.tf dosyasına geri dönün ve EventBridge kuralını ekleyin.
# Create the EventBridge rule
module "guardduty_eventbridge_rule" {
source = "./modules/eventbridge"
sns_topic_arn = module.guardduty_sns_topic.sns_topic_arn
}

Bu bölümde, GuardDuty bulguları eşleştiğinde e-posta göndermek için oluşturduğunuz SNS konusunu kullanan bir EventBridge kuralı oluşturdunuz. Sonraki bölümde, bu işlevselliği Lambda kullanarak genişleteceksiniz.

Adım 7: Lambda Terraform modülünü oluşturun

Bu bölümde, ortamımız için bir iyileştirme işlevi gerçekleştiren bir Lambda işlevi oluşturmak için Terraform'u kullanacağız. Bu eğitimde yapmak istediğimiz şey, tehlikeye atılmış ana makinemizi yeni bir güvenlik grubuna taşımak. EventBridge'in e-posta oluşturmak için SNS'yi kullanmasına benzer şekilde, EventBridge de Lambda işlevini kapsülleyecek.

Unutulmaması gereken bir nokta, burada birçok olası yaklaşımın mevcut olduğudur. Daha fazla bilgi için lütfen Amazon CloudWatch Olayları ile GuardDuty Bulgularına Özel Yanıtlar Oluşturma ve AWS Ağ Güvenlik Duvarı ve Amazon GuardDuty ile Şüpheli Trafiği Otomatik Olarak Engelleme belgelerine bakın.

Başlamadan önce, bunun gerçekleşmesi için nelerin yapılması gerektiğine bakalım.

Şu anda GuardDuty bulgularımız, hedefi olan bir EventBridge kuralıyla eşleştiriliyor. Bu kural, e-posta gönderen bir SNS kuralıdır. EventBridge, bu yeteneği geliştirmek için hedef olarak AWS Lambda'yı kullanır.

AWS Lambda adına başka kaynaklara erişmeyi planladığımız için, hizmete izin vermek üzere bir IAM rolü oluşturmamız gerekiyor. Bu role hizmet adı verilir ve EC2 örneğimizin güvenlik grubunu değiştirdiğimizde AWS Lambda bu rolü üstlenecektir.

Aşağıdaki görsel, AWS Lambda hizmetinin EC2 örneklerine atanan güvenlik gruplarında değişiklik yapabilecek bir rol üstlenmesine olanak sağlamak için ilk üç kod bloğunun nasıl bir araya geldiğini göstermektedir.


7.1. modules/lambda/main.tf dosyasında IAM politika belgesini oluşturarak başlayın. Bu, politika için güven ilişkisidir.
data "aws_iam_policy_document" "GD-EC2MaliciousIPCaller-policy-document" {
statement {
effect = "Allow"
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["lambda.amazonaws.com"]
}
}
}
7.2. Ardından, AWS Lambda'nın üstleneceği role uygulanacak satır içi bir politika oluşturun.
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. Şimdi AWS Lambda'nın üstleneceği IAM rolünü oluşturalım.
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. Kodlara işaret eden bir veri kaynağı oluşturun.
data "archive_file" "python_lambda_package" {
type = "zip"
source_file = "${path.module}/code/index.py"
output_path = "index.zip"
}
7.5. Daha sonra EventBridge'e Lambda'ya erişim izni vermemiz gerekiyor.
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"
}

Yukarıdaki blok EventBridge'in Lambda fonksiyonunu çağırmasına izin verir.

7.6. Son olarak, Lambda fonksiyonunun kaynağını oluşturuyoruz. Bunu yapmak için, bilgi aktarmamızı sağlayacak birkaç değişken oluşturmamız gerekiyor. modules/lambda/variables.tf dosyasını aşağıdaki değişkenlerle düzenleyin:
variable "sns_topic_arn" {
}
variable "compromised_instance_id" {
}
variable "forensic_sg_id" {
}
7.7. Ardından modules/lambda/main.tf dosyasına geri dönün ve Lambda fonksiyon kaynağını oluşturun. Aşağıdaki kod bloğunda Python 3.9 kullandığımızı unutmayın. Ayrıca index.zip dosyasında sıkıştırdığımız Python koduna da başvuruyoruz. Son olarak, kaynakta birkaç ortam değişkeni ayarlıyoruz: INSTANCE_ID, FORENSICS_SG ve TOPIC_ARN. Bunlar, oluşturduğumuz değişkenlerden Lambda fonksiyon ortamımıza aktarılacak.
# 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 dosyasında Lambda modülünü çağırın, SNS konu ARN'sini, tehlikeye atılan örnek kimliğini ve Adli Güvenlik grubunu ayarlayın. Bu değerlerin GuardDuty modülünden, Compute modülünden ve VPC modülünden geldiğini unutmayın.
# 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. Yasal güvenlik grubu henüz oluşturulmadı. Kullanılacak bir güvenlik grubu ekleyin.
# 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 grubuna erişmek için, bunu root/outputs.tf dosyasına yazdırmamız ve güvenlik grubu kimliğini çıktı olarak vermemiz gerekiyor.
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. Şimdi, bulunan verileri Lambda'ya göndermek için EventBridge kuralını yapılandırmamız gerekiyor. Bunu bir sonraki bölümde yapacağız. modules/eventbridge/main.tf dosyasına geri dönün. Lambda fonksiyonu için aws_cloudwatch_event_rule.GuardDuty-Event-EC2-MaliciousIPCaller.name kuralına bakan bir olay hedefi kaynağı ekleyin ve hedef kimliğini GuardDuty-Example-Remediation olarak ayarlayın. Burada Lambda fonksiyonunun ARN'sine ihtiyacınız olacak. Bu, Lambda modülünden çıktı olarak alınabilir.
#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. Eğer henüz yapmadıysanız, çıktıyı Lambda modülüne ekleyin (modules/lambda/outputs.tf).
output "lambda_remediation_function_arn" {
value = aws_lambda_function.GuardDuty-Example-Remediation-EC2MaliciousIPCaller.arn
}
7.13. Bu değişken EventBridge modülünde de uygulanmalıdır (modules/eventbridge/variables.tf).
variable "lambda_remediation_function_arn" {
}
7.14. Son olarak, lambda_remediation_function_arn kodunu root/main.tf dosyasına ekleyin. Bu, daha önce oluşturulan EventBridge kuralına eklenir. Aşağıdaki çıktı, bir kısmı zaten mevcut olan tüm kod bloğudur. Mevcut bloğa yalnızca lambda_remediation_function_arn = module.lambda.lambda_remediation_function_arn kodunu eklediğinizden emin olun.
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
}

Bu bölümde, risk altındaki bir ana bilgisayarı farklı bir güvenlik grubuna ayıran bir Lambda işlevi oluşturdunuz. Bu Lambda işlevi, bir GuardDuty bulgusu bir EventBridge kuralıyla eşleştiğinde EventBridge tarafından çağrılır. Bir sonraki bölümde, tüm yapılandırmayı uygulayacaksınız.

Adım 8: Ayarları AWS hesabınıza uygulayın

8.1. Bir terraform init çalıştırın. Bu, bu kod eğitiminde eklediğiniz tüm modülleri başlatacaktır. Çıktı aşağıdaki gibi olmalıdır.

8.2. Bir kat planı yapın.
8.3. Değişiklikleri AWS'ye uygulamak için bir Terraform uygulaması çalıştırın. Uyguladıktan sonra çıktınız aşağıdaki gibi olmalıdır:


Bu bölümde, Terraform yapılandırmasını AWS hesabınıza uyguladınız. Bu noktada, birbiriyle iletişim kuran iki EC2 örneğiniz var. Bunlardan biri kötü amaçlı ve IP adresi tehdit IP listemize eklendi. GuardDuty, bu IP adresinin ele geçirilmiş örneğimizle iletişim kurduğunu gördüğünde bir bulgu oluşturur. Bu bulguyla eşleşen ve iki işlem yapan bir EventBridge kuralımız var: ilk olarak, bize ne olduğunu bildiren bir e-posta gönderir ve ikinci olarak, ele geçirilmiş ana bilgisayarın güvenlik grubunu değiştirmek için bir Lambda işlevi çağırır. Bir sonraki bölümde, yapılandırmayı AWS konsolumuzda doğrulayacağız.

Adım 9: Çözümü AWS Yönetim Konsolunda doğrulayın

Bu bölümde AWS konsolundaki tüm çözümü inceleyeceğiz ve bulgular GuardDuty'de göründüğünde ve EventBridge Lambda işlevini tetiklediğinde güvenlik grubunun taşındığını doğrulayacağız.

Aboneliğinizi onaylayan bir e-posta da almış olmalısınız. Yapılandırmanız gereken bildirimleri almak için abone olmanız gerektiğini unutmayın.


Abone olduktan sonra, iki EC2 örneğinin olduğunu ve her ikisinin de birincil güvenlik grubunda olduğunu doğrulamak için AWS Yönetim Konsoluna gidin.

Öncelikle tehlikeye maruz kalmış sunucuları kontrol edin.


Daha sonra kötü amaçlı sunucuları kontrol edin.


Daha sonra GuardDuty'nin bulguları raporladığından emin olun.


Şimdi EventBridge kuralının ne bulduğuna bakalım.


Ardından EventBridge kural hedefini kontrol edin. Bir SNS hedefi ve bir Lambda hedefi görmelisiniz.


SNS kuralının ne işe yaradığını görmek için kontrol edin. Belirttiğiniz adrese bir e-posta göndermesi gerekir.


Ardından Lambda fonksiyonunu kontrol edin. EventBridge kuralından veya doğrudan gezinerek oraya gidebilirsiniz.


Son olarak, Lambda işlevinin tehlikeye atılan ana bilgisayarı yeni bir güvenlik grubuna taşıdığını doğrulayın.


Beklediğiniz süreye bağlı olarak, yapılandırmanız yukarıdaki ekran görüntüleriyle eşleşiyorsa, Terraform kullanarak eksiksiz bir AWS güvenlik çözümü başarıyla oluşturmuşsunuz demektir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Ayrıca Şunları da Beğenebilirsiniz