Azure Security Center ile Bulut Güvenlik Yönetimi

Bulut ortamlarında güvenlik artık sadece bir tercih değil, zorunluluk haline geldi. Azure’da onlarca sanal makine, depolama hesabı, veritabanı ve ağ kaynağı yönetirken hangi sistemin açık kapısı olduğunu, hangi VM’in yamasız kaldığını veya hangi depolama hesabının dışarıya açık olduğunu takip etmek gerçekten zorlaşıyor. İşte bu noktada Microsoft Defender for Cloud (eski adıyla Azure Security Center) devreye giriyor. Bu yazıda Azure Security Center’ı sysadmin perspektifinden ele alacağız: kurulum, yapılandırma, otomatik düzeltmeler ve gerçek dünya senaryoları.

Azure Security Center Nedir ve Neden Önemli?

Azure Security Center, temel olarak bulut ortamınızdaki güvenlik duruşunu (security posture) sürekli izleyen ve iyileştiren bir hizmet. Yalnızca Azure kaynaklarını değil, AWS ve GCP gibi çoklu bulut ortamlarını, hatta şirket içi sunucuları da kapsayabiliyor.

Birkaç ana bileşeni var:

  • Secure Score: Güvenlik yapılandırmalarınızın 0-100 arasında bir puanla değerlendirilmesi
  • Security Recommendations: Düzeltilmesi gereken güvenlik açıkları ve öneriler
  • Microsoft Defender Plans: Gelişmiş tehdit koruması için ücretli planlar
  • Regulatory Compliance: GDPR, ISO 27001, PCI DSS gibi uyumluluk standartlarına göre durum raporu
  • Workload Protections: Sanal makineler, konteynerler, SQL veritabanları için tehdit algılama

Ücretsiz katman ile temel güvenlik önerilerini ve Secure Score’u kullanabilirsiniz. Defender planları ise kaynak türüne göre ücretlendirilir. Bir VM için Defender for Servers’ın maliyeti aylık yaklaşık 15 dolar civarında. Bu maliyet hesabını doğru yapmazsanız faturalarınız şişebilir, bu yüzden hangi kaynaklara Defender planı açacağınızı dikkatli belirleyin.

Kurulum ve İlk Yapılandırma

Azure CLI ile Güvenlik Merkezi Etkinleştirme

Azure Security Center’ı portaldan da açabilirsiniz ama CLI ile yönetmek çok daha verimli. Önce mevcut durumu kontrol edelim:

# Azure hesabına giriş
az login

# Subscription listesi
az account list --output table

# Aktif subscription seçimi
az account set --subscription "your-subscription-id"

# Security Center contact bilgilerini görüntüle
az security contact list --output table

Güvenlik ihlali durumunda bildirim alabilmek için contact ayarlarını yapılandırmak kritik. Birçok şirkette bu adım atlanıyor ve olaylar saatlerce fark edilemiyor:

# Güvenlik bildirimleri için e-posta ve telefon ayarla
az security contact create 
  --name "security-contact" 
  --email "[email protected]" 
  --phone "+905001234567" 
  --alert-notifications "On" 
  --alerts-to-admins "On"

Defender Planlarını Etkinleştirme

Hangi Defender planlarının aktif olduğunu kontrol etmek için:

# Mevcut pricing tier'ları listele
az security pricing list --output table

# Belirli bir kaynak türü için Defender planı aç (örnek: Sanal Makineler)
az security pricing create 
  --name "VirtualMachines" 
  --tier "Standard"

# Depolama hesapları için Defender etkinleştir
az security pricing create 
  --name "StorageAccounts" 
  --tier "Standard"

# Key Vault için Defender etkinleştir
az security pricing create 
  --name "KeyVaults" 
  --tier "Standard"

Dikkat: “Standard” tier ücretlidir. Sadece gerçekten ihtiyaç duyduğunuz kaynak türleri için etkinleştirin. Geliştirme ortamı için genellikle “Free” yeterli olur.

Secure Score ve Önerilerin Yönetimi

Secure Score’u Takip Etme

Secure Score, güvenlik ekibinize durumu anlık olarak gösterir. Bu puanı düzenli olarak izlemek iyi bir alışkanlık:

# Mevcut Secure Score'u görüntüle
az security secure-score show --name "ascScore" --output json

# Tüm kontroller ve puanlar
az security secure-score-controls list --output table

# Belirli bir kontrolün detayları
az security secure-score-control-definitions list --output json | 
  jq '.[] | select(.displayName | contains("Network"))'

