Azure Defender ile Bulut Ortamınızda Tehdit Koruması

Bulut ortamlarında güvenlik artık “isteğe bağlı” bir şey değil. Şirketler Azure’a geçtikçe, saldırı yüzeyi de dramatik biçimde genişliyor. Sanal makineler, konteynerler, veritabanları, depolama hesapları… Bunların hepsini manuel olarak izlemek neredeyse imkansız. İşte bu noktada Azure Defender devreye giriyor ve sysadmin olarak bu aracı gerçekten iyi tanıman gerekiyor.

Azure Defender Nedir ve Neden Önemlidir?

Azure Defender, Microsoft Defender for Cloud’un (eski adıyla Azure Security Center) bir parçasıdır. Temel olarak çalışma yüklerinizi gerçek zamanlı tehditlerden koruyan, davranışsal analiz ve tehdit istihbaratı kullanan bir güvenlik platformudur.

Bunu sadece bir “antivirus” olarak düşünme. Azure Defender:

  • Anormal davranışları tespit eder
  • Sıfır gün açıklarına karşı koruma sağlar
  • Makine öğrenmesi ile şüpheli aktiviteleri filtreler
  • MITRE ATT&CK çerçevesiyle uyumlu tehdit analizi yapar
  • Otomatik yanıt mekanizmaları sunar

Gerçek hayattan bir örnek vereyim: Geçen yıl bir müşterimizin Azure ortamında gece 2’de bir VM’den Tor çıkış düğümlerine doğru bağlantı denemeleri başladı. Ekibin hiçbiri uyumuyordu tabii ki, ama Azure Defender bu anomaliyi yakaladı, uyarı gönderdi ve ilgili ağ kurallarını otomatik olarak kısıtladı. Sabah iş başına geldiğimizde olay raporunu inceledik ve tam resmi gördük. İşte bu yüzden bu araç kritik.

Azure Defender’ı Etkinleştirme

Subscription Seviyesinde Etkinleştirme

Azure CLI ile tüm subscription’da Defender’ı aktif etmek oldukça basit:

# Azure CLI ile login
az login

# Subscription'ı seç
az account set --subscription "SubscriptionId-Buraya"

# Microsoft Defender for Cloud'u kaydet
az provider register --namespace Microsoft.Security

# Defender planlarını etkinleştir (VirtualMachines için örnek)
az security pricing create 
  --name VirtualMachines 
  --tier Standard

Tüm kaynaklar için Defender’ı etkinleştirmek istiyorsan her kaynak tipi için ayrı ayrı komut çalıştırmak gerekiyor:

# Desteklenen tüm Defender planları
PLANS=(
  "VirtualMachines"
  "SqlServers"
  "AppServices"
  "StorageAccounts"
  "Containers"
  "KeyVaults"
  "Arm"
  "Dns"
)

for plan in "${PLANS[@]}"; do
  echo "Etkinleştiriliyor: $plan"
  az security pricing create 
    --name "$plan" 
    --tier Standard
  echo "$plan etkinleştirildi."
done

Bu script production öncesi bir staging ortamında test et. Bazı planlar ek maliyet getirdiği için önce bütçeni netleştir.

PowerShell ile Etkinleştirme

Windows ortamlarından yönetiyorsan PowerShell tercih edebilirsin:

# Az modülünü yükle
Install-Module -Name Az -Scope CurrentUser -Force

# Login
Connect-AzAccount

# Tüm güvenlik planlarını listele
Get-AzSecurityPricing

# Belirli bir plan için Standard tier'a geç
Set-AzSecurityPricing -Name "VirtualMachines" -PricingTier "Standard"

# Durumu kontrol et
Get-AzSecurityPricing -Name "VirtualMachines" | Select-Object Name, PricingTier

Tehdit Tespiti Nasıl Çalışır?

Azure Defender’ın altında birkaç temel mekanizma çalışıyor:

