Terminal Sunucularında Kullanılmayan Oturumların Yönetimi: Güvenlik, Performans ve Verimlilik İçin Kritik Önlemler
Terminal Services (TS) veya modern adıyla Remote Desktop Services (RDS), kurums...
Bu makalede, Microsoft 365 Yönetim alanınızda Güvenlik Varsayılanlarını nasıl etkinleştirip devre dışı bırakacağınızı göstereceğiz. Microsoft 365'teki Güvenlik Varsayılanları, çok faktörlü kimlik doğrulamayı uygulayarak ve eski kimlik doğrulama yöntemlerini engelleyerek hesap korumasını artıran önceden yapılandırılmış ayarlardır – tüm kullanıcılar için temel ve etkili güvenlik sağlar.
Microsoft Azure Active Directory'nin sunduğu Security Defaults (Güvenlik Varsayılanları) özelliği, modern siber tehdit ortamında organizasyonların temel güvenlik ihtiyaçlarını karşılayan kritik bir koruma katmanıdır. Özellikle Premium lisanslara sahip olmayan küçük ve orta ölçekli işletmeler için tasarlanan bu özellik, ekranınızda gördüğünüz gibi tek bir düğmeyle aktifleştirilebilen, ancak arkasında güçlü güvenlik mekanizmaları barındıran bir çözümdür.
Görselde dikkat çeken kırmızı çerçeveli alan, organizasyonunuzun güvenlik durumunu gösteren en kritik noktadır. "Enabled (recommended)" seçeneği, Microsoft'un tüm organizasyonlara şiddetle tavsiye ettiği güvenlik seviyesini temsil eder. Eğer bu ayar "Disabled" durumundaysa, organizasyonunuz %99.9 oranında engellenebilecek güvenlik tehditlerine karşı savunmasız durumdadır.
Microsoft'un güvenlik raporlarına göre:
Microsoft 365 için Güvenlik Varsayılanlarını Nasıl Etkinleştirir veya Devre Dışı Bırakılır
Security Defaults etkinleştirildiğinde, tüm kullanıcılar için MFA zorunlu hale gelir. Bu özellik:
# MFA durumunu kontrol etme scripti
Connect-MsolService
Get-MsolUser -All | Select-Object DisplayName, UserPrincipalName,
@{Name="MFA Status"; Expression={
if($_.StrongAuthenticationRequirements.State){
$_.StrongAuthenticationRequirements.State
} else {
"Disabled"
}
}}
Uygulama Senaryoları:
Admin hesapları için özel güvenlik gereksinimleri:
| Admin Rolü | MFA Gereksinimi | Ek Güvenlik |
|---|---|---|
| Global Administrator | Her oturumda | Risk tabanlı erişim kontrolü |
| Security Administrator | Her oturumda | Koşullu erişim |
| Exchange Administrator | Her oturumda | Privileged Identity Management önerisi |
| User Administrator | Her oturumda | Just-in-time erişim önerisi |
Legacy (Basic) Authentication protokolleri engellendiğinde:
# Legacy authentication kullanımını tespit etme
$startDate = (Get-Date).AddDays(-30)
$endDate = (Get-Date)
Search-UnifiedAuditLog -StartDate $startDate -EndDate $endDate `
-ResultSize 5000 -Operations "UserLoggedIn" |
Where-Object {$_.AuditData -like "*ClientInfoString*"}
Engellenen Protokoller:
Security Defaults, Azure AD Identity Protection'ın temel özelliklerini içerir:
✅ Security Defaults tercih edilmeli:
Conditional Access tercih edilmeli:
# Security Defaults durumunu kontrol et
Connect-AzureAD
$securityDefaults = Get-AzureADDirectorySettingTemplate |
Where-Object {$_.DisplayName -eq "Security Defaults"}
if($securityDefaults){
Write-Host "Security Defaults template found" -ForegroundColor Green
$settings = Get-AzureADDirectorySetting |
Where-Object {$_.DisplayName -eq "Security Defaults"}
$settings.Values
}
Geçiş öncesinde oluşturulması gereken minimum politikalar:
{
"displayName": "Require MFA for all users",
"state": "enabled",
"conditions": {
"users": {
"includeUsers": ["All"]
},
"applications": {
"includeApplications": ["All"]
}
},
"grantControls": {
"builtInControls": ["mfa"]
}
}
{
"displayName": "Block legacy authentication",
"state": "enabled",
"conditions": {
"users": {
"includeUsers": ["All"]
},
"clientAppTypes": ["exchangeActiveSync", "other"]
},
"grantControls": {
"builtInControls": ["block"]
}
}
# Admin hesapları için Conditional Access politikası
New-AzureADMSConditionalAccessPolicy -DisplayName "Admins require MFA" `
-State "Enabled" `
-Conditions @{
Users = @{
IncludeRoles = @(
"62e90394-69f5-4237-9190-012177145e10", # Global Admin
"194ae4cb-b126-40b2-bd5b-6091b380977d" # Security Admin
)
}
Applications = @{
IncludeApplications = "All"
}
} `
-GrantControls @{
BuiltInControls = @("Mfa", "CompliantDevice")
Operator = "OR"
}
# Pilot grup oluşturma
$pilotGroup = New-AzureADGroup -DisplayName "CA_Pilot_Users" `
-MailEnabled $false `
-SecurityEnabled $true `
-MailNickName "CAPilot"
# Kullanıcıları pilot gruba ekleme
$testUsers = Get-AzureADUser -Top 10
foreach($user in $testUsers){
Add-AzureADGroupMember -ObjectId $pilotGroup.ObjectId `
-RefObjectId $user.ObjectId
}
⚠️ UYARI: Bu adım sadece tüm Conditional Access politikaları test edildikten sonra yapılmalıdır!
# Security Defaults'u devre dışı bırakma
$templateId = (Get-AzureADDirectorySettingTemplate |
Where-Object {$_.DisplayName -eq "Security Defaults"}).Id
$settings = New-Object Microsoft.Open.AzureAD.Model.DirectorySetting
$settings.DisplayName = "Security Defaults"
$settings["IsEnabled"] = "false"
Set-AzureADDirectorySetting -Id $settings.Id -DirectorySetting $settings
# Yüksek riskli kullanıcılar için parola sıfırlama zorunluluğu
$userRiskPolicy = @{
DisplayName = "High risk users must reset password"
State = "Enabled"
Conditions = @{
UserRiskLevels = @("High")
Users = @{
IncludeUsers = "All"
}
}
GrantControls = @{
BuiltInControls = @("PasswordChange", "Mfa")
Operator = "AND"
}
}
# Riskli oturumlar için MFA zorunluluğu
$signInRiskPolicy = @{
DisplayName = "Medium and high risk sign-ins require MFA"
State = "Enabled"
Conditions = @{
SignInRiskLevels = @("Medium", "High")
Users = @{
IncludeUsers = "All"
}
}
GrantControls = @{
BuiltInControls = @("Mfa")
}
}
# Özel yasaklı parola listesi oluşturma
$bannedPasswords = @(
"Sirket2024",
"Password123",
"Admin2024",
"Ankara06"
)
# Custom banned password list güncelleme
Set-AzureADPasswordProtectionCustomBannedPasswordList `
-CustomBannedPasswords $bannedPasswords
# Password protection ayarlarını etkinleştirme
$settings = @{
EnableBannedPasswordCheck = $true
EnableBannedPasswordCheckOnPremises = $true
BannedPasswordCheckMode = "Enforced"
}
| Politika | Önerilen Değer | Açıklama |
|---|---|---|
| Minimum uzunluk | 12 karakter | NIST 800-63B standardı |
| Karmaşıklık | Devre dışı | Uzunluk ve MFA yeterli |
| Geçerlilik süresi | Sınırsız | Sadece risk durumunda değiştir |
| Geçmiş kontrolü | Son 24 parola | Tekrar kullanımı engelle |
| Account lockout | 10 deneme | Brute force koruması |
# Son 7 günlük başarısız giriş denemeleri
$startDate = (Get-Date).AddDays(-7).ToString("yyyy-MM-dd")
$failedSignIns = Get-AzureADAuditSignInLogs -Filter "status/errorCode ne 0 and createdDateTime ge $startDate"
$failedSignIns | Group-Object UserPrincipalName |
Select-Object Name, Count |
Sort-Object Count -Descending |
Export-Csv "FailedSignIns_Weekly.csv"
# MFA registration durumu raporu
Connect-MgGraph -Scopes "Reports.Read.All"
$report = Get-MgReportAuthenticationMethodUserRegistrationDetail
$report | Select-Object UserPrincipalName,
IsMfaCapable,
IsMfaRegistered,
IsPasswordlessCapable |
Export-Excel "MFA_Status_Report.xlsx"
Sayın Çalışanımız,
Kurumsal güvenliğimizi artırmak için Security Defaults özelliğini aktifleştiriyoruz. Bu değişiklik [Tarih] itibarıyla devreye girecektir.
Sorularınız için: it-support@sirket.com
# MFA sorunlu kullanıcıları tespit etme
$problemUsers = Get-MgUser -All | Where-Object {
$_.StrongAuthenticationMethods.Count -eq 0
}
# Geçici MFA bypass (sadece acil durumlar için)
$user = Get-AzureADUser -ObjectId "user@domain.com"
Set-MsolUser -UserPrincipalName $user.UserPrincipalName `
-StrongAuthenticationRequirements @()
# Legacy authentication kullanan uygulamaları tespit etme
$legacyApps = Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-30) `
-EndDate (Get-Date) -Operations UserLoggedIn -ResultSize 5000 |
Where-Object {$_.AuditData -match "ClientInfoString.*Outlook/15.0"}
# App password oluşturma (geçici çözüm)
# Not: Security Defaults aktifken app password kullanılamaz
# Çakışan politikaları tespit etme
$policies = Get-AzureADMSConditionalAccessPolicy
$conflicts = @()
foreach($policy in $policies){
if($policy.State -eq "Enabled"){
$conflicts += [PSCustomObject]@{
PolicyName = $policy.DisplayName
Users = $policy.Conditions.Users.IncludeUsers
Apps = $policy.Conditions.Applications.IncludeApplications
Controls = $policy.GrantControls.BuiltInControls
}
}
}
$conflicts | Format-Table -AutoSize
# Güvenlik metrikleri toplama
function Get-SecurityMetrics {
$metrics = @{
Date = Get-Date
TotalUsers = (Get-AzureADUser -All $true).Count
MFAEnabledUsers = (Get-MsolUser -All | Where-Object {$_.StrongAuthenticationMethods.Count -gt 0}).Count
AdminAccounts = (Get-AzureADDirectoryRole | Get-AzureADDirectoryRoleMember).Count
DisabledLegacyAuth = (Get-AzureADPolicy | Where-Object {$_.DisplayName -like "*Legacy*"}).Count
FailedSignIns24h = (Get-AzureADAuditSignInLogs -Filter "createdDateTime ge $(Get-Date).AddDays(-1) and status/errorCode ne 0").Count
}
# MFA coverage hesaplama
$metrics.MFACoverage = [math]::Round(($metrics.MFAEnabledUsers / $metrics.TotalUsers) * 100, 2)
return $metrics
}
# Dashboard HTML oluşturma
$metrics = Get-SecurityMetrics
$dashboardHTML = @"
"@
$dashboardHTML | Out-File "SecurityDashboard.html"
1. Ay - Temel Güvenlik:
2. Ay - İleri Seviye Koruma:
3. Ay - Optimizasyon:
Security Defaults, Microsoft'un sunduğu ücretsiz ancak son derece etkili bir güvenlik çözümüdür. Görselinizdeki "Enabled (recommended)" seçeneği, organizasyonunuzun güvenlik duruşunu anında iyileştirecek kritik bir adımdır.
Acil Aksiyon Önerileri:
Unutmayın: %99.9 oranında hesap güvenliği ihlali, Security Defaults ile önlenebilir. Bu basit ama güçlü özelliği kullanmamak, organizasyonunuzu gereksiz risklere maruz bırakmak anlamına gelir.
Bu makale, Azure AD Security Defaults ve Conditional Access özellikleri için hazırlanmıştır. Tüm PowerShell scriptleri test ortamında denenmelidir.