Pratikte gördüğüm en yaygın sorunlardan biri, ekiplerin Secure Score’u başlangıçta yüksek tutup zamanla düşürmesi. Bunun sebebi çoğunlukla yeni kaynakların güvenlik standartlarına uygun yapılandırılmadan deploy edilmesi. Bunu önlemek için Azure Policy ile varsayılan güvenlik kuralları otomatik olarak uygulanabilir.

Güvenlik Önerilerini Listeleme ve Önceliklendirme

# Tüm aktif güvenlik önerilerini listele
az security assessment list --output table

# Sadece yüksek öncelikli önerileri filtrele
az security assessment list --output json | 
  jq '.[] | select(.status.code == "Unhealthy") | 
  {name: .displayName, severity: .metadata.severity, resource: .resourceDetails.id}' 

# Belirli bir kaynak grubundaki önerileri görüntüle
az security assessment list 
  --output json | 
  jq '.[] | select(.resourceDetails.id | contains("myResourceGroup"))'

Gerçek dünya senaryosunda bir müşteri projesinde çalışırken 150’den fazla öneri listelediğimizde bunların tamamına odaklanmak yerine önce “Critical” ve “High” severity’deki önerileri grupladık. Çoğunlukla şu kategoriler öne çıkıyordu:

  • Şifrelenmeyen disk birimleri (VM’lerde Azure Disk Encryption eksikliği)
  • Güvenlik açığı olan VM işletim sistemleri (eksik yamalar)
  • NSG kurallarında geniş açık portlar (0.0.0.0/0 kaynak IP)
  • MFA etkinleştirilmemiş hesaplar
  • Depolama hesaplarında HTTPS zorunluluğunun olmaması

Otomatik Düzeltme (Auto-Remediation) Yapılandırması

Güvenlik önerilerini manuel olarak tek tek düzeltmek zaman alıcı. Azure Logic Apps veya Azure Automation ile bu süreci otomatize edebilirsiniz.

Logic Apps ile Otomatik Bildirim

Önce bir örnek senaryo: Yeni bir yüksek öncelikli güvenlik uyarısı geldiğinde Teams kanalına otomatik mesaj gönderelim. Bunun için Azure Automation Runbook kullanabiliriz:

# Automation Account oluştur
az automation account create 
  --name "security-automation" 
  --resource-group "security-rg" 
  --location "westeurope" 
  --sku "Basic"

# Runbook oluştur
az automation runbook create 
  --automation-account-name "security-automation" 
  --resource-group "security-rg" 
  --name "SecurityAlertHandler" 
  --type "PowerShell" 
  --description "Handles security alerts from Defender for Cloud"

PowerShell ile Toplu Düzeltme Örneği

Depolama hesaplarında HTTPS zorunluluğunu otomatik olarak etkinleştirmek yaygın bir senaryo:

# Tüm storage account'larda HTTPS-only kontrolü yap ve düzelt
az storage account list --output json | 
  jq -r '.[] | select(.enableHttpsTrafficOnly == false) | .name + " " + .resourceGroup' | 
  while read name rg; do
    echo "Fixing HTTPS-only for storage account: $name in $rg"
    az storage account update 
      --name "$name" 
      --resource-group "$rg" 
      --https-only true
  done

Bu script, tüm HTTPS zorunluluğu kapalı depolama hesaplarını bulup otomatik olarak düzeltiyor. Prod ortamında çalıştırmadan önce mutlaka dry-run yapın ve sonuçları loglayın.

VM’lerde Disk Şifrelemesi Durumu Kontrolü

# Tüm VM'lerin disk şifreleme durumunu kontrol et
az vm list --output json | 
  jq -r '.[].id' | 
  while read vm_id; do
    vm_name=$(echo $vm_id | cut -d'/' -f9)
    rg=$(echo $vm_id | cut -d'/' -f5)
    
    encryption_status=$(az vm encryption show 
      --name "$vm_name" 
      --resource-group "$rg" 
      --query "dataDisk" 
      --output tsv 2>/dev/null || echo "NotEncrypted")
    
    echo "VM: $vm_name | RG: $rg | Status: $encryption_status"
  done

# Şifrelenmemiş VM'lere şifreleme etkinleştir
az vm encryption enable 
  --resource-group "production-rg" 
  --name "web-server-01" 
  --disk-encryption-keyvault "myKeyVault" 
  --volume-type "All"

Ağ Güvenlik Duruşunu İyileştirme

Ağ güvenliği önerileri genellikle en yüksek etkiye sahip kategorilerden biri. Yaygın sorunların başında aşırı geniş NSG kuralları geliyor.

NSG Kurallarını Denetleme

# Tüm NSG'leri ve geniş açık kuralları listele
az network nsg list --output json | 
  jq -r '.[].name' | 
  while read nsg_name; do
    echo "=== NSG: $nsg_name ==="
    az network nsg show 
      --name "$nsg_name" 
      --output json 2>/dev/null | 
      jq '.securityRules[] | select(.sourceAddressPrefix == "*" or .sourceAddressPrefix == "Internet") |
      {name: .name, priority: .priority, port: .destinationPortRange, direction: .direction}'
  done

Bu script, “Internet” veya “*” kaynak olarak izin veren tüm NSG kurallarını listeliyor. Özellikle RDP (3389) ve SSH (22) portlarının doğrudan internete açık olması en kritik bulgular arasında yer alıyor.

# Tehlikeli geniş NSG kuralını kaldır ve daha kısıtlı kural ekle
# Önce mevcut kuralı sil
az network nsg rule delete 
  --nsg-name "web-nsg" 
  --resource-group "production-rg" 
  --name "AllowSSHFromAnywhere"

# Sadece belirli IP'den SSH'a izin ver
az network nsg rule create 
  --nsg-name "web-nsg" 
  --resource-group "production-rg" 
  --name "AllowSSHFromBastion" 
  --priority 100 
  --source-address-prefixes "10.0.0.0/24" 
  --destination-port-ranges 22 
  --protocol Tcp 
  --access Allow 
  --direction Inbound

Just-in-Time VM Erişimi

JIT (Just-in-Time) VM erişimi, Security Center’ın en değerli özelliklerinden biri. Normalde sürekli açık olan yönetim portlarını (SSH, RDP) kapatıp yalnızca belirli bir zaman penceresi için açmanızı sağlıyor. Bu özellik ile bir VM’in yönetim portuna erişim isteği geldiğinde, istekte bulunan kullanıcı, kaynak IP ve süre kaydediliyor.

# JIT Policy tanımla
az security jit-policy create 
  --resource-group "production-rg" 
  --location "westeurope" 
  --name "jit-web-servers" 
  --virtual-machines '[{
    "id": "/subscriptions/SUB_ID/resourceGroups/production-rg/providers/Microsoft.Compute/virtualMachines/web-server-01",
    "ports": [
      {
        "number": 22,
        "protocol": "TCP",
        "allowedSourceAddressPrefix": "*",
        "maxRequestAccessDuration": "PT3H"
      },
      {
        "number": 3389,
        "protocol": "TCP",
        "allowedSourceAddressPrefix": "*",
        "maxRequestAccessDuration": "PT3H"
      }
    ]
  }]'

# JIT erişim talebi oluştur (3 saatlik SSH erişimi)
az security jit-policy initiate 
  --resource-group "production-rg" 
  --name "jit-web-servers" 
  --virtual-machines '[{
    "id": "/subscriptions/SUB_ID/resourceGroups/production-rg/providers/Microsoft.Compute/virtualMachines/web-server-01",
    "ports": [
      {
        "number": 22,
        "endTimeUtc": "2024-01-15T18:00:00.0000000Z",
        "allowedSourceAddressPrefix": "MY_IP_ADDRESS"
      }
    ]
  }]'

Ekip olarak JIT erişimini standart hale getirdiğinizde artık kimse “şu port hep açık olsun, kolay erişelim” demiyor. Bu kültürel değişim, teknik kontrolün yanı sıra oldukça önemli.

Uyumluluk Raporu ve Denetim Hazırlığı

Birçok sektörde düzenleyici uyumluluk şart koşuluyor. Security Center, PCI DSS, ISO 27001, GDPR gibi standartlara göre durum raporu üretiyor.

# Mevcut regulatory compliance standartlarını listele
az security regulatory-compliance-standards list --output table

# Belirli bir standart için detaylı kontrol listesi
az security regulatory-compliance-controls list 
  --standard-name "PCI-DSS" 
  --output json | 
  jq '.[] | {control: .displayName, state: .state, passed: .passedAssessments, failed: .failedAssessments}'

# Uyumsuz kontrolleri dışa aktar (audit hazırlığı için)
az security regulatory-compliance-controls list 
  --standard-name "Azure-CIS-1.3.0" 
  --output json | 
  jq '[.[] | select(.state == "Failed") | {
    control: .displayName,
    failed_count: .failedAssessments,
    skipped_count: .skippedAssessments
  }]' > compliance-report-$(date +%Y%m%d).json

Bu raporu her ay otomatik olarak üreten ve ilgili kişilere e-posta ile gönderen bir Azure Function yazabilirsiniz. Denetim dönemlerinde bu kaydedilmiş raporlar çok değerli oluyor.

Alert Yönetimi ve Olay Müdahalesi

Güvenlik Alertlarını İzleme

# Son 7 günün güvenlik alertlarını listele
az security alert list 
  --location "westeurope" 
  --output json | 
  jq '[.[] | select(.properties.status != "Dismissed") | {
    name: .properties.alertDisplayName,
    severity: .properties.severity,
    time: .properties.timeGeneratedUtc,
    resource: .properties.compromisedEntity
  }]' | head -50

# Yüksek ve kritik alertları filtrele
az security alert list 
  --location "westeurope" 
  --output json | 
  jq '.[] | select(.properties.severity == "High" or .properties.severity == "Critical") |
  {name: .properties.alertDisplayName, description: .properties.description, 
   resource: .properties.compromisedEntity, time: .properties.timeGeneratedUtc}'

Gerçek bir senaryoyu paylaşayım: Bir müşteride Defender for Servers aktifken gece yarısı bir VM üzerinde brute force saldırısı tespit edildi. Security Center, birkaç dakika içinde alert üretti ve yapılandırdığımız Logic App aracılığıyla nöbetçi mühendise telefon bildirimi gitti. Manuel incelemede IP’nin yurt dışından geldiği ve başarısız deneme sayısının 2000’i geçtiği görüldü. NSG kuralı ile IP bloğu uygulandı ve olay dokümante edildi. Bu kadar hızlı tepki, JIT ve Defender olmadan mümkün olmayacaktı.

Alertları Kapatma ve Yorumlama

# Belirli bir alert'i kapat (false positive durumunda)
az security alert update 
  --location "westeurope" 
  --name "ALERT_NAME" 
  --status "Dismissed"

# Alertı araştırma olarak işaretle
az security alert update 
  --location "westeurope" 
  --name "ALERT_NAME" 
  --status "InProgress"

Maliyet Optimizasyonu ve Kaynak Takibi

Security Center kullanırken maliyetleri kontrol altında tutmak kritik. Defender planlarını akıllıca seçmek gerekiyor:

  • Üretim ortamı: Tüm Defender planları aktif, özellikle Servers, SQL ve Storage
  • Geliştirme/test ortamı: Sadece Free tier, belki sadece Defender for Servers sınırlı sayıda VM için
  • Staging ortamı: Üretim ile aynı yapılandırma ama daha az VM sayısı

Hangi kaynakların Defender kapsamında olduğunu düzenli kontrol etmek maliyeti yönetmek için şart:

# Defender planı etkin olan kaynakların maliyetini tahmin et
az security pricing list --output json | 
  jq '.[] | select(.pricingTier == "Standard") | 
  {name: .name, tier: .pricingTier}'

# Belirli bir resource group için Defender'ı devre dışı bırak (test ortamları için)
az security pricing create 
  --name "VirtualMachines" 
  --tier "Free"

Sonuç

Azure Security Center (Microsoft Defender for Cloud), büyük veya küçük fark etmeksizin her Azure ortamında mutlaka yapılandırılması gereken bir hizmet. Secure Score ile güvenlik duruşunuzu anlık takip edebiliyor, otomatik önerilerle açıkları kapatabiliyor, JIT erişimi ile yönetim portlarını güvenli hale getirebiliyorsunuz.

Pratikte önerdiğim yaklaşım şu şekilde:

  • İlk hafta Secure Score’u ölçün ve düşük asılı meyveleri (kolayca düzeltilecek öneriler) temizleyin
  • İkinci haftada JIT VM erişimini tüm üretim VM’lerine uygulayın
  • NSG denetimini otomatize edin, geniş kaynak IP’lere izin veren kuralları haftalık raporlayın
  • Kritik kaynaklar için Defender planlarını açın, test ortamları için maliyeti sınırlayın
  • Aylık uyumluluk raporlarını otomatik oluşturun ve saklayın

Güvenlik yönetimi tek seferlik bir iş değil, sürekli bir döngü. Security Center bu döngüyü hem görünür hem de yönetilebilir kılıyor. Yukarıdaki script’leri kendi ortamınıza göre uyarlayın, özellikle Azure Policy ile birleştirerek “güvenli by default” bir altyapı kurabilirsiniz.

Bir yanıt yazın

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