AWS Security Hub ile Merkezi Güvenlik Yönetimi
Birden fazla AWS hesabı yönetiyorsanız ve her birinin güvenlik durumunu ayrı ayrı takip etmeye çalışıyorsanız, bu işin ne kadar yorucu olduğunu çok iyi biliyorsunuzdur. Hangi hesapta hangi S3 bucket’ı açık, hangi EC2 instance’ında eski bir AMI kullanılıyor, hangi IAM kullanıcısının MFA’sı yok… Bunları tek tek kontrol etmek yerine merkezi bir noktadan yönetmek istiyorsanız AWS Security Hub tam olarak bunun için var. Bu yazıda Security Hub’ı sıfırdan kurmaktan, otomasyona entegre etmeye kadar her şeyi ele alacağız.
AWS Security Hub Nedir ve Neden Önemlidir?
Security Hub, AWS’nin sunduğu merkezi güvenlik yönetim servisidir. Temel işlevi şu: farklı AWS servislerinden (GuardDuty, Inspector, Macie, IAM Access Analyzer vb.) gelen güvenlik bulgularını tek bir çatı altında toplamak, bunları CIS AWS Foundations Benchmark, AWS Foundational Security Best Practices gibi standartlara göre değerlendirmek ve size bir güvenlik skoru vermek.
Pratikte şu anlama geliyor: Sabah işe geldiğinizde tek bir dashboard’a bakıp “bu hafta 47 kritik bulgu var, 12’si yeni” diyebiliyorsunuz. Ayrı ayrı GuardDuty’ye, ayrı ayrı Inspector’a bakmak zorunda kalmıyorsunuz.
Multi-account senaryosunda ise işin değeri katlanıyor. AWS Organizations ile entegre ettiğinizde tüm üye hesapların bulgularını delegated administrator hesabından yönetebiliyorsunuz. 50 hesaplı bir ortamda bu fark gerçekten hayat kurtarıcı.
Temel Kavramlar
Security Hub’ı kullanmadan önce birkaç kavramı netleştirmek gerekiyor.
Findings (Bulgular): Güvenlik sorunlarını temsil eden kayıtlar. ASFF (Amazon Security Finding Format) standardında gelirler. Her bulgunun severity, status, resource bilgisi vs. bulunur.
Controls: Güvenlik standartlarının her bir maddesine karşılık gelen kontroller. Örneğin “S3.1 – S3 Block Public Access enabled at account level” bir kontroldür.
Standards: CIS AWS Foundations, PCI DSS, NIST 800-53 gibi güvenlik çerçeveleri. Bunları etkinleştirince Security Hub ortamınızı bu standartlara göre sürekli değerlendirir.
Insights: Önceden tanımlanmış veya özel sorgular. “En fazla kritik bulgu üreten kaynaklar” gibi analizleri hızlıca görmenizi sağlar.
Integrations: GuardDuty, Inspector, Macie gibi AWS servisleri ile üçüncü parti araçların Security Hub’a bulgu gönderme entegrasyonları.
Security Hub’ı Etkinleştirme
Tek Hesap için Kurulum
Tek bir hesapta Security Hub’ı etkinleştirmek oldukça basit. AWS CLI ile:
# Security Hub'ı etkinleştir
aws securityhub enable-security-hub
--enable-default-standards
--control-finding-generator SECURITY_CONTROL
--region us-east-1
# Etkinleştirme durumunu kontrol et
aws securityhub describe-hub
--region us-east-1
--enable-default-standards parametresi, AWS Foundational Security Best Practices standardını otomatik olarak aktif eder. Eğer CIS benchmark’ı da istiyorsanız:
# Mevcut standartların ARN'lerini listele
aws securityhub describe-standards
--region us-east-1
--query 'Standards[*].{Name:Name, ARN:StandardsArn}'
# CIS AWS Foundations Benchmark'ı etkinleştir
aws securityhub batch-enable-standards
--standards-subscription-requests
StandardsArn=arn:aws:securityhub:us-east-1::standards/cis-aws-foundations-benchmark/v/1.4.0
--region us-east-1
Multi-Account Kurulumu (Organizations ile)
Gerçek dünyada büyük ihtimalle birden fazla hesabınız var. AWS Organizations kullanıyorsanız şu adımları izliyorsunuz:
# Management account'ta delegated administrator ata
# (Bu komutu Organizations management account'ında çalıştırın)
aws securityhub enable-organization-admin-account
--admin-account-id 123456789012
--region us-east-1
# Delegated admin hesabında: otomatik enroll'u yapılandır
aws securityhub update-organization-configuration
--auto-enable
--auto-enable-standards DEFAULT
--region us-east-1
# Mevcut üye hesapları kontrol et
aws securityhub list-members
--only-associated
--region us-east-1
Bu yapılandırmanın ardından Organizations’a yeni bir hesap eklendiğinde Security Hub otomatik olarak o hesapta da etkinleşiyor. Elinizdeki 50 hesaptan birini unuttunuz derdi ortadan kalkıyor.
Terraform ile Infrastructure as Code
Güvenlik altyapısını elle kurmak, ölçeklenebilir değil. Terraform ile tüm yapıyı kodlayalım:
# main.tf - Security Hub temel yapılandırması
# Önce terraform dosyasını oluşturup çalıştıralım
cat > security_hub.tf << 'EOF'
resource "aws_securityhub_account" "main" {
enable_default_standards = false
control_finding_generator = "SECURITY_CONTROL"
auto_enable_controls = true
}
resource "aws_securityhub_standards_subscription" "aws_foundational" {
depends_on = [aws_securityhub_account.main]
standards_arn = "arn:aws:securityhub:${var.region}::standards/aws-foundational-security-best-practices/v/1.0.0"
}
resource "aws_securityhub_standards_subscription" "cis_v14" {
depends_on = [aws_securityhub_account.main]
standards_arn = "arn:aws:securityhub:${var.region}::standards/cis-aws-foundations-benchmark/v/1.4.0"
}
resource "aws_securityhub_action_target" "notify_slack" {
depends_on = [aws_securityhub_account.main]
name = "Notify Slack"
identifier = "NotifySlack"
description = "Kritik bulgular icin Slack bildirimi gonder"
}
EOF
terraform init
terraform plan -out=tfplan
terraform apply tfplan
Bulgularla Çalışmak
CLI ile Bulgu Sorgulama
Security Hub’ın gerçek değeri, bulguları filtreleyip anlamlandırabilmekten geliyor.
# Kritik ve HIGH severity bulgularını listele
aws securityhub get-findings
--filters '{
"SeverityLabel": [
{"Value": "CRITICAL", "Comparison": "EQUALS"},
{"Value": "HIGH", "Comparison": "EQUALS"}
],
"RecordState": [{"Value": "ACTIVE", "Comparison": "EQUALS"}],
"WorkflowStatus": [{"Value": "NEW", "Comparison": "EQUALS"}]
}'
--sort-criteria '[{"Field": "SeverityLabel", "SortOrder": "desc"}]'
--max-items 20
--region us-east-1
--query 'Findings[*].{
Title: Title,
Severity: Severity.Label,
Resource: Resources[0].Id,
UpdatedAt: UpdatedAt
}'
--output table
# Belirli bir AWS hesabındaki S3 ile ilgili bulgular
aws securityhub get-findings
--filters '{
"AwsAccountId": [
{"Value": "123456789012", "Comparison": "EQUALS"}
],
"ResourceType": [
{"Value": "AwsS3Bucket", "Comparison": "EQUALS"}
],
"ComplianceStatus": [
{"Value": "FAILED", "Comparison": "EQUALS"}
]
}'
--region us-east-1
--output json | jq '.Findings | length'
Bulgu Durumunu Güncelleme
Bir bulguyu inceleyip “bu false positive” veya “suppressed” diye işaretleyebilirsiniz:
# Bulguyu SUPPRESSED olarak işaretle (false positive veya risk kabul)
aws securityhub batch-update-findings
--finding-identifiers
'[{
"Id": "arn:aws:securityhub:us-east-1:123456789012:subscription/aws-foundational-security-best-practices/v/1.0.0/S3.1/finding/abc123",
"ProductArn": "arn:aws:securityhub:us-east-1::product/aws/securityhub"
}]'
--workflow '{"Status": "SUPPRESSED"}'
--note '{"Text": "Internal bucket, public access intentional for static website", "UpdatedBy": "[email protected]"}'
--region us-east-1
EventBridge ile Otomatik Yanıt
Security Hub’ı gerçekten güçlü yapan şey, EventBridge ile entegre edince ortaya çıkıyor. Kritik bir bulgu geldiğinde Lambda tetikleyebilir, SNS mesajı gönderebilir, hatta otomatik remediation başlatabilirsiniz.
EventBridge Rule Oluşturma
# Kritik bulgular için EventBridge kuralı
aws events put-rule
--name "SecurityHub-Critical-Findings"
--event-pattern '{
"source": ["aws.securityhub"],
"detail-type": ["Security Hub Findings - Imported"],
"detail": {
"findings": {
"Severity": {
"Label": ["CRITICAL", "HIGH"]
},
"RecordState": ["ACTIVE"],
"Workflow": {
"Status": ["NEW"]
}
}
}
}'
--state ENABLED
--region us-east-1
# Lambda'yı target olarak ekle
aws events put-targets
--rule "SecurityHub-Critical-Findings"
--targets '[{
"Id": "SecurityHubRemediationLambda",
"Arn": "arn:aws:lambda:us-east-1:123456789012:function:SecurityHubRemediation"
}]'
--region us-east-1
Otomatik Remediation Lambda’sı
Gerçek dünya senaryosu: S3 bucket public access açılınca otomatik kapat.
# Lambda deployment package oluştur
mkdir -p /tmp/lambda_package
cat > /tmp/lambda_package/handler.py << 'PYTHON'
import boto3
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
s3 = boto3.client('s3')
securityhub = boto3.client('securityhub')
def lambda_handler(event, context):
findings = event.get('detail', {}).get('findings', [])
for finding in findings:
control_id = finding.get('Compliance', {}).get('SecurityControlId', '')
resources = finding.get('Resources', [])
# S3 public access kontrolü
if control_id in ['S3.1', 'S3.2', 'S3.8']:
for resource in resources:
if resource.get('Type') == 'AwsS3Bucket':
bucket_name = resource.get('Id', '').split(':::')[-1]
try:
# Public access block'u etkinleştir
s3.put_public_access_block(
Bucket=bucket_name,
PublicAccessBlockConfiguration={
'BlockPublicAcls': True,
'IgnorePublicAcls': True,
'BlockPublicPolicy': True,
'RestrictPublicBuckets': True
}
)
logger.info(f"Public access blocked for bucket: {bucket_name}")
# Security Hub'da bulguyu RESOLVED yap
finding_id = finding.get('Id')
product_arn = finding.get('ProductArn')
securityhub.batch_update_findings(
FindingIdentifiers=[{
'Id': finding_id,
'ProductArn': product_arn
}],
Workflow={'Status': 'RESOLVED'},
Note={
'Text': f'Auto-remediated: Public access blocked on {bucket_name}',
'UpdatedBy': 'AutoRemediationLambda'
}
)
except Exception as e:
logger.error(f"Remediation failed for {bucket_name}: {str(e)}")
return {'statusCode': 200, 'body': 'Remediation completed'}
PYTHON
cd /tmp/lambda_package
zip -r remediation_lambda.zip handler.py
# Lambda'yı deploy et
aws lambda create-function
--function-name SecurityHubRemediation
--runtime python3.11
--role arn:aws:iam::123456789012:role/SecurityHubRemediationRole
--handler handler.lambda_handler
--zip-file fileb://remediation_lambda.zip
--timeout 60
--region us-east-1
Güvenlik Skoru Takibi ve Raporlama
Security Hub’ın compliance skoru, ortamınızın genel sağlık durumunun iyi bir göstergesidir. Bu skoru düzenli olarak takip eden bir script yazalım:
#!/bin/bash
# security_hub_report.sh - Haftalık güvenlik raporu
REGION="us-east-1"
REPORT_DATE=$(date +%Y-%m-%d)
REPORT_FILE="/tmp/security_report_${REPORT_DATE}.txt"
echo "=== AWS Security Hub Haftalık Rapor - ${REPORT_DATE} ===" > $REPORT_FILE
echo "" >> $REPORT_FILE
# Her standart için skor al
echo "### Compliance Skorlari ###" >> $REPORT_FILE
aws securityhub get-compliance-summary
--region $REGION
--query 'CompliantCheckCount, NonCompliantCheckCount' 2>/dev/null
aws securityhub describe-standards-controls
--standards-subscription-arn
"arn:aws:securityhub:${REGION}:123456789012:subscription/aws-foundational-security-best-practices/v/1.0.0"
--region $REGION
--query 'Controls[?ControlStatus==`FAILED`].{ControlId:ControlId, Title:Title, SeverityRating:SeverityRating}'
--output json | jq '. | length' >> $REPORT_FILE
# Severity bazında bulgu sayıları
echo "" >> $REPORT_FILE
echo "### Aktif Bulgular (Severity Bazinda) ###" >> $REPORT_FILE
for severity in CRITICAL HIGH MEDIUM LOW; do
count=$(aws securityhub get-findings
--filters "{
"SeverityLabel": [{"Value": "${severity}", "Comparison": "EQUALS"}],
"RecordState": [{"Value": "ACTIVE", "Comparison": "EQUALS"}],
"WorkflowStatus": [{"Value": "NEW", "Comparison": "EQUALS"}]
}"
--region $REGION
--query 'length(Findings)'
--output text 2>/dev/null)
echo "${severity}: ${count} bulgu" >> $REPORT_FILE
done
echo "" >> $REPORT_FILE
echo "Rapor olusturuldu: ${REPORT_FILE}"
cat $REPORT_FILE
# Rapora SNS ile bildirim gonder (opsiyonel)
# aws sns publish
# --topic-arn arn:aws:sns:us-east-1:123456789012:SecurityReports
# --subject "Haftalık Güvenlik Raporu - ${REPORT_DATE}"
# --message file://$REPORT_FILE
# --region $REGION
Özel Kontroller ve Findings Oluşturma
Security Hub sadece AWS’nin tanımladığı kontrolleri değil, sizin özel iş kurallarınıza göre yazdığınız kontrolleri de kabul ediyor. Örneğin “tüm EC2 instance’larında belirli bir tag olmalı” gibi bir kuralınız varsa:
# Özel bulgu oluşturma (kendi uygulamanızdan veya script'ten)
aws securityhub batch-import-findings
--findings '[{
"SchemaVersion": "2018-10-08",
"Id": "custom-finding-ec2-missing-tag-i-1234567890",
"ProductArn": "arn:aws:securityhub:us-east-1:123456789012:product/123456789012/default",
"GeneratorId": "custom-ec2-tag-checker",
"AwsAccountId": "123456789012",
"Types": ["Software and Configuration Checks/Industry and Regulatory Standards"],
"CreatedAt": "2024-01-15T10:30:00Z",
"UpdatedAt": "2024-01-15T10:30:00Z",
"Severity": {
"Label": "MEDIUM",
"Original": "60"
},
"Title": "EC2 instance Environment tag eksik",
"Description": "i-1234567890 instance uzerinde zorunlu Environment tag bulunamadi",
"Resources": [{
"Type": "AwsEc2Instance",
"Id": "arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890",
"Region": "us-east-1"
}],
"Compliance": {
"Status": "FAILED"
},
"WorkflowState": "NEW",
"RecordState": "ACTIVE"
}]'
--region us-east-1
Maliyet Optimizasyonu
Security Hub’ın maliyetini kontrol altında tutmak için birkaç pratik öneri:
Gereksiz standartları devre dışı bırakın: Her standart, ortamınızdaki her kaynak için kontrol çalıştırır. Sadece uymanız gereken standartları etkin tutun.
# Kullanmadığınız standardı kapat
aws securityhub batch-disable-standards
--standards-subscription-arns
"arn:aws:securityhub:us-east-1:123456789012:subscription/pci-dss/v/3.2.1"
--region us-east-1
# Aylık tahmini maliyet için finding sayısını kontrol et
# İlk 10.000 kontrol ücretsiz, sonrası ~$0.0010/kontrol
aws securityhub describe-standards-controls
--standards-subscription-arn
"arn:aws:securityhub:us-east-1:123456789012:subscription/aws-foundational-security-best-practices/v/1.0.0"
--region us-east-1
--query 'length(Controls)'
Bölge seçimi: Security Hub’ı sadece aktif olarak kaynak kullandığınız bölgelerde etkinleştirin. Boş bir bölgede etkin tutmak gereksiz maliyet demek.
Aggregation bölgesi kullanın: Birden fazla bölgede çalışıyorsanız finding aggregation’ı yapılandırın, böylece tüm bulguları tek bölgeden yönetirsiniz.
# Finding aggregation'ı yapılandır
aws securityhub create-finding-aggregator
--region-linking-mode ALL_REGIONS
--region us-east-1
Gerçek Dünya Senaryo: Yeni Hesap Güvenlik Baseline
Şirkete yeni bir AWS hesabı açıldığında, güvenlik baseline’ını otomatik kuran bir script:
#!/bin/bash
# new_account_security_baseline.sh
# Yeni AWS hesabı icin Security Hub baseline kurulumu
set -e
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REGION="us-east-1"
echo "[*] Security Hub etkinlestiriliyor - Hesap: ${ACCOUNT_ID}"
# Security Hub'ı etkinleştir
aws securityhub enable-security-hub
--enable-default-standards
--control-finding-generator SECURITY_CONTROL
--region $REGION
echo "[*] Ek standartlar ekleniyor..."
# CIS v1.4 ekle
aws securityhub batch-enable-standards
--standards-subscription-requests
StandardsArn="arn:aws:securityhub:${REGION}::standards/cis-aws-foundations-benchmark/v/1.4.0"
--region $REGION
# Yüksek maliyetli ama gerekli olmayan kontrolleri devre dışı bırak
# (Örnek: Eski EC2 kontrolü)
echo "[*] Gereksiz kontroller devre disinda birakiliyor..."
aws securityhub update-standards-control
--standards-control-arn
"arn:aws:securityhub:${REGION}:${ACCOUNT_ID}:control/cis-aws-foundations-benchmark/v/1.4.0/2.1.1"
--control-status DISABLED
--disabled-reason "Kapsam disi - bu hesapta CloudTrail merkezi yonetimde"
--region $REGION 2>/dev/null || true
# EventBridge rule oluştur
echo "[*] Otomatik bildirim kurallari olusturuluyor..."
aws events put-rule
--name "SecurityHub-Critical-Auto-Notify"
--event-pattern "{
"source": ["aws.securityhub"],
"detail-type": ["Security Hub Findings - Imported"],
"detail": {
"findings": {
"Severity": {"Label": ["CRITICAL"]},
"RecordState": ["ACTIVE"]
}
}
}"
--state ENABLED
--region $REGION
echo "[+] Security Hub baseline kurulumu tamamlandi!"
echo "[+] Hesap ${ACCOUNT_ID} artik Security Hub ile izleniyor."
Slack Entegrasyonu
Güvenlik ekiplerinin tercih ettiği bir kullanım şekli: kritik bulgular doğrudan Slack’e düşsün.
Lambda içinde basit bir Slack webhook entegrasyonu:
# Slack notification Lambda environment variable olarak webhook URL'i ekle
aws lambda update-function-configuration
--function-name SecurityHubRemediation
--environment Variables='{
"SLACK_WEBHOOK_URL": "https://hooks.slack.com/services/TXXXXXXX/BXXXXXXX/xxxxxxxxxx",
"SLACK_CHANNEL": "#security-alerts",
"ENV_NAME": "production"
}'
--region us-east-1
# Lambda içinde kullanılacak Slack mesaj formatı (Python snippet)
# import urllib3
# http = urllib3.PoolManager()
#
# def send_slack_alert(finding):
# severity = finding['Severity']['Label']
# title = finding['Title']
# account = finding['AwsAccountId']
# resource = finding['Resources'][0]['Id']
#
# color = {'CRITICAL': '#FF0000', 'HIGH': '#FF6600'}.get(severity, '#FFCC00')
#
# payload = {
# "channel": os.environ['SLACK_CHANNEL'],
# "attachments": [{
# "color": color,
# "title": f"[{severity}] Security Hub Alert",
# "fields": [
# {"title": "Bulgu", "value": title, "short": False},
# {"title": "Hesap", "value": account, "short": True},
# {"title": "Kaynak", "value": resource, "short": True}
# ]
# }]
# }
#
# http.request('POST', os.environ['SLACK_WEBHOOK_URL'],
# body=json.dumps(payload).encode('utf-8'))
Sonuç
AWS Security Hub, özellikle birden fazla hesap yönetiyorsanız vazgeçilmez bir araç. Kurulumu görece kolay, EventBridge ile entegrasyonu sayesinde gerçek anlamda proaktif güvenlik yönetimi yapabiliyorsunuz. Manuel kontrol yerine otomatik remediation, sabah dashboarda bakıp “bugün ne var” demek yerine sadece gerçekten önemli olan uyarılar… Bunların hepsi mümkün.
Başlangıç için önerim şu: önce tek bir hesapta AWS Foundational Security Best Practices standardını aktif edin, bir hafta bulgulara bakın. Ortamınızın gerçek durumunu görünce zaten diğer adımları atmak için motivasyon kendiliğinden geliyor. Ardından Organizations entegrasyonu, EventBridge otomasyonu ve özel remediation Lambda’ları sırayla devreye alırsınız.
Güvenlik bir kerelik iş değil, sürekli süreç. Security Hub da tam olarak bu süreklilik için tasarlanmış. Altyapınızın güvenlik borcunu görünür kılmak, çözmenin ilk adımı.
