AWS Macie ile Hassas Veri Tespiti ve Veri Güvenliğini Sağlama

Bir gün production S3 bucket’larınızı karıştırırken aklınıza şu soru gelmiş olabilir: “Acaba bu bucket’larda kredi kartı numarası, kimlik bilgisi ya da başka hassas veri var mı?” Eğer bu soruyu hiç sormadıysanız, sormanız gerekiyor. Çünkü büyük ihtimalle var ve siz bundan habersizsiniz.

AWS Macie tam da bu noktada devreye giriyor. Makine öğrenmesi ve örüntü eşleştirme kullanarak S3 bucket’larınızdaki hassas verileri otomatik olarak tespit eden, sınıflandıran ve sizi uyaran bir güvenlik servisi. GDPR, KVKK, PCI-DSS gibi uyumluluk gereksinimleriniz varsa, Macie artık bir lüks değil zorunluluk.

Bu yazıda Macie’yi sıfırdan kurarak gerçek dünya senaryolarında nasıl kullanacağınızı, maliyet optimizasyonunu nasıl yapacağınızı ve otomasyon ile nasıl entegre edeceğinizi ele alacağız.

AWS Macie Nedir ve Nasıl Çalışır

Macie, S3 üzerindeki verilerinizi analiz etmek için iki temel mekanizma kullanır:

Managed Data Identifiers: AWS’nin önceden tanımladığı, kredi kartı numaraları, sosyal güvenlik numaraları, IBAN, pasaport numaraları gibi yüzlerce hassas veri tipini kapsayan hazır tanımlayıcılar.

Custom Data Identifiers: Kendi regex pattern’larınızı ve anahtar kelimelerinizi tanımlayabileceğiniz özel tanımlayıcılar. Örneğin şirketinize özgü müşteri ID formatı veya dahili belge kodlaması.

Macie’nin çalışma mantığı şöyle: Bir discovery job başlatıyorsunuz, Macie belirlediğiniz bucket’ları tarayarak obje metadata’sını ve içeriğini analiz ediyor, bulgularını (findings) EventBridge’e, Security Hub’a veya S3’e yazıyor. Siz de bu bulguları işleyerek aksiyon alıyorsunuz.

Önemli bir nokta: Macie verilerinizi depolamıyor. Tarama sırasında geçici olarak okuma yapıyor ve sonuçları sadece metadata olarak saklıyor.

Macie’yi Aktifleştirmek

Tek Hesap İçin Aktivasyon

Konsol üzerinden aktifleştirebilirsiniz ama biz her şeyi kod ile yapalım:

# Macie'yi aktifleştir
aws macie2 enable-macie 
  --finding-publishing-frequency FIFTEEN_MINUTES 
  --status ENABLED 
  --region eu-west-1

# Aktivasyon durumunu kontrol et
aws macie2 get-macie-session 
  --region eu-west-1

Multi-Account Ortamında Macie

Gerçek dünya senaryolarında genellikle AWS Organizations ile çalışırsınız. Bu durumda merkezi bir yönetim hesabından tüm member account’ları yönetmek istersiniz:

# Organizations delegated administrator hesabını belirle
aws macie2 enable-organization-admin-account 
  --admin-account-id 123456789012 
  --region eu-west-1

# Tüm member account'ları otomatik enable et
aws macie2 update-organization-configuration 
  --auto-enable 
  --region eu-west-1

# Member account'ları listele
aws macie2 list-members 
  --only-associated 
  --region eu-west-1

Büyük bir organizasyonda bu ayarı yapmak saatler sürebilecek manuel işi dakikalara indiriyor. Özellikle 50+ hesaplı yapılarda bu fark kritik.

S3 Bucket Envanteri ve İlk Değerlendirme

Macie aktif olduktan sonra önce mevcut bucket güvenlik durumuna bakalım:

# Tüm bucket'ların güvenlik özetini al
aws macie2 describe-buckets 
  --region eu-west-1 
  --query 'buckets[].{Name:bucketName, Public:publicAccess.effectivePermission, Encryption:serverSideEncryption.type, Versioning:versioning.mfaDelete}' 
  --output json | jq '.'

# Sadece public erişimli bucket'ları filtrele
aws macie2 describe-buckets 
  --criteria '{"publicAccess.effectivePermission":{"eq":["PUBLIC"]}}' 
  --region eu-west-1 
  --query 'buckets[].bucketName' 
  --output text

Bu komut size “hangi bucket’larım dışarıdan erişilebilir?” sorusunu anında yanıtlıyor. Production ortamında bu listeyi boş görmek istiyorsunuz.

