AWS Inspector ile Güvenlik Açığı Taraması: Eksiksiz Rehber

Bulut ortamlarında güvenlik açıklarını zamanında tespit etmek, bir sysadmin olarak gecenin üçünde alarm almamak için en temel savunma hattını oluşturuyor. AWS Inspector, bu konuda hem otomatik hem de sürekli bir tarama mekanizması sunarak hayatımızı ciddi ölçüde kolaylaştırıyor. Bu yazıda Inspector’ı sıfırdan yapılandırmaktan, bulguları yorumlamaya ve otomasyona entegre etmeye kadar her şeyi ele alacağız.

AWS Inspector Nedir ve Neden Önemlidir

AWS Inspector, EC2 instance’larınızı, container image’larınızı ve Lambda fonksiyonlarınızı otomatik olarak tarayan, yönetilen bir güvenlik açığı değerlendirme hizmetidir. Eski nesil Inspector v1 ile kıyaslandığında, 2021 sonunda yayınlanan Inspector v2 çok daha kapsamlı ve entegre bir yapı sunuyor.

Gerçek dünya örneği verelim: Bir e-ticaret şirketinde 200’den fazla EC2 instance yönettiğinizi düşünün. Her instance için ayrı ayrı vulnerability scan çalıştırmak, raporları manuel okumak ve patch önceliklerini belirlemek operasyonel olarak imkansıza yakın. Inspector bu süreci merkezi bir panelde toplayarak CVSS skorlarına göre önceliklendiriyor ve hangi instance’ın ne kadar kritik olduğunu size söylüyor.

Inspector v2’nin öne çıkan özellikleri:

  • Sürekli tarama: Yeni bir CVE yayınlandığında instance’larınızı otomatik olarak yeniden tarar
  • Risk skoru: AWS’nin kendi geliştirdiği, CVSS’i network erişilebilirlik ve exploit olasılığıyla birleştiren bir skorlama sistemi
  • Multi-account desteği: AWS Organizations entegrasyonuyla tüm hesapları merkezi yönetme
  • Container desteği: ECR’daki image’ları push anında tarar
  • Lambda desteği: Fonksiyonlarınızdaki paket bağımlılıklarını analiz eder

Inspector’ı Etkinleştirme

Inspector’ı AWS Console üzerinden etkinleştirebilirsiniz, ancak gerçek bir sysadmin olarak her şeyi CLI üzerinden yapmayı tercih ederiz.

# Inspector v2'yi hesabınızda etkinleştirme
aws inspector2 enable 
  --resource-types EC2 ECR LAMBDA 
  --region us-east-1

# Etkinleştirme durumunu kontrol etme
aws inspector2 batch-get-account-status 
  --account-ids $(aws sts get-caller-identity --query Account --output text)

Multi-account ortamda çalışıyorsanız, Organizations üzerinden tüm üye hesaplara Inspector’ı yaymak için delegated administrator hesabı belirlemeniz gerekiyor:

# Organizations'da delegated admin belirleme (management hesabından çalıştırın)
aws inspector2 enable-delegated-admin-account 
  --delegated-admin-account-id 123456789012

# Üye hesapları otomatik etkinleştirme
aws inspector2 update-organization-configuration 
  --auto-enable '{"ec2": true, "ecr": true, "lambda": true}'

EC2 instance’larınızda tarama yapılabilmesi için SSM Agent’ın çalışıyor olması ve instance’ların SSM ile yönetilen sistemler listesinde görünmesi gerekiyor. Bu çok önemli bir ön koşul, atladığınızda “neden taranmıyor?” diye saatler harcarsınız.

# SSM Agent durumunu toplu kontrol etme
aws ssm describe-instance-information 
  --query 'InstanceInformationList[*].{ID:InstanceId,Status:PingStatus,Platform:PlatformName}' 
  --output json | jq '.[] | select(.Status != "Online")'