Davranışsal Analiz: VM’lerin, konteynerlerin ve diğer kaynakların normal davranış profillerini öğrenir. Bir web sunucunuzun aniden büyük miktarda DNS sorgusu yapmaya başlaması? Bu hemen kırmızı bayrak kaldırır.

Tehdit İstihbaratı: Microsoft’un global tehdit istihbaratı veri tabanıyla entegre çalışır. Bilinen kötü amaçlı IP adresleri, domain’ler ve dosya hash’leri sürekli güncellenen bu veri tabanında tutulur.

Anomali Tespiti: Makine öğrenmesi modelleri zaman içinde baseline oluşturur. Mesela bir servis hesabının her sabah 09:00-18:00 arası çalıştığını öğrenirse, gece 03:00’te bu hesaptan aktivite geldiğinde alarm üretir.

Just-in-Time (JIT) VM Erişimi: Bu özellik ayrıca değer. Normalde SSH veya RDP portlarını sürekli açık bırakmak büyük bir güvenlik açığı. JIT ile bu portlar varsayılan olarak kapalı kalır, sadece talep üzerine ve belirli bir süre için açılır.

JIT VM Erişimini Yapılandırma

# JIT politikası oluştur (az CLI)
az security jit-policy create 
  --resource-group "ProdResourceGroup" 
  --location "westeurope" 
  --name "default" 
  --virtual-machines '[
    {
      "id": "/subscriptions/SUB-ID/resourceGroups/ProdResourceGroup/providers/Microsoft.Compute/virtualMachines/WebServer01",
      "ports": [
        {
          "number": 22,
          "protocol": "TCP",
          "allowedSourceAddressPrefix": "*",
          "maxRequestAccessDuration": "PT3H"
        },
        {
          "number": 3389,
          "protocol": "TCP",
          "allowedSourceAddressPrefix": "*",
          "maxRequestAccessDuration": "PT1H"
        }
      ]
    }
  ]'

Bu konfigürasyonla SSH için maksimum 3 saat, RDP için 1 saatlik erişim penceresi tanımlıyorsun. Erişim süresi dolduğunda portlar otomatik olarak kapanıyor.

JIT erişimi talep etmek için:

# Belirli bir VM için JIT erişimi iste
az security jit-policy initiate 
  --resource-group "ProdResourceGroup" 
  --name "default" 
  --virtual-machines '[
    {
      "id": "/subscriptions/SUB-ID/resourceGroups/ProdResourceGroup/providers/Microsoft.Compute/virtualMachines/WebServer01",
      "ports": [
        {
          "number": 22,
          "endTimeUtc": "2024-01-15T15:00:00.000Z",
          "allowedSourceAddressPrefix": "203.0.113.10"
        }
      ]
    }
  ]'

Dikkat et: allowedSourceAddressPrefix olarak kendi IP adresini kullanman güvenliği bir kat daha artırır. Wildcard kullanmak zorunda kalıyorsan en azından erişim süresini kısa tut.

Uyarıları Yönetme ve Önceliklendirme

Azure Defender günde onlarca uyarı üretebilir. Bunların hepsini tek tek incelemek hem zaman kaybı hem de alarm yorgunluğuna yol açar. İyi bir triage süreci kurgulaman şart.

Uyarı şiddetleri şu şekilde kategorize edilir:

  • Yüksek: Aktif bir saldırı veya kritik risk, hemen müdahale gerekir
  • Orta: Şüpheli davranış, araştırma gerektirir
  • Düşük: Bilgi amaçlı, genel güvenlik hijyeniyle ilgili
  • Bilgi: Gelecekte başvurmak için log niteliğinde

Azure CLI ile aktif uyarıları çekmek ve filtrelemek:

# Tüm güvenlik uyarılarını listele
az security alert list 
  --output table

# Sadece yüksek şiddetli uyarıları filtrele
az security alert list 
  --query "[?properties.severity=='High']" 
  --output json | jq '.[] | {name: .name, description: .properties.description, status: .properties.status}'

# Son 24 saatteki uyarıları çek
YESTERDAY=$(date -u -d '24 hours ago' '+%Y-%m-%dT%H:%M:%SZ')
az security alert list 
  --query "[?properties.timeGeneratedUtc>='$YESTERDAY']" 
  --output table