Classification Job Oluşturmak

Asıl iş buradan başlıyor. Macie’de iki tür job var:

One-time job: Anlık tarama yapar, biter. Scheduled job: Periyodik olarak çalışır, yeni eklenen objeleri de yakalar.

Temel Bir Tarama Job’u

# Tek seferlik hassas veri tarama job'u oluştur
aws macie2 create-classification-job 
  --job-type ONE_TIME 
  --name "initial-sensitive-data-scan" 
  --description "Ilk hassas veri taramasi - Tum bucketlar" 
  --managed-data-identifier-selector ALL 
  --s3-job-definition '{
    "bucketDefinitions": [
      {
        "accountId": "123456789012",
        "buckets": [
          "mycompany-prod-data",
          "mycompany-backup-bucket",
          "mycompany-user-uploads"
        ]
      }
    ]
  }' 
  --region eu-west-1

Scheduled Job ile Sürekli İzleme

Production ortamı için one-time tarama yeterli değil. Yeni veriler gelmeye devam ediyor:

# Her gün çalışan scheduled job
aws macie2 create-classification-job 
  --job-type SCHEDULED 
  --name "daily-sensitive-data-monitoring" 
  --schedule-frequency '{"dailySchedule": {}}' 
  --managed-data-identifier-selector ALL 
  --sampling-percentage 100 
  --s3-job-definition '{
    "bucketDefinitions": [
      {
        "accountId": "123456789012",
        "buckets": [
          "mycompany-prod-data",
          "mycompany-user-uploads"
        ]
      }
    ],
    "scoping": {
      "includes": {
        "and": [
          {
            "simpleScopeTerm": {
              "comparator": "GT",
              "key": "OBJECT_SIZE",
              "values": ["1024"]
            }
          }
        ]
      }
    }
  }' 
  --region eu-west-1

Burada scoping ile 1KB’den küçük objeleri atlıyoruz. Gereksiz maliyet oluşturmamak için bu tür filtreleri kullanmak önemli.

Custom Data Identifier Tanımlamak

Türkiye’de çalışıyorsanız TC Kimlik Numarası gibi yerel hassas verileri de tanımlamanız gerekiyor:

# TC Kimlik Numarası için custom identifier
aws macie2 create-custom-data-identifier 
  --name "tc-kimlik-numarasi" 
  --description "Turkiye Cumhuriyeti Kimlik Numarasi" 
  --regex "(?<![0-9])[1-9][0-9]{10}(?![0-9])" 
  --keywords "TC Kimlik" "kimlik no" "TCKN" "nüfus cüzdanı" 
  --maximum-match-distance 300 
  --region eu-west-1

# IBAN formatı için custom identifier
aws macie2 create-custom-data-identifier 
  --name "turkish-iban" 
  --description "Turkiye IBAN formati" 
  --regex "TR[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{4}[0-9]{4}[0-9]{4}[0-9]{2}" 
  --keywords "IBAN" "banka hesabı" "hesap numarası" 
  --region eu-west-1

Custom identifier oluştururken dikkat edilmesi gerekenler:

  • regex: Python regex syntax kullanıyor, test etmeyi unutmayın
  • keywords: Pattern eşleşmesinin yanında bu kelimelerin de yakında bulunması şartını koyuyor, false positive’leri azaltıyor
  • maximum-match-distance: Keyword ile pattern arası maksimum karakter mesafesi

Custom Identifier’ı Test Etmek

# Oluşturduğunuz custom identifier'ı test et
aws macie2 test-custom-data-identifier 
  --regex "(?<![0-9])[1-9][0-9]{10}(?![0-9])" 
  --sample-text "Musteri TC Kimlik No: 12345678901" 
  --region eu-west-1

Bir pattern yazıp direkt production’a almak yerine bu test komutunu kullanın. Yanlış bir regex ile binlerce false positive bulgu alabilirsiniz.

Findings Yönetimi ve Analizi

Tarama tamamlandıktan sonra bulguları incelemeniz gerekiyor:

# Tüm aktif bulguları listele
aws macie2 list-findings 
  --finding-criteria '{
    "criterion": {
      "severity.description": {
        "eq": ["High", "Critical"]
      }
    }
  }' 
  --region eu-west-1

# Bulgu detaylarını al
aws macie2 get-findings 
  --finding-ids "finding-id-1" "finding-id-2" 
  --region eu-west-1 
  --output json | jq '.findings[] | {bucket: .resourcesAffected.s3Bucket.name, object: .resourcesAffected.s3Object.key, type: .type, severity: .severity.description}'

Bulgu tipleri şunlar:

  • SensitiveData:S3Object/Credentials – Erişim anahtarları, şifreler
  • SensitiveData:S3Object/Financial – Kredi kartı, banka bilgileri
  • SensitiveData:S3Object/Personal – Kişisel kimlik bilgileri
  • SensitiveData:S3Object/Multiple – Birden fazla kategori
  • SensitiveData:S3Object/CustomIdentifier – Sizin tanımladıklarınız

EventBridge ile Otomatik Aksiyon

Bulguları sadece görmek yetmez, üzerlerine otomatik aksiyon almanız gerekiyor. Burada EventBridge devreye giriyor:

# Macie findings için EventBridge rule oluştur
aws events put-rule 
  --name "macie-high-severity-findings" 
  --event-pattern '{
    "source": ["aws.macie"],
    "detail-type": ["Macie Finding"],
    "detail": {
      "severity": {
        "description": ["High", "Critical"]
      }
    }
  }' 
  --state ENABLED 
  --region eu-west-1

# SNS topic'e bildirim gönder
aws events put-targets 
  --rule "macie-high-severity-findings" 
  --targets '[
    {
      "Id": "security-team-sns",
      "Arn": "arn:aws:sns:eu-west-1:123456789012:security-alerts"
    }
  ]' 
  --region eu-west-1

Lambda ile Otomatik Remediation

Yüksek önem dereceli bir bulgu geldiğinde ilgili objeyi otomatik olarak karantinaya almak için Lambda kullanabilirsiniz:

# Lambda fonksiyonu için kod oluştur
cat > quarantine_handler.py << 'EOF'
import boto3
import json
import os

s3 = boto3.client('s3')
s3_resource = boto3.resource('s3')

def handler(event, context):
    detail = event.get('detail', {})
    
    # Etkilenen bucket ve objeyi al
    affected_resources = detail.get('resourcesAffected', {})
    bucket_name = affected_resources.get('s3Bucket', {}).get('name')
    object_key = affected_resources.get('s3Object', {}).get('key')
    
    if not bucket_name or not object_key:
        print("Bucket veya obje bilgisi bulunamadi")
        return
    
    quarantine_bucket = os.environ['QUARANTINE_BUCKET']
    severity = detail.get('severity', {}).get('description', 'Unknown')
    
    print(f"Karantinaya aliniyor: s3://{bucket_name}/{object_key}")
    print(f"Severity: {severity}")
    
    # Objeyi karantina bucket'a kopyala
    copy_source = {'Bucket': bucket_name, 'Key': object_key}
    quarantine_key = f"quarantine/{bucket_name}/{object_key}"
    
    s3_resource.meta.client.copy(
        copy_source,
        quarantine_bucket,
        quarantine_key
    )
    
    # Orijinal objeyi tag'le (silmek yerine)
    s3.put_object_tagging(
        Bucket=bucket_name,
        Key=object_key,
        Tagging={
            'TagSet': [
                {'Key': 'macie-quarantine', 'Value': 'true'},
                {'Key': 'macie-severity', 'Value': severity},
                {'Key': 'quarantine-location', 'Value': quarantine_key}
            ]
        }
    )
    
    print(f"Karantina tamamlandi: s3://{quarantine_bucket}/{quarantine_key}")
    return {'status': 'quarantined', 'original': object_key, 'quarantine': quarantine_key}
EOF

# Lambda fonksiyonu oluştur
aws lambda create-function 
  --function-name macie-quarantine-handler 
  --runtime python3.11 
  --role arn:aws:iam::123456789012:role/macie-lambda-role 
  --handler quarantine_handler.handler 
  --zip-file fileb://quarantine_handler.zip 
  --environment Variables={QUARANTINE_BUCKET=mycompany-quarantine-bucket} 
  --timeout 60 
  --region eu-west-1

Terraform ile Infrastructure as Code

Tek tek komut çalıştırmak yerine tüm altyapıyı Terraform ile yönetmek çok daha sürdürülebilir:

# main.tf dosyası oluştur
cat > macie_setup.tf << 'TERRAFORM'
resource "aws_macie2_account" "main" {
  finding_publishing_frequency = "FIFTEEN_MINUTES"
  status                       = "ENABLED"
}

resource "aws_macie2_custom_data_identifier" "tckn" {
  name                   = "tc-kimlik-numarasi"
  description            = "TC Kimlik Numarasi"
  regex                  = "(?<![0-9])[1-9][0-9]{10}(?![0-9])"
  keywords               = ["TC Kimlik", "TCKN"]
  maximum_match_distance = 300

  depends_on = [aws_macie2_account.main]
}

resource "aws_macie2_classification_job" "daily_scan" {
  job_type    = "SCHEDULED"
  name        = "daily-sensitive-data-scan"
  description = "Gunluk hassas veri taramasi"

  schedule_frequency {
    daily_schedule {}
  }

  s3_job_definition {
    bucket_definitions {
      account_id = data.aws_caller_identity.current.account_id
      buckets    = var.buckets_to_scan
    }
  }

  depends_on = [aws_macie2_account.main]
}

resource "aws_cloudwatch_event_rule" "macie_findings" {
  name        = "macie-critical-findings"
  description = "Macie kritik bulgulari"

  event_pattern = jsonencode({
    source      = ["aws.macie"]
    detail-type = ["Macie Finding"]
    detail = {
      severity = {
        description = ["High", "Critical"]
      }
    }
  })
}
TERRAFORM

echo "Terraform dosyasi olusturuldu"

Maliyet Yönetimi ve Optimizasyon

Macie’nin maliyeti iki bileşenden oluşuyor:

  • Bucket inventory and monitoring: Her hesap için ilk 30 gün ücretsiz, sonrasında bucket başına aylık ücret
  • Sensitive data discovery: GB başına ücretlendirme (ilk ay 1GB ücretsiz)

Büyük bucket’larınız varsa maliyet hızla artabilir. Bunu kontrol altında tutmak için:

# Tarama kapsamını daraltmak için scoping kullan
# Sadece son 7 gunde degisen objeleri tara
aws macie2 create-classification-job 
  --job-type SCHEDULED 
  --name "incremental-daily-scan" 
  --schedule-frequency '{"dailySchedule": {}}' 
  --s3-job-definition '{
    "bucketDefinitions": [
      {
        "accountId": "123456789012",
        "buckets": ["mycompany-prod-data"]
      }
    ],
    "scoping": {
      "includes": {
        "and": [
          {
            "simpleScopeTerm": {
              "comparator": "GT",
              "key": "OBJECT_SIZE",
              "values": ["1024"]
            }
          },
          {
            "simpleScopeTerm": {
              "comparator": "EQ",
              "key": "OBJECT_EXTENSION",
              "values": ["csv", "json", "txt", "xlsx", "pdf"]
            }
          }
        ]
      },
      "excludes": {
        "and": [
          {
            "simpleScopeTerm": {
              "comparator": "STARTS_WITH",
              "key": "OBJECT_KEY",
              "values": ["logs/", "temp/", "archive/2020/"]
            }
          }
        ]
      }
    }
  }' 
  --sampling-percentage 25 
  --region eu-west-1

Maliyet optimizasyonu için pratik öneriler:

  • sampling-percentage parametresi ile %100 yerine örnekleme yapın. Log dosyaları için %25 bile yeterli olabilir.
  • Eski arşiv verilerini taramanın önceliği düşük, sıklığı azaltın.
  • Zaten şifreli ve kısıtlı erişimli bucket’ları günlük yerine aylık tarayın.
  • Geliştirme ortamlarında Macie’yi disabled modda bırakıp sadece production’da aktif tutun.
  • Tarama kapsamından log dosyaları, temp klasörleri ve bilinen güvenli dizinleri hariç tutun.

Security Hub Entegrasyonu

Macie bulgularını merkezi güvenlik gözetleme platformuna dahil etmek için Security Hub entegrasyonunu aktifleştirin:

# Security Hub'da Macie entegrasyonunu aktifleştir
aws securityhub enable-import-findings-for-product 
  --product-arn arn:aws:securityhub:eu-west-1::product/aws/macie 
  --region eu-west-1

# Mevcut Macie bulgularını Security Hub formatında sorgula
aws securityhub get-findings 
  --filters '{
    "ProductName": [{"Value": "Macie", "Comparison": "EQUALS"}],
    "SeverityLabel": [
      {"Value": "HIGH", "Comparison": "EQUALS"},
      {"Value": "CRITICAL", "Comparison": "EQUALS"}
    ],
    "RecordState": [{"Value": "ACTIVE", "Comparison": "EQUALS"}]
  }' 
  --region eu-west-1 
  --query 'Findings[].{Title:Title, Severity:Severity.Label, Resource:Resources[0].Id}' 
  --output json

Security Hub entegrasyonunu açtıktan sonra tüm bulguları tek bir dashboarddan görebilir, GuardDuty, Inspector ve diğer servislerle birleştirerek korelasyon yapabilirsiniz.

Gerçek Dünya Senaryosu: KVKK Uyumluluk Denetimi

Diyelim ki KVKK denetimi öncesinde tüm S3 verilerinizi gözden geçirmeniz gerekiyor. Bu senaryo için yapılacaklar şöyle:

Önce tüm bucket’ları bir kerelik tam tarama ile geçiriyorsunuz. Ardından bulgular arasından kişisel veri içerenleri filtreliyorsunuz:

# Kisisel veri bulgularini listele ve CSV'e aktar
aws macie2 list-findings 
  --finding-criteria '{
    "criterion": {
      "type": {
        "eq": ["SensitiveData:S3Object/Personal"]
      }
    }
  }' 
  --region eu-west-1 
  --output json | 
  jq -r '.findingIds[]' > finding_ids.txt

# Bulgu detaylarini toplu al
while IFS= read -r finding_id; do
  aws macie2 get-findings 
    --finding-ids "$finding_id" 
    --region eu-west-1 
    --query 'findings[0].{ID:id, Bucket:resourcesAffected.s3Bucket.name, Object:resourcesAffected.s3Object.key, Type:type, Severity:severity.description, CreatedAt:createdAt}' 
    --output json
done < finding_ids.txt | jq -s '.' > kvkk_audit_report.json

echo "KVKK denetim raporu olusturuldu: kvkk_audit_report.json"
cat kvkk_audit_report.json | jq 'length' | xargs echo "Toplam bulgu sayisi:"

Bu çıktıyı denetçilere sunduğunuzda hangi dosyaların kişisel veri içerdiğini, nerede bulunduğunu ve ne zaman tespit edildiğini açıkça gösterebiliyorsunuz. Ayrıca bu bulguları işleyerek ilgili veri sorumlusuna bildirme sürecinizi otomatize edebilirsiniz.

Suppress Rules ile False Positive Yönetimi

Her zaman doğru tespit olmayabilir. Örneğin test verilerini içeren bir bucket sürekli uyarı üretiyorsa bunu bastırabilirsiniz:

# Test bucket'i icin suppress rule olustur
aws macie2 create-findings-filter 
  --name "suppress-test-bucket-findings" 
  --description "Test ortami bulgu bastirma" 
  --action ARCHIVE 
  --finding-criteria '{
    "criterion": {
      "resourcesAffected.s3Bucket.name": {
        "eq": ["mycompany-test-data", "mycompany-dev-uploads"]
      }
    }
  }' 
  --position 1 
  --region eu-west-1

Suppress rule oluştururken dikkatli olun. Gerçek hassas veriyi de bastırmaya başlayabilirsiniz. Bu kuralları düzenli olarak gözden geçirin.

Sonuç

AWS Macie, S3 verilerinizin güvenliği konusunda reaktif bir yaklaşımdan proaktif bir yaklaşıma geçmenizi sağlıyor. “Hassas veri var mı?” sorusunu sorduğunuzda cevabı bulmak artık günler değil dakikalar alıyor.

Bu yazıda ele aldığımız konuları özetlersek:

  • Macie’yi tek hesap ve Organizations ortamında aktifleştirmek
  • Scheduled job’lar ile sürekli izleme kurmak
  • TC Kimlik, IBAN gibi yerel hassas verileri için custom identifier yazmak
  • EventBridge ve Lambda ile otomatik remediation akışı oluşturmak
  • Maliyet kontrol için scoping ve sampling kullanmak
  • Security Hub ile merkezi güvenlik görünürlüğü sağlamak
  • KVKK gibi uyumluluk gereksinimlerini otomatik raporlamak

Başlangıç noktası olarak şunları öneririm: Önce tüm bucket’larınızı bir kerelik tarayın, çıkan yüksek önem dereceli bulgularla ilgilenin. Ardından kritik bucket’lar için scheduled job kurun. Maliyet takibini Cost Explorer ile yapın ve aylık review alışkanlığı edinin.

Güvenlik her zaman bir denge oyunu. Macie’yi doğru yapılandırdığınızda hem güvenlik açıklarınızı kapatıyor hem de uyumluluk raporlamanızı otomatize ediyor. Ve şunu söyleyeyim, bir gün gerçekten bir bucket’ta üretim veritabanı dump’ı bulduğunuzda bu servise harcadığınız her kuruşa değdiğini anlıyorsunuz.

Bir yanıt yazın

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