# SSM yönetimi altında olmayan instance'ları bulma
aws inspector2 list-coverage 
  --filter-criteria '{"ec2InstanceTags": [{"comparison": "NOT_EQUALS", "key": "aws:cloudformation:stack-name", "value": ""}]}' 
  --query 'coveredResources[?scanStatus.statusCode!=`ACTIVE`]'

IAM Yapılandırması

Inspector’ın düzgün çalışması için doğru IAM izinlerine sahip olmanız gerekiyor. Minimum gerekli policy şu şekilde:

# Inspector okuma ve raporlama için IAM policy oluşturma
cat << 'EOF' > inspector-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "InspectorReadAccess",
      "Effect": "Allow",
      "Action": [
        "inspector2:ListFindings",
        "inspector2:GetFinding",
        "inspector2:ListCoverage",
        "inspector2:GetReport",
        "inspector2:CreateFindingsReport",
        "inspector2:ListFindingAggregations",
        "inspector2:BatchGetFreeTrialInfo"
      ],
      "Resource": "*"
    },
    {
      "Sid": "SSMAccess",
      "Effect": "Allow",
      "Action": [
        "ssm:DescribeInstanceInformation",
        "ssm:ListCommandInvocations"
      ],
      "Resource": "*"
    }
  ]
}
EOF

aws iam create-policy 
  --policy-name InspectorReadAndReport 
  --policy-document file://inspector-policy.json

Bulguları Sorgulamak ve Analiz Etmek

Inspector çalışmaya başladıktan sonra asıl iş bulguları anlamlandırmak. AWS CLI ile kritik bulgulara doğrudan erişebilirsiniz:

# Kritik seviyedeki bulguları listeleme
aws inspector2 list-findings 
  --filter-criteria '{
    "findingStatus": [{"comparison": "EQUALS", "value": "ACTIVE"}],
    "severity": [{"comparison": "EQUALS", "value": "CRITICAL"}]
  }' 
  --query 'findings[*].{
    Title:title,
    Severity:severity,
    Score:inspectorScore,
    Resource:resources[0].id,
    PackageName:packageVulnerabilityDetails.vulnerablePackages[0].name,
    FixedIn:packageVulnerabilityDetails.vulnerablePackages[0].fixedInVersion
  }' 
  --output table

Pratik bir senaryo üzerinden gidelim. Diyelim ki log4shell (CVE-2021-44228) gibi yüksek profilli bir CVE yayınlandı ve hangi instance’larınızın etkilendiğini hemen öğrenmek istiyorsunuz:

#!/bin/bash
# Belirli bir CVE'yi hangi instance'larda barındırdığını bulma
CVE_ID="CVE-2021-44228"

aws inspector2 list-findings 
  --filter-criteria "{
    "findingStatus": [{"comparison": "EQUALS", "value": "ACTIVE"}],
    "vulnerabilityId": [{"comparison": "EQUALS", "value": "$CVE_ID"}]
  }" 
  --query 'findings[*].{
    CVE:packageVulnerabilityDetails.cvss[0].baseScore,
    Resource:resources[0].id,
    Region:resources[0].region,
    Package:packageVulnerabilityDetails.vulnerablePackages[0].name,
    Version:packageVulnerabilityDetails.vulnerablePackages[0].version,
    Fix:packageVulnerabilityDetails.vulnerablePackages[0].fixedInVersion
  }' 
  --output json | tee affected_instances_${CVE_ID}.json

echo "Etkilenen instance sayisi:"
cat affected_instances_${CVE_ID}.json | jq length

Bu scripti her yeni kritik CVE için çalıştırmayı rutin haline getirin. Output’u bir S3 bucket’a yazarak tarihsel kayıt tutabilirsiniz.

Otomatik Raporlama ve Bildirim Sistemi

Inspector’ı sadece pasif bir tarama aracı olarak kullanmak potansiyelinin yarısını heba etmek demek. EventBridge entegrasyonuyla yeni kritik bulgular geldiğinde anında bildirim alabilirsiniz.