Log Analytics ile Entegrasyon

Azure Defender tek başına çalışmaz, en iyi performansını Log Analytics Workspace ile entegre edildiğinde gösterir. Bu entegrasyon sayesinde güçlü KQL (Kusto Query Language) sorguları yazabilirsin.

# Log Analytics Workspace oluştur
az monitor log-analytics workspace create 
  --resource-group "SecurityResourceGroup" 
  --workspace-name "SecurityWorkspace" 
  --location "westeurope" 
  --sku PerGB2018

# Workspace ID'sini al
WORKSPACE_ID=$(az monitor log-analytics workspace show 
  --resource-group "SecurityResourceGroup" 
  --workspace-name "SecurityWorkspace" 
  --query customerId 
  --output tsv)

echo "Workspace ID: $WORKSPACE_ID"

# Security Center'ı bu workspace'e bağla
az security workspace-setting create 
  --name "default" 
  --target-workspace "/subscriptions/SUB-ID/resourceGroups/SecurityResourceGroup/providers/Microsoft.OperationalInsights/workspaces/SecurityWorkspace"

Log Analytics üzerinde çalıştırabileceğin örnek bir KQL sorgusu (Azure Portal’daki Log Analytics ekranından çalıştırırsın):

// Son 7 günde yüksek şiddetli güvenlik uyarıları
SecurityAlert
| where TimeGenerated > ago(7d)
| where AlertSeverity == "High"
| summarize AlertCount = count() by AlertName, AlertType, bin(TimeGenerated, 1d)
| order by AlertCount desc

Otomatik Yanıt: Logic Apps ile Entegrasyon

Bir uyarı geldiğinde e-posta atmak, Teams’e mesaj göndermek veya daha ileri giderek otomatik düzeltici aksiyonlar almak için Azure Logic Apps kullanabilirsin. Bu senaryo özellikle kritik uyarılarda hayat kurtarır.

Örnek senaryo: Yüksek şiddetli bir uyarı geldiğinde ilgili VM’i otomatik olarak izole et ve güvenlik ekibine bildir.

# Logic App oluştur
az logic workflow create 
  --resource-group "SecurityResourceGroup" 
  --name "SecurityAlertHandler" 
  --location "westeurope" 
  --definition '{
    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
    "contentVersion": "1.0.0.0",
    "triggers": {
      "When_a_Microsoft_Defender_for_Cloud_alert_is_created_or_triggered": {
        "type": "ApiConnectionWebhook",
        "inputs": {
          "host": {
            "connection": {
              "name": "@parameters('"'"'$connections'"'"')['"'"'ascalert'"'"']['"'"'connectionId'"'"']"
            }
          },
          "path": "/subscriptions/@{encodeURIComponent('"'"'SUB-ID'"'"')}/providers/Microsoft.Security/alerts/subscribe"
        }
      }
    }
  }'

Logic App’i Azure Portal üzerinden görsel olarak tasarlamak çok daha pratik. CLI ile temel yapıyı oluşturup geri kalanı portal’dan tamamlayabilirsin.

Adaptive Application Controls

Bu özellik, VM’lerde hangi uygulamaların çalışmasına izin verileceğini öğrenen ve buna göre whitelist oluşturan bir mekanizma. Ransomware saldırılarına karşı özellikle etkili.

# Adaptive Application Controls önerilerini görüntüle
az security adaptive-application-controls list 
  --output json | jq '.[] | {groupName: .name, vmCount: (.properties.vmRecommendations | length), status: .properties.enforcementMode}'

# Belirli bir grup için detay
az security adaptive-application-controls show 
  --group-name "MSWDBE-westeurope-001" 
  --output json

Pratik deneyimden bir not: Bu özelliği önce “Audit” modunda çalıştır. Eğer hemen “Enforce” moduna geçersen, beklenmedik uygulamalar bloklanabilir ve production’ı aksatırsın. İki-üç hafta audit modunda çalıştırıp, whitelist’i iyice şekillendirdikten sonra enforce moduna geç.

File Integrity Monitoring (FIM)

Kritik sistem dosyalarının değişip değişmediğini izlemek için FIM kullanmalısın. Linux’ta /etc/passwd, /etc/shadow, web sunucu konfigürasyon dosyaları; Windows’ta registry key’leri ve sistem dosyaları için ideal.

# FIM'i etkinleştir (Log Analytics Agent gerekli)
az security mde-onboardings list 
  --output table

# FIM kuralı ekle (PowerShell ile daha kolay)
# Aşağıdaki scripti Azure CloudShell'den çalıştır

$workspace = Get-AzOperationalInsightsWorkspace `
  -ResourceGroupName "SecurityResourceGroup" `
  -Name "SecurityWorkspace"

$solution = Get-AzMonitorLogAnalyticsSolution `
  -ResourceGroupName "SecurityResourceGroup" `
  -WorkspaceName "SecurityWorkspace"

# FIM için Linux dosya izleme kuralı
$linuxRule = @{
  Name = "CriticalLinuxFiles"
  Enabled = $true
  FileType = "File"
  Path = "/etc/"
  UploadedContent = "true"
  Recurse = "true"
}

FIM uyarıları için Log Analytics’te şu sorguyu kullanabilirsin:

# FIM değişikliklerini izle
ConfigurationChange
| where ConfigChangeType == "Files"
| where FileSystemPath contains "/etc/"
| project TimeGenerated, Computer, FileSystemPath, ChangeCategory, PreviousContent, NewContent
| order by TimeGenerated desc

Maliyet Yönetimi

Azure Defender’ın maliyeti kaynakların boyutuna ve tipine göre değişiyor. Sysadmin olarak bütçeyi korumak da senin sorumluluğunda.

Maliyeti optimize etmek için birkaç pratik yöntem:

  • Development ortamlarında Defender’ı devre dışı bırak: Prod ortamı için gerekli olan her şeyi dev için aktif etmek israf. Az önce oluşturduğun script’i kullanarak sadece kritik subscription’larda Standard tier aktif tutabilirsin.
  • Kaynakları etiketle: Environment=Production, Environment=Development gibi etiketler kullanarak Defender politikalarını yalnızca production kaynaklarına uygula.
  • Gereksiz planları kapat: Eğer Azure Kubernetes Service kullanmıyorsan Containers planını açık tutmanın anlamı yok.
# Mevcut Defender plan maliyetlerini kontrol et
az consumption usage list 
  --start-date "2024-01-01" 
  --end-date "2024-01-31" 
  --query "[?contains(consumedService, 'Microsoft.Security')]" 
  --output table

# Development subscription'ında Defender'ı kapat
az account set --subscription "DevSubscriptionId"
az security pricing create 
  --name VirtualMachines 
  --tier Free

Gerçek Dünya Saldırı Senaryosu: Kripto Madencisi Tespiti

Bir müşteride yaşanan gerçek bir olayı paylaşayım. Bir web uygulamasında SQL injection açığı istismar edildi, saldırgan VM’e erişim sağladı ve kripto madenci yazılımı yükledi.

Azure Defender bu saldırıyı şu şekilde tespit etti:

  • CPU kullanımı anormal derecede yükseldi (baseline %15, ani sıçrama %95)
  • Dışarıdan bilinen bir mining pool IP’sine bağlantı girişimi tespit edildi
  • Güvenlik duvarı kurallarını değiştirmeye çalışan süreç tespit edildi

Uyarı geldiğinde ilk müdahale için şu script’i kullandık:

#!/bin/bash
# Şüpheli VM'i izole et
RESOURCE_GROUP="ProdResourceGroup"
VM_NAME="WebServer01"
NSG_NAME="WebServer01-NSG"

echo "VM izolasyonu başlatılıyor: $VM_NAME"

# Tüm inbound trafiği engelle (acil durum kuralı)
az network nsg rule create 
  --resource-group "$RESOURCE_GROUP" 
  --nsg-name "$NSG_NAME" 
  --name "EMERGENCY-BLOCK-ALL-INBOUND" 
  --priority 100 
  --direction Inbound 
  --access Deny 
  --protocol "*" 
  --source-address-prefix "*" 
  --source-port-range "*" 
  --destination-address-prefix "*" 
  --destination-port-range "*"

# Tüm outbound trafiği engelle
az network nsg rule create 
  --resource-group "$RESOURCE_GROUP" 
  --nsg-name "$NSG_NAME" 
  --name "EMERGENCY-BLOCK-ALL-OUTBOUND" 
  --priority 100 
  --direction Outbound 
  --access Deny 
  --protocol "*" 
  --source-address-prefix "*" 
  --source-port-range "*" 
  --destination-address-prefix "*" 
  --destination-port-range "*"

echo "VM izole edildi. Forensic analiz için snapshot alınıyor..."

# Forensic için disk snapshot al
az snapshot create 
  --resource-group "$RESOURCE_GROUP" 
  --name "forensic-snapshot-$(date +%Y%m%d-%H%M%S)" 
  --source "/subscriptions/SUB-ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/disks/WebServer01_OsDisk"

echo "Snapshot alındı. Güvenlik ekibini bildir."

Bu script’i emergency playbook olarak hazır tutuyoruz. Olay anında dakika kaybedemezsin.

Güvenlik Skoru ve Sürekli İyileştirme

Azure Defender, ortamının genel güvenlik durumunu “Secure Score” adlı bir metrikle ölçer. 100 üzerinden verilen bu skor, hangi güvenlik kontrollerinin eksik olduğunu net biçimde gösterir.

# Güvenlik skorunu görüntüle
az security secure-score list 
  --output json | jq '.[] | {name: .name, score: .properties.score.current, maxScore: .properties.score.max, percentage: .properties.score.percentage}'

# Mevcut güvenlik önerilerini listele
az security assessment list 
  --query "[?properties.status.code=='Unhealthy']" 
  --output json | jq '.[] | {displayName: .properties.displayName, severity: .properties.metadata.severity, category: .properties.metadata.categories[0]}'

Skoru artırmak için önerilen aksiyonlar önceliklendirilmiş biçimde geliyor. Yüksek etkili, düşük çabası gerektiren önerileri önce çöz. Tipik olarak bunlar:

  • MFA’yı tüm hesaplarda zorunlu kılmak
  • JIT VM erişimini etkinleştirmek
  • Gereksiz açık portları kapatmak
  • Depolama hesaplarında şifrelemeyi doğrulamak
  • Eski TLS versiyonlarını devre dışı bırakmak

Sonuç

Azure Defender, bulut güvenliğinde reaktif değil proaktif olmayı sağlayan kritik bir araç. Sadece uyarı üretmekle kalmıyor, sana güvenlik durumunun tam bir resmini sunuyor ve iyileştirme için net bir yol haritası çiziyor.

En önemli üç paket:

Birincisi, her şeyi bir anda aktif etmeye çalışma. Önce kritik kaynaklardan başla, politikaları audit modunda test et, sonra enforce moduna geç.

İkincisi, uyarı yorgunluğuna karşı savaş. Tüm uyarıları eşit muamele etmek yerine iyi bir triage süreci kur, Logic Apps ile otomasyonu devreye al.

Üçüncüsü, güvenlik skoru metrikleri haftalık olarak gözden geçir. Bu skoru ekip toplantılarında görünür kıl. Güvenlik sadece sysadmin’in değil, tüm teknik ekibin sorumluluğu.

Bulut ortamları hızla değişiyor ve saldırı yüzeyi de buna paralel büyüyor. Azure Defender’ı doğru yapılandırdığında, saldırganlar fark etmeden önce onları fark etme şansın dramatik biçimde artıyor. Bu da sysadmin olarak seni hem işinde daha iyi hem de geceleri daha rahat uyutan bir şey.

Bir yanıt yazın

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