GCP Security Command Center ile Bulut Güvenliğini Yönetme
Google Cloud ortamında bir güvenlik olayı yaşandığında, “bu ne zaman başladı, hangi kaynaklar etkilendi, kim yaptı?” sorularına hızlıca cevap bulabilmek hayat kurtarır. Security Command Center (SCC) tam olarak bu noktada devreye giriyor. GCP’nin merkezi güvenlik ve risk yönetim platformu olan SCC, cloud ortamınızdaki tehditleri, yanlış yapılandırmaları ve güvenlik açıklarını tek bir yerden görmenizi sağlıyor. Bu yazıda SCC’yi gerçek dünya senaryolarıyla nasıl kullanacağınızı, gcloud CLI entegrasyonunu ve Terraform ile otomasyonu detaylıca ele alacağız.
Security Command Center Nedir ve Neden Önemlidir
SCC, GCP projeleriniz veya organizasyonunuz genelinde güvenlik bulgularını (findings) toplayan, analiz eden ve önceliklendiren bir platformdur. Temel olarak üç katmanda çalışır:
- Assets: GCP kaynaklarınızın envanteri (VM, bucket, firewall kuralı vb.)
- Findings: Güvenlik açığı veya tehdit tespiti sonuçları
- Sources: Bulguların kaynakları (Security Health Analytics, Event Threat Detection, Container Threat Detection vb.)
SCC’nin iki farklı tier’ı var:
- Standard (ücretsiz): Temel güvenlik sağlığı kontrolleri, asset envanter yönetimi
- Premium: Event Threat Detection, Container Threat Detection, Web Security Scanner, compliance raporları (PCI DSS, CIS, NIST)
Büyük ölçekli bir GCP ortamı yönetiyorsanız Premium tier olmadan ciddi blind spot’larla karşılaşabilirsiniz. Özellikle SOC ekibi olan organizasyonlar için Premium neredeyse zorunlu hale gelmiş durumda.
SCC’yi Aktifleştirme ve İlk Kurulum
SCC’yi organizasyon seviyesinde aktifleştirmek için Organization Admin veya Security Center Admin rolüne ihtiyacınız var.
# Organizasyon ID'nizi öğrenin
gcloud organizations list
# SCC API'yi aktifleştirin
gcloud services enable securitycenter.googleapis.com
--project=YOUR_PROJECT_ID
# Organizasyon seviyesinde SCC'yi başlatın
gcloud scc settings update
--organization=YOUR_ORG_ID
--enable-asset-discovery
Servis hesabı ve IAM rollerini düzenlemek için:
# SCC Admin rolü atama
gcloud organizations add-iam-policy-binding YOUR_ORG_ID
--member="user:[email protected]"
--role="roles/securitycenter.admin"
# Sadece okuma yetkisi için (SOC analistleri için ideal)
gcloud organizations add-iam-policy-binding YOUR_ORG_ID
--member="user:[email protected]"
--role="roles/securitycenter.findingsViewer"
# Findings'leri güncelleyebilecek ama silemeyecek rol
gcloud organizations add-iam-policy-binding YOUR_ORG_ID
--member="serviceAccount:[email protected]"
--role="roles/securitycenter.findingsEditor"
Findings ile Çalışma: Temel Sorgular
Günlük SCC operasyonlarının kalbi finding sorgularıdır. gcloud CLI ile hızlıca ilgili bulguları filtreleyebilirsiniz.
# Tüm aktif HIGH ve CRITICAL severity findings
gcloud scc findings list organizations/YOUR_ORG_ID
--filter="state=ACTIVE AND severity=HIGH OR severity=CRITICAL"
--format="table(name, category, severity, eventTime)"
# Belirli bir proje için findings
gcloud scc findings list organizations/YOUR_ORG_ID
--filter="state=ACTIVE AND resourceName:projects/YOUR_PROJECT_ID"
--format="json" | jq '.[] | {category: .category, severity: .severity, resource: .resourceName}'
# Son 24 saatteki yeni findings
gcloud scc findings list organizations/YOUR_ORG_ID
--filter="state=ACTIVE AND eventTime>="2024-01-15T00:00:00Z""
--page-size=50
Gerçek bir senaryoda, sabah işe geldiğinizde ilk yapacağınız şey overnight oluşan kritik bulguları taramak olabilir. Bunu bir script haline getirmek çok mantıklı:
#!/bin/bash
# daily_scc_report.sh - Her sabah çalıştırılan SCC özet scripti
ORG_ID="YOUR_ORG_ID"
YESTERDAY=$(date -d "yesterday" +%Y-%m-%dT%H:%M:%SZ)
SLACK_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
echo "=== SCC Günlük Güvenlik Raporu ==="
echo "Tarih: $(date)"
echo ""
# Critical findings say
CRITICAL_COUNT=$(gcloud scc findings list organizations/$ORG_ID
--filter="state=ACTIVE AND severity=CRITICAL AND eventTime>="$YESTERDAY""
--format="value(name)" | wc -l)
# High findings sayısı
HIGH_COUNT=$(gcloud scc findings list organizations/$ORG_ID
--filter="state=ACTIVE AND severity=HIGH AND eventTime>="$YESTERDAY""
--format="value(name)" | wc -l)
echo "Yeni Critical Findings: $CRITICAL_COUNT"
echo "Yeni High Findings: $HIGH_COUNT"
# Slack'e bildirim gönder
if [ "$CRITICAL_COUNT" -gt 0 ]; then
curl -s -X POST $SLACK_WEBHOOK
-H 'Content-type: application/json'
--data "{"text":"🚨 *SCC Uyarı*: Son 24 saatte $CRITICAL_COUNT CRITICAL, $HIGH_COUNT HIGH severity bulgu tespit edildi!"}"
fi
# Detaylı listeyi dosyaya yaz
gcloud scc findings list organizations/$ORG_ID
--filter="state=ACTIVE AND (severity=CRITICAL OR severity=HIGH) AND eventTime>="$YESTERDAY""
--format="table(category,severity,resourceName,eventTime)"
> /var/log/scc_daily_$(date +%Y%m%d).log
echo "Detaylı rapor: /var/log/scc_daily_$(date +%Y%m%d).log"
Yaygın Güvenlik Bulgularını Yorumlamak
SCC’den gelen her bulgu aynı aciliyette değildir. En sık karşılaşılan kategorileri ve ne anlama geldiklerini bilmek önemli.
PUBLIC_BUCKET_ACL: Cloud Storage bucket’ınız herkese açık. Bu neredeyse her zaman kritik bir sorundur. Özellikle veri bucket’larında bu bulgu görüldüğünde hemen aksiyon alın.
OPEN_FIREWALL: 0.0.0.0/0’a açık firewall kuralı. SSH (22), RDP (3389) veya veritabanı portları için bu durum ciddi risk oluşturur.
MFA_NOT_ENABLED: Kullanıcı hesaplarında MFA kapalı. Google Workspace entegrasyonu olan ortamlarda bu sıkça çıkan bir bulgu.
SERVICE_ACCOUNT_KEY_ROTATION: Servis hesabı anahtarları 90 günden uzun süredir döndürülmemiş.
LEGACY_AUTHORIZATION_ENABLED: GKE cluster’larında eski yetkilendirme mekanizması aktif.
Belirli bir finding kategorisi için detay almak:
# PUBLIC_BUCKET_ACL bulgularını listele ve etkilenen bucket'ları çıkar
gcloud scc findings list organizations/YOUR_ORG_ID
--filter="state=ACTIVE AND category=PUBLIC_BUCKET_ACL"
--format="json" |
jq -r '.[] | "Bucket: (.resourceName) | Zaman: (.eventTime)"'
# Bir finding'i mute etme (false positive durumunda)
gcloud scc findings update FINDING_NAME
--organization=YOUR_ORG_ID
--mute=MUTED
--mute-reason="Bu bucket intentionally public, statik web sitesi hostuyor"
Terraform ile SCC Otomasyonu
Manuel SCC yönetimi belirli bir noktaya kadar işe yarar ama büyük ortamlarda Infrastructure as Code yaklaşımı şart. Aşağıdaki Terraform konfigürasyonu SCC notification kanalları ve mute rule’ları kurar:
# scc_setup.tf
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
}
}
# SCC Notification Config - Pub/Sub'a findings gönder
resource "google_scc_notification_config" "critical_findings" {
config_id = "critical-findings-notif"
organization = var.org_id
description = "Critical ve High severity findings için bildirim"
pubsub_topic = google_pubsub_topic.scc_findings.id
streaming_config {
filter = "state = "ACTIVE" AND (severity = "CRITICAL" OR severity = "HIGH")"
}
}
# Pub/Sub topic
resource "google_pubsub_topic" "scc_findings" {
name = "scc-security-findings"
project = var.project_id
labels = {
environment = "production"
team = "security"
}
}
# Pub/Sub subscription - SIEM veya webhook için
resource "google_pubsub_subscription" "scc_findings_sub" {
name = "scc-findings-subscription"
topic = google_pubsub_topic.scc_findings.name
project = var.project_id
ack_deadline_seconds = 60
retry_policy {
minimum_backoff = "10s"
maximum_backoff = "300s"
}
expiration_policy {
ttl = "" # Subscription'ın süresi dolmasın
}
}
# Mute Rule - test projelerinde LOW severity bulgularını sustur
resource "google_scc_mute_config" "test_env_low" {
mute_config_id = "mute-test-low-severity"
organization = var.org_id
description = "Test ortamlarında LOW severity mute"
filter = "severity = "LOW" AND resourceName:"projects/test-""
}
# BigQuery'ye findings export (uzun vadeli analiz için)
resource "google_scc_project_custom_module" "export_config" {
# Bu kısım organizasyon politikanıza göre özelleştirin
display_name = "Custom Export Module"
enablement_state = "ENABLED"
project = var.project_id
custom_config {
severity = "MEDIUM"
description = "Özel güvenlik kuralı"
recommendation = "Kaynağı gözden geçirin"
predicate {
expression = "resource.type == "compute.googleapis.com/Instance""
}
resource_selector {
resource_types = ["compute.googleapis.com/Instance"]
}
}
}
Event Threat Detection ile Gerçek Zamanlı Tehdit Tespiti
Premium tier’ın en değerli özelliklerinden biri Event Threat Detection (ETD). Cloud audit loglarını ve DNS loglarını analiz ederek aktif saldırıları tespit eder.
ETD’nin tespit ettiği tehdit kategorileri:
- Brute Force: SSH veya RDP üzerinden deneme-yanılma saldırıları
- Malware: VM’lerde kötü amaçlı yazılım imzaları
- Data Exfiltration: Alışılmadık büyüklükte veri transferleri
- Crypto Mining: Yetkisiz kripto madencilik aktivitesi
- Impersonation: Servis hesabı token hırsızlığı
ETD bulgularını programatik olarak işlemek için Python örneği:
#!/usr/bin/env python3
# process_etd_findings.py
# Pub/Sub'dan gelen ETD bulgularını işle ve PagerDuty'ye yönlendir
import json
import base64
import requests
from google.cloud import pubsub_v1
PROJECT_ID = "your-project-id"
SUBSCRIPTION_ID = "scc-findings-subscription"
PAGERDUTY_API_KEY = "your-pd-api-key"
PAGERDUTY_SERVICE_ID = "your-service-id"
def create_pagerduty_incident(finding):
"""Kritik bulgu için PagerDuty incident oluştur"""
headers = {
"Authorization": f"Token token={PAGERDUTY_API_KEY}",
"Content-Type": "application/json",
"From": "[email protected]"
}
payload = {
"incident": {
"type": "incident",
"title": f"[GCP SCC] {finding.get('category', 'Unknown')} - {finding.get('severity', 'Unknown')}",
"service": {
"id": PAGERDUTY_SERVICE_ID,
"type": "service_reference"
},
"urgency": "high" if finding.get("severity") == "CRITICAL" else "low",
"body": {
"type": "incident_body",
"details": json.dumps(finding, indent=2)
}
}
}
response = requests.post(
"https://api.pagerduty.com/incidents",
json=payload,
headers=headers
)
if response.status_code == 201:
print(f"PagerDuty incident olusturuldu: {response.json()['incident']['id']}")
else:
print(f"PagerDuty hatasi: {response.status_code} - {response.text}")
def process_finding(message):
"""Pub/Sub mesajından finding'i parse et ve islem yap"""
try:
data = json.loads(base64.b64decode(message.data).decode("utf-8"))
finding = data.get("finding", {})
severity = finding.get("severity", "")
category = finding.get("category", "")
state = finding.get("state", "")
print(f"Finding alindi: {category} | {severity} | {state}")
# Sadece aktif ve kritik bulguları islem yap
if state == "ACTIVE" and severity in ["CRITICAL", "HIGH"]:
# Kripto madenciligi tespiti - aninda aksiyon
if category == "Malware: Cryptomining Bad Domain":
print(f"KRIPTO MADENCILIGI TESPITI! Kaynak: {finding.get('resourceName')}")
create_pagerduty_incident(finding)
# Burada otomatik VM izolasyonu da tetiklenebilir
# Veri sizdirma tespiti
elif category == "Exfiltration: BigQuery Data Exfiltration":
print(f"VERI SIZDIRMA TESPITI! Kaynak: {finding.get('resourceName')}")
create_pagerduty_incident(finding)
else:
# Diger kritik bulgular icin incident ac
create_pagerduty_incident(finding)
message.ack()
except Exception as e:
print(f"Mesaj isleme hatasi: {e}")
message.nack()
def main():
subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(PROJECT_ID, SUBSCRIPTION_ID)
print(f"SCC findings dinleniyor: {subscription_path}")
streaming_pull_future = subscriber.subscribe(
subscription_path,
callback=process_finding
)
try:
streaming_pull_future.result()
except KeyboardInterrupt:
streaming_pull_future.cancel()
print("Durduruldu.")
if __name__ == "__main__":
main()
Compliance Raporları ve Posture Yönetimi
SCC Premium, CIS Google Cloud Benchmark, PCI DSS, NIST 800-53 gibi standartlara göre uyum durumunuzu otomatik değerlendirir. Denetim dönemlerinde bu özellik inanılmaz zaman kazandırır.
# CIS benchmark sonuçlarını CSV olarak export et
gcloud scc findings list organizations/YOUR_ORG_ID
--filter="state=ACTIVE AND sourceProperties.compliance_standards:CIS"
--format="csv(category,severity,resourceName,eventTime,sourceProperties.explanation)"
> cis_compliance_$(date +%Y%m%d).csv
# PCI DSS bulgularını listele
gcloud scc findings list organizations/YOUR_ORG_ID
--filter="state=ACTIVE AND sourceProperties.compliance_standards:PCI_DSS"
--format="table(category,severity,resourceName)"
--sort-by="severity"
# Belirli bir kaynağın tüm geçmiş bulgularını al
gcloud scc findings list organizations/YOUR_ORG_ID
--filter="resourceName="//compute.googleapis.com/projects/YOUR_PROJECT/zones/us-central1-a/instances/prod-web-01""
--format="table(category,severity,state,eventTime)"
--sort-by="~eventTime"
Aylık compliance raporunu otomatik oluşturup Google Drive’a yüklemek için bir Cloud Scheduler + Cloud Run kombinasyonu kurabilirsiniz. Bu pattern özellikle CISO raporlaması yapan ekiplerde çok işe yarıyor.
BigQuery ile SCC Findings Analizi
Uzun vadeli trend analizi ve güvenlik metrikleri için SCC bulgularını BigQuery’ye export etmek standart bir pratik haline geldi.
# BigQuery export için dataset oluştur
bq mk --dataset
--description "SCC Findings Analiz Dataseti"
--location EU
YOUR_PROJECT_ID:scc_findings_dataset
# SCC'den BigQuery'ye sürekli export kur (Console üzerinden veya API ile)
# Export aktif olduktan sonra örnek analiz sorguları:
# Son 30 günün kritik bulgu trendi
bq query --use_legacy_sql=false '
SELECT
DATE(eventTime) as tarih,
severity,
COUNT(*) as bulgu_sayisi
FROM `YOUR_PROJECT.scc_findings_dataset.findings`
WHERE
eventTime >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
AND state = "ACTIVE"
AND severity IN ("CRITICAL", "HIGH")
GROUP BY 1, 2
ORDER BY 1 DESC, bulgu_sayisi DESC
'
# En çok bulgu üretilen proje/kaynak
bq query --use_legacy_sql=false '
SELECT
REGEXP_EXTRACT(resourceName, r"projects/([^/]+)") as proje,
category,
COUNT(*) as toplam
FROM `YOUR_PROJECT.scc_findings_dataset.findings`
WHERE state = "ACTIVE"
GROUP BY 1, 2
ORDER BY toplam DESC
LIMIT 20
'
Asset Envanteri Yönetimi
SCC’nin asset inventory özelliği, GCP ortamınızda ne olduğunu anlık takip etmenizi sağlar. Shadow IT tespiti ve drift yönetimi için kritik bir araç.
# Tüm public IP'ye sahip VM'leri listele
gcloud scc assets list organizations/YOUR_ORG_ID
--filter="securityCenterProperties.resourceType="google.compute.Instance" AND resourceProperties.networkInterfaces.accessConfigs.natIP:*"
--format="table(name,resourceProperties.name,resourceProperties.status)"
# Son 24 saatte oluşturulan tüm kaynaklar
gcloud scc assets list organizations/YOUR_ORG_ID
--filter="createTime>="$(date -d 'yesterday' --utc +%Y-%m-%dT%H:%M:%SZ)""
--format="table(securityCenterProperties.resourceType,name,createTime)"
# IAM policy'si olan tüm service account'ları bul
gcloud scc assets list organizations/YOUR_ORG_ID
--filter="securityCenterProperties.resourceType="google.iam.ServiceAccount""
--format="json" | jq -r '.[] | .name'
Gerçek Dünya Senaryosu: Veri Sızıntısı Müdahalesi
Geçen yıl yaşadığım bir olayı paylaşayım. Production ortamında bir developer, test amacıyla bir Cloud Storage bucket’ını yanlışlıkla herkese açık yaptı. SCC 3 dakika içinde PUBLIC_BUCKET_ACL bulgusunu üretti ve Slack kanalımıza bildirim düştü.
Müdahale süreci şu şekilde ilerledi:
İlk kontrol olarak etkilenen bucket’ı tespit ettik ve içeriğini hızlıca gözden geçirdik. Ardından bucket’ı hemen private’a çektik:
# Bucket'ı hemen private yap
gsutil iam ch -d allUsers gs://AFFECTED_BUCKET_NAME
gsutil iam ch -d allAuthenticatedUsers gs://AFFECTED_BUCKET_NAME
# Erişim loglarını çek - kim ne zaman erişti?
gsutil logging get gs://AFFECTED_BUCKET_NAME
gcloud logging read
'resource.type="gcs_bucket" AND resource.labels.bucket_name="AFFECTED_BUCKET_NAME" AND protoPayload.methodName="storage.objects.get"'
--freshness=24h
--format="json" |
jq -r '.[] | "(.timestamp) | (.protoPayload.authenticationInfo.principalEmail) | (.protoPayload.resourceName)"'
# SCC finding'i resolved olarak işaretle
gcloud scc findings update FINDING_NAME
--organization=YOUR_ORG_ID
--state=INACTIVE
Bu olay, SCC’nin otomatik bildirim altyapısının ne kadar kritik olduğunu bir kez daha gösterdi. Manuel kontrol yapsaydık muhtemelen saatler geçecekti.
SCC Maliyet Optimizasyonu
SCC kullanımı da maliyetsiz değil. Premium tier organizasyon genelinde aktif edildiğinde maliyetler hızlı artabilir.
Maliyet kontrolü için öneriler:
- Staging ve dev projelerini Standard tier’da bırakın: Sadece production projelerinde Premium aktifleştirin
- Mute rule’larını agresif kullanın: Bilinen false positive’leri mutlaka mute’layın, bunlar billing’i etkilemez ama noise azaltır
- Findings retention süresini yönetin: Varsayılan 13 ay retention yeterince uzun, BigQuery’ye export edip SCC’deki tutma süresini kısaltabilirsiniz
- Custom modules dikkatli kullanın: Her özel kural ek tarama maliyeti getirebilir
- Scheduled exports yerine streaming kullanın: BigQuery’ye sürekli export yerine sadece gerekli verileri streaming ile alın
Sonuç
Security Command Center, GCP ortamının güvenliğini merkezi olarak yönetmek için olmazsa olmaz bir araç. Temel kullanım için gcloud CLI yeterli olsa da gerçek değer, Pub/Sub entegrasyonu, otomatik müdahale scriptleri ve BigQuery analitiğini bir araya getirdiğinizde ortaya çıkıyor.
Başlangıç için önerdiğim yol haritası şu şekilde: İlk hafta SCC’yi aktifleştirin ve mevcut bulgulara bakın, ikinci haftada Slack veya PagerDuty entegrasyonunu kurun, birinci ayda Terraform ile tüm konfigürasyonu kodlayın, üçüncü ayda BigQuery analitik dashboard’u hazırlayın.
Güvenlik bir araçtan ibaret değil, süreç meselesi. SCC size görünürlük sağlar ama bu görünürlüğü aksiyona dönüştürmek için iyi tanımlanmış playbook’lara ve sorumlulukların net dağılımına ihtiyaç var. Tek kişilik bir ekipseniz, en azından kritik bulgular için otomatik Slack bildirimi ve haftalık manuel review rutini oluşturun. Bu bile sizi çok daha güvenli bir noktaya taşıyacaktır.