# EventBridge rule oluşturma - Kritik Inspector bulguları için
aws events put-rule 
  --name "InspectorCriticalFindings" 
  --event-pattern '{
    "source": ["aws.inspector2"],
    "detail-type": ["Inspector2 Finding"],
    "detail": {
      "severity": ["CRITICAL", "HIGH"],
      "status": ["ACTIVE"]
    }
  }' 
  --state ENABLED 
  --description "Kritik ve yuksek seviyeli Inspector bulgularini yakalar"

# SNS topic'i hedef olarak ekleme
aws events put-targets 
  --rule "InspectorCriticalFindings" 
  --targets '[{
    "Id": "SecurityTeamNotification",
    "Arn": "arn:aws:sns:us-east-1:123456789012:security-alerts",
    "InputTransformer": {
      "InputPathsMap": {
        "severity": "$.detail.severity",
        "title": "$.detail.title",
        "resource": "$.detail.resources[0].id",
        "score": "$.detail.inspectorScore"
      },
      "InputTemplate": ""GUVENLIK ALARMI | Ciddiyet: <severity> | Skor: <score>/10 | Kaynak: <resource> | Bulgu: <title>""
    }
  }]'

Slack entegrasyonu için Lambda fonksiyonu da yazabilirsiniz. Ekibinize anında Slack mesajı gönderen bu pattern, on-call rotasyonunuzda kullanıma hazır:

# lambda_function.py - Inspector bulgularını Slack'e gönderir
import json
import urllib.request
import os

def lambda_handler(event, context):
    detail = event.get('detail', {})
    
    severity = detail.get('severity', 'UNKNOWN')
    title = detail.get('title', 'Bilgi yok')
    score = detail.get('inspectorScore', 0)
    resources = detail.get('resources', [{}])
    resource_id = resources[0].get('id', 'Bilinmiyor') if resources else 'Bilinmiyor'
    
    # Ciddiyet seviyesine gore emoji secimi
    emoji_map = {
        'CRITICAL': ':red_circle:',
        'HIGH': ':orange_circle:',
        'MEDIUM': ':yellow_circle:',
        'LOW': ':white_circle:'
    }
    emoji = emoji_map.get(severity, ':grey_question:')
    
    package_details = detail.get('packageVulnerabilityDetails', {})
    cve_id = package_details.get('vulnerabilityId', 'N/A')
    
    vulnerable_packages = package_details.get('vulnerablePackages', [{}])
    pkg_info = vulnerable_packages[0] if vulnerable_packages else {}
    pkg_name = pkg_info.get('name', 'N/A')
    fixed_version = pkg_info.get('fixedInVersion', 'Duzeltme mevcut degil')
    
    message = {
        "blocks": [
            {
                "type": "header",
                "text": {
                    "type": "plain_text",
                    "text": f"{emoji} AWS Inspector Guvenlik Uyarisi"
                }
            },
            {
                "type": "section",
                "fields": [
                    {"type": "mrkdwn", "text": f"*Ciddiyet:* {severity}"},
                    {"type": "mrkdwn", "text": f"*Skor:* {score}/10"},
                    {"type": "mrkdwn", "text": f"*CVE:* {cve_id}"},
                    {"type": "mrkdwn", "text": f"*Etkilenen Kaynak:* {resource_id}"},
                    {"type": "mrkdwn", "text": f"*Paket:* {pkg_name}"},
                    {"type": "mrkdwn", "text": f"*Duzeltme:* {fixed_version}"}
                ]
            },
            {
                "type": "section",
                "text": {"type": "mrkdwn", "text": f"*Bulgu:* {title}"}
            }
        ]
    }
    
    webhook_url = os.environ['SLACK_WEBHOOK_URL']
    data = json.dumps(message).encode('utf-8')
    req = urllib.request.Request(
        webhook_url,
        data=data,
        headers={'Content-Type': 'application/json'}
    )
    
    with urllib.request.urlopen(req) as response:
        return {'statusCode': response.status}

Bulgularla Otomatik Patch Yönetimi

Inspector bulgularını tespit etmek yeterli değil, bunları bir patch workflow’una bağlamak asıl hedef. SSM Patch Manager ile entegrasyon burada devreye giriyor.

#!/bin/bash
# inspector-auto-patch.sh
# Kritik Inspector bulgularına sahip instance'lara otomatik patch uygular

REGION="us-east-1"
SEVERITY_THRESHOLD="CRITICAL"

# Kritik bulgulara sahip instance'ları çekme
AFFECTED_INSTANCES=$(aws inspector2 list-findings 
  --region $REGION 
  --filter-criteria "{
    "findingStatus": [{"comparison": "EQUALS", "value": "ACTIVE"}],
    "severity": [{"comparison": "EQUALS", "value": "$SEVERITY_THRESHOLD"}]
  }" 
  --query 'findings[*].resources[0].id' 
  --output text | tr 't' 'n' | grep "^i-" | sort -u)

if [ -z "$AFFECTED_INSTANCES" ]; then
  echo "Kritik bulgu olan instance bulunamadi."
  exit 0
fi

echo "Asagidaki instance'lara patch uygulanacak:"
echo "$AFFECTED_INSTANCES"

# SSM Run Command ile patch uygulama
for INSTANCE_ID in $AFFECTED_INSTANCES; do
  echo "Patch baslatiliyor: $INSTANCE_ID"
  
  COMMAND_ID=$(aws ssm send-command 
    --region $REGION 
    --instance-ids "$INSTANCE_ID" 
    --document-name "AWS-RunPatchBaseline" 
    --parameters '{"Operation":["Install"],"RebootOption":["RebootIfNeeded"]}' 
    --comment "Inspector kritik bulgu patch - $(date +%Y-%m-%d)" 
    --query 'Command.CommandId' 
    --output text)
  
  echo "Komut ID: $COMMAND_ID - Instance: $INSTANCE_ID"
  
  # Sonucu kaydetme
  echo "$INSTANCE_ID,$COMMAND_ID,$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> patch_operations.csv
done

echo "Patch operasyonlari baslatildi. Sonuclari patch_operations.csv dosyasindan takip edin."

ECR Container Taraması

Production’da container kullanan bir ortamda Inspector’ın ECR entegrasyonu hayat kurtarıcı. Image’ınızı push eder etmez tarama başlıyor ve deployment pipeline’ınızı buna göre yönetebiliyorsunuz.

# ECR'da enhanced scanning'i etkinleştirme
aws ecr put-registry-scanning-configuration 
  --scan-type ENHANCED 
  --rules '[{
    "repositoryFilters": [{"filter": "*", "filterType": "WILDCARD"}],
    "scanFrequency": "CONTINUOUS_SCAN"
  }]'

# Belirli bir image'ın tarama sonuçlarını getirme
IMAGE_TAG="myapp:latest"
REPO_NAME="my-application"

aws inspector2 list-findings 
  --filter-criteria "{
    "ecrImageTags": [{"comparison": "EQUALS", "value": "latest"}],
    "findingStatus": [{"comparison": "EQUALS", "value": "ACTIVE"}]
  }" 
  --query 'findings[*].{
    Severity:severity,
    CVE:packageVulnerabilityDetails.vulnerabilityId,
    Package:packageVulnerabilityDetails.vulnerablePackages[0].name,
    Version:packageVulnerabilityDetails.vulnerablePackages[0].version,
    Fix:packageVulnerabilityDetails.vulnerablePackages[0].fixedInVersion
  }' 
  --output json

CI/CD pipeline’ınıza eklemek istediğiniz gate kontrolü için şu yaklaşımı kullanabilirsiniz:

#!/bin/bash
# ci-security-gate.sh
# Pipeline'da kritik bulgu varsa deployment'i durdurur

REPO_NAME=$1
IMAGE_TAG=$2
MAX_CRITICAL=0  # Hiç kritik bulgu kabul edilmez

echo "Guvenlik taramasi bekleniyor: $REPO_NAME:$IMAGE_TAG"

# Taramanın tamamlanmasını bekleme
sleep 30

CRITICAL_COUNT=$(aws inspector2 list-findings 
  --filter-criteria "{
    "ecrImageTags": [{"comparison": "EQUALS", "value": "$IMAGE_TAG"}],
    "ecrImageRepositoryName": [{"comparison": "EQUALS", "value": "$REPO_NAME"}],
    "severity": [{"comparison": "EQUALS", "value": "CRITICAL"}],
    "findingStatus": [{"comparison": "EQUALS", "value": "ACTIVE"}]
  }" 
  --query 'length(findings)' 
  --output text)

HIGH_COUNT=$(aws inspector2 list-findings 
  --filter-criteria "{
    "ecrImageTags": [{"comparison": "EQUALS", "value": "$IMAGE_TAG"}],
    "ecrImageRepositoryName": [{"comparison": "EQUALS", "value": "$REPO_NAME"}],
    "severity": [{"comparison": "EQUALS", "value": "HIGH"}],
    "findingStatus": [{"comparison": "EQUALS", "value": "ACTIVE"}]
  }" 
  --query 'length(findings)' 
  --output text)

echo "Kritik bulgu: $CRITICAL_COUNT | Yuksek bulgu: $HIGH_COUNT"

if [ "$CRITICAL_COUNT" -gt "$MAX_CRITICAL" ]; then
  echo "HATA: $CRITICAL_COUNT kritik guvenlik acigi tespit edildi. Deployment durduruldu."
  exit 1
fi

echo "Guvenlik kontrolu gecildi. Deployment devam ediyor."
exit 0

Maliyet Yönetimi ve Optimizasyon

Inspector’ın maliyeti, taranan kaynak sayısıyla doğru orantılı artıyor. Bir fintech projemizde 500 instance ve 200 image’ı olan bir ortamda aylık Inspector maliyetinin beklenmedik seviyelere çıktığını gördük. Bu durumu yönetmek için bazı stratejiler:

Tarama kapsamını daraltma: Dev ortamındaki instance’ları Inspector kapsamı dışında tutabilirsiniz. Production ve staging’i tararken dev’i atlayabilirsiniz. Tag-based filtering bunun için kullanışlı.

# Belirli tag'lara sahip instance'ları kapsam dışına alma
# Inspector filter oluşturma - dev instance'larını dışlama
aws inspector2 create-filter 
  --name "ExcludeDevelopmentInstances" 
  --action SUPPRESS 
  --filter-criteria '{
    "ec2InstanceTags": [{
      "comparison": "EQUALS",
      "key": "Environment",
      "value": "development"
    }]
  }' 
  --description "Development instance'larindaki bulgulari gizler"

Maliyet takibi için Cost Explorer’da Inspector’a özgü filtre oluşturun. Aylık raporunuzu düzenli gözden geçirin. EC2 taraması instance başına saatlik ücretlendirilirken ECR taraması image layer boyutuna göre değişiyor.

Suppression filter’ların akıllıca kullanımı: Bilinen ve kabul edilmiş riskleri, ya da fix’i olmayan CVE’leri suppress filter’a ekleyerek gerçek alarmaların arasında gömülüp kalmasını önleyin. Bu hem maliyet değil ama operasyonel verimlilik açısından kritik.

Compliance ve Raporlama

Düzenleyici gereklilikler için Inspector bulgularını düzenli raporlara dönüştürmek gerekiyor. Inspector’ın built-in rapor özelliğini kullanabilirsiniz:

# Aylık güvenlik raporu oluşturma ve S3'e kaydetme
REPORT_BUCKET="security-reports-123456789012"
REPORT_DATE=$(date +%Y-%m)

REPORT_ID=$(aws inspector2 create-findings-report 
  --report-format CSV 
  --s3-destination "{
    "bucketName": "$REPORT_BUCKET",
    "keyPrefix": "inspector-reports/$REPORT_DATE/",
    "kmsKeyArn": "arn:aws:kms:us-east-1:123456789012:key/your-key-id"
  }" 
  --filter-criteria '{
    "findingStatus": [{"comparison": "EQUALS", "value": "ACTIVE"}]
  }' 
  --query 'reportId' 
  --output text)

echo "Rapor olusturuldu: $REPORT_ID"

# Rapor durumunu kontrol etme
aws inspector2 get-findings-report-status 
  --report-id "$REPORT_ID" 
  --query '{Status:status,Destination:destination}'

Bu raporu SecurityHub veya SOC ekibinizle paylaşarak compliance dashboard’larına entegre edebilirsiniz. PCI-DSS veya SOC2 denetimleri için bu raporlar doğrudan kanıt niteliği taşıyor.

Inspector’ı Security Hub ile Entegre Etme

Inspector bulguları Security Hub’a otomatik olarak iletilir. Bu entegrasyonu aktif ederseniz tüm güvenlik bulgularınızı tek ekrandan yönetebilirsiniz:

# Security Hub entegrasyonunu etkinleştirme
aws securityhub enable-security-hub 
  --enable-default-standards

# Inspector entegrasyonunu doğrulama
aws securityhub list-enabled-products-for-import 
  --query 'ProductSubscriptions[?contains(@, `inspector`)]'

# Security Hub üzerinden Inspector bulgularını sorgulama
aws securityhub get-findings 
  --filters '{
    "ProductName": [{"Value": "Inspector", "Comparison": "EQUALS"}],
    "SeverityLabel": [{"Value": "CRITICAL", "Comparison": "EQUALS"}],
    "RecordState": [{"Value": "ACTIVE", "Comparison": "EQUALS"}]
  }' 
  --query 'Findings[*].{Title:Title,Severity:Severity.Label,Resource:Resources[0].Id}' 
  --output table

Yaygın Sorunlar ve Çözümleri

Pratikte karşılaşılan en sık sorunlar ve hızlı çözümleri:

Instance’lar “Not Scanning” gösteriyor: SSM Agent’ın güncel olduğundan ve AmazonSSMManagedInstanceCore policy’sinin instance rolüne eklendiğinden emin olun. Network tarafında VPC endpoint veya internet erişimi gerekiyor.

ECR taraması tetiklenmiyor: Repository’de enhanced scanning’in etkin olduğunu doğrulayın. Basic scanning ile enhanced scanning birbirinden farklı, Inspector sadece enhanced ile çalışıyor.

Çok fazla false positive: Suppress filter’ları agresif kullanmak yerine findings’leri önce kategorize edin. Vendor tarafından kabul edilmiş, exploit’ı olmayan veya kontrollü ortamda bulunan bulguları ayrı bir listede tutun.

Maliyet patlaması: Lambda fonksiyonlarında Inspector etkin ettiyseniz ve çok sayıda fonksiyonunuz varsa maliyeti dikkatli izleyin. Fonksiyon bazında tag-based exclusion uygulayabilirsiniz.

Sonuç

AWS Inspector, doğru yapılandırıldığında güvenlik açığı yönetimini reaktif bir süreçten proaktif bir disipline dönüştürüyor. Önemli olan sadece etkinleştirip unutmak değil, bulguları bir workflow’a bağlamak, bildirimleri doğru kişilere yönlendirmek ve patch süreçleriyle entegre etmek.

Başlangıç için önerilen adımlar sırasıyla şunlar: Önce production hesabınızda Inspector’ı etkinleştirin ve bir hafta boyunca bulguları sadece izleyin. Ardından kritik bulgular için EventBridge bildirimi kurun. Sonra ECR pipeline’ınıza security gate ekleyin. Son aşamada ise SSM Patch Manager entegrasyonunu tamamlayın.

Inspector’ın sunduğu sürekli tarama özelliği, özellikle yeni CVE’lerin yoğun olduğu dönemlerde gerçek anlamda güvence sağlıyor. Log4shell döneminde Inspector kullanan ekiplerin etkilenen instance’ları saatler içinde tespit edip aksiyon alabildiğini, manuel süreç yürütenlerin ise günler harcadığını bizzat gördüm. Bu fark, gecenin üçündeki alarm ile sabah kahvenizie kavuşmanız arasındaki farkın ta kendisi.

Bir yanıt yazın

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