Built-in Administrator Account Güvenliği (Misconfiguration)
Built-in Administrator Account Güvenlik Açığı: En Kritik Güvenlik Riski Wi...
 
        Parola Yaşlandırma ve Güvenlik Riskleri Organizasyonlarda en yaygın güvenlik zafiyetlerinden biri, maximum password age politikasının uygun şekilde yapılandırılmamasıdır. Kullanıcıların aynı parolayı uzun süre kullanması, siber saldırganlar için değerli fırsatlar yaratır. Modern güvenlik standartları, parolaların 45 gün veya daha kısa aralıklarla değiştirilmesini önerir. Bu yazıda, password age politikasının önemini, güvenlik risklerini ve etkili çözüm yöntemlerini detaylı olarak inceleyeceğiz.
Maximum Password Age, bir parolanın maksimum ne kadar süre kullanılabileceğini belirleyen güvenlik politikasıdır. Bu ayar, kullanıcıları belirli aralıklarla parola değiştirmeye zorlar ve böylece uzun süreli parola kullanımından kaynaklanan güvenlik risklerini azaltır.
Gün 0 Gün 45 Gün 50 Gün 60 │ │ │ │ │◄───────┴────────┴────────┤ │ │ New Warning Grace Account Password Period Period Disabled Uzun süre aynı parola kullanımı şu riskleri artırır:
Risk = Base_Risk × Time_Factor × Exposure_Factor Base_Risk = 0.1 (10% başlangıç riski) Time_Factor = Days_Since_Change / 45 Exposure_Factor = Usage_Frequency × System_Criticality Örnek: 180 gün eski parola Risk = 0.1 × (180/45) × 1.5 = 0.6 (60% risk) Gün 1: Phishing ile parola çalınır Gün 30: Saldırgan gizli erişim sağlar Gün 60: Lateral movement başlar Gün 90: Data exfiltration gerçekleşir Gün 120: Saldırı tespit edilir Risk: Parola değiştirilseydi, saldırı gün 45'te kesilirdi # Yaygın parola değişim kalıpları $commonPatterns = @( "Password1", "Password2", "Password3" "Company2023!", "Company2024!", "Company2025!" "Summer2024", "Autumn2024", "Winter2024" ) # Tahmin edilebilirlik riski foreach ($pattern in $commonPatterns) { $predictabilityScore = Calculate-PredictabilityRisk $pattern if ($predictabilityScore -gt 0.7) { Write-Warning "High predictability risk: $pattern" } } Yol: Computer Configuration → Windows Settings → Security Settings → Account Policies → Password Policy
Maximum Password Age: 45 days Minimum Password Age: 1 day Minimum Password Length: 14 characters Password History: 24 passwords remembered Password Complexity: Enabled Store passwords using reversible encryption: Disabled # Default Domain Password Policy ayarları Import-Module ActiveDirectory # Maximum password age ayarı (45 gün) Set-ADDefaultDomainPasswordPolicy -Identity $env:USERDNSDOMAIN -MaxPasswordAge "45.00:00:00" # Minimum password age ayarı (1 gün) Set-ADDefaultDomainPasswordPolicy -Identity $env:USERDNSDOMAIN -MinPasswordAge "1.00:00:00" # Password history ayarı (24 parola) Set-ADDefaultDomainPasswordPolicy -Identity $env:USERDNSDOMAIN -PasswordHistoryCount 24 # Minimum password length ayarı (14 karakter) Set-ADDefaultDomainPasswordPolicy -Identity $env:USERDNSDOMAIN -MinPasswordLength 14 # Komplekslik gereksinimleri Set-ADDefaultDomainPasswordPolicy -Identity $env:USERDNSDOMAIN -ComplexityEnabled $true Write-Output "Password policy updated successfully." # VIP kullanıcılar için daha sıkı politika New-ADPasswordPolicy -Name "VIP_PasswordPolicy" -Precedence 10 ` -MaxPasswordAge "30.00:00:00" ` -MinPasswordAge "1.00:00:00" ` -MinPasswordLength 16 ` -PasswordHistoryCount 36 ` -ComplexityEnabled $true # VIP grubuna atama Add-ADPasswordPolicySubject -Identity "VIP_PasswordPolicy" -Subjects "VIP_Users" # Servis hesapları için uzun parola yaşı New-ADPasswordPolicy -Name "ServiceAccount_PasswordPolicy" -Precedence 20 ` -MaxPasswordAge "365.00:00:00" ` -MinPasswordAge "1.00:00:00" ` -MinPasswordLength 20 ` -PasswordHistoryCount 12 ` -ComplexityEnabled $true Add-ADPasswordPolicySubject -Identity "ServiceAccount_PasswordPolicy" -Subjects "Service_Accounts" # Normal kullanıcılar için standart politika New-ADPasswordPolicy -Name "StandardUser_PasswordPolicy" -Precedence 30 ` -MaxPasswordAge "45.00:00:00" ` -MinPasswordAge "1.00:00:00" ` -MinPasswordLength 14 ` -PasswordHistoryCount 24 ` -ComplexityEnabled $true Add-ADPasswordPolicySubject -Identity "StandardUser_PasswordPolicy" -Subjects "Domain_Users" | Kullanıcı Türü | Max Age | Min Length | History | Complexity | Rationale | 
|---|---|---|---|---|---|
| Domain Admins | 30 gün | 16 char | 36 | Enabled | Highest risk | 
| VIP Users | 30 gün | 16 char | 36 | Enabled | High-value targets | 
| IT Staff | 45 gün | 14 char | 24 | Enabled | Technical access | 
| Regular Users | 45 gün | 14 char | 24 | Enabled | Standard policy | 
| Service Accounts | 365 gün | 20 char | 12 | Enabled | Application stability | 
| External Users | 30 gün | 14 char | 12 | Enabled | Limited trust | 
function Set-AdaptivePasswordAge { param( $UserName, $RiskScore ) # Risk skoruna göre parola yaşını hesapla $baseAge = 45 $adaptiveAge = switch ($RiskScore) { {$_ -ge 80} { 15 } # Yüksek risk: 15 gün {$_ -ge 60} { 30 } # Orta yüksek risk: 30 gün {$_ -ge 40} { 45 } # Orta risk: 45 gün {$_ -ge 20} { 60 } # Düşük orta risk: 60 gün default { 90 } # Düşük risk: 90 gün } # Dinamik politika uygulama $policyName = "Adaptive_$UserName" New-ADPasswordPolicy -Name $policyName -MaxPasswordAge "$adaptiveAge.00:00:00" Add-ADPasswordPolicySubject -Identity $policyName -Subjects $UserName Write-Output "User $UserName assigned $adaptiveAge day password age based on risk score $RiskScore" } function Analyze-PasswordChangePatterns { param($UserName) # AD'den kullanıcının parola geçmişini al $user = Get-ADUser -Identity $UserName -Properties pwdLastSet, PasswordLastSet # Parola değişim geçmişini analiz et $changeEvents = Get-WinEvent -FilterHashtable @{ LogName = 'Security' ID = 4723, 4724 StartTime = (Get-Date).AddDays(-365) } | Where-Object {$_.Properties.Value -eq $UserName} # Pattern analysis $changeIntervals = @() for ($i = 1; $i -lt $changeEvents.Count; $i++) { $interval = ($changeEvents.TimeCreated - $changeEvents.TimeCreated).Days $changeIntervals += $interval } # Irregularity detection $averageInterval = ($changeIntervals | Measure-Object -Average).Average $irregularChanges = $changeIntervals | Where-Object {$_ -lt ($averageInterval * 0.3)} if ($irregularChanges.Count -gt 2) { Write-Warning "Irregular password change pattern detected for $UserName" # Trigger security review } } function Track-PasswordStrengthTrends { param($OrganizationalUnit) $users = Get-ADUser -SearchBase $OrganizationalUnit -Filter * -Properties PasswordLastSet, PasswordNeverExpires $strengthTrends = foreach ($user in $users) { $daysSinceChange = (Get-Date) - $user.PasswordLastSet # Historical password breach check (simulated) $breachRisk = Test-PasswordBreachHistory -UserName $user.SamAccountName @{ User = $user.SamAccountName DaysSinceChange = $daysSinceChange.Days BreachRisk = $breachRisk RecommendedAction = if ($daysSinceChange.Days -gt 45) { "Force Change" } elseif ($breachRisk -gt 0.7) { "Immediate Change" } else { "Monitor" } } } return $strengthTrends } function Send-PasswordExpirationAlerts { param( $WarningDays = 7, $SMTPServer = "mail.company.com", $FromEmail = "noreply@company.com" ) # Yakında süresi dolacak parolaları bul $expiringUsers = Search-ADAccount -PasswordExpired | Where-Object { $_.PasswordExpired -eq $false -and $_.DaysUntilPasswordExpires -le $WarningDays } foreach ($user in $expiringUsers) { $emailBody = @" Sayın $($user.Name), Parolanızın süresi $($user.DaysUntilPasswordExpires) gün içinde dolacaktır. Lütfen parolanızı en kısa sürede değiştirin. Parola gereksinimleri: - Minimum 14 karakter - Büyük harf, küçük harf, sayı ve özel karakter içermeli - Son 24 paroladan farklı olmalı IT Destek Ekibi "@ Send-MailMessage -To $user.EmailAddress -From $FromEmail -Subject "Parola Süresi Dolma Uyarısı" -Body $emailBody -SmtpServer $SMTPServer } Write-Output "Sent alerts to $($expiringUsers.Count) users" } # Scheduled task olarak günlük çalıştır Register-ScheduledTask -TaskName "PasswordExpirationAlerts" -Action (New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\PasswordAlerts.ps1") -Trigger (New-ScheduledTaskTrigger -Daily -At "09:00AM") function Get-PasswordPolicyCompliance { param($Domain = $env:USERDNSDOMAIN) $domainPolicy = Get-ADDefaultDomainPasswordPolicy -Identity $Domain $fineGrainedPolicies = Get-ADPasswordPolicy -Filter * $complianceReport = @{ Domain = $Domain DefaultMaxAge = $domainPolicy.MaxPasswordAge.Days DefaultCompliant = ($domainPolicy.MaxPasswordAge.Days -le 45) FineGrainedPolicies = $fineGrainedPolicies.Count LastAuditDate = Get-Date } # Fine-grained policy compliance $fgppCompliance = foreach ($policy in $fineGrainedPolicies) { @{ PolicyName = $policy.Name MaxAge = $policy.MaxPasswordAge.Days Compliant = ($policy.MaxPasswordAge.Days -le 45) AppliedTo = (Get-ADPasswordPolicySubject -Identity $policy.Name).Count } } $complianceReport | Add-Member -MemberType NoteProperty -Name "FineGrainedDetails" -Value $fgppCompliance return $complianceReport } # Haftalık compliance raporu $compliance = Get-PasswordPolicyCompliance $compliance | ConvertTo-Json -Depth 3 | Out-File "PasswordPolicyCompliance_$(Get-Date -Format 'yyyyMMdd').json" function Enable-SelfServicePasswordReset { param( $UserGroup = "Domain Users", $HelpDeskGroup = "IT_Support" ) # SSPR policy configuration $ssrpPolicy = @{ EnableSelfReset = $true RequiredMethods = 2 # En az 2 doğrulama yöntemi SecurityQuestions = 3 NotificationEmail = $true SMSNotification = $true MobileAppNotification = $true } # Group policy object oluştur $gpoName = "Self-Service Password Reset Policy" New-GPO -Name $gpoName -Comment "Enables SSPR for domain users" # SSPR settings uygula Set-GPRegistryValue -Name $gpoName -Key "HKLM\Software\Policies\Microsoft\PasswordReset" -ValueName "Enabled" -Type DWord -Value 1 Write-Output "Self-Service Password Reset enabled for $UserGroup" } function Get-PasswordAgeReport { param( $SearchBase = (Get-ADDomain).DistinguishedName, $CriticalAge = 60, $WarningAge = 45 ) $users = Get-ADUser -SearchBase $SearchBase -Filter {Enabled -eq $true} -Properties PasswordLastSet, PasswordNeverExpires, EmailAddress, Department $ageReport = foreach ($user in $users) { if ($user.PasswordLastSet) { $daysSinceChange = (Get-Date) - $user.PasswordLastSet $status = if ($user.PasswordNeverExpires) { "Never Expires" } elseif ($daysSinceChange.Days -gt $CriticalAge) { "Critical" } elseif ($daysSinceChange.Days -gt $WarningAge) { "Warning" } else { "Compliant" } } else { $daysSinceChange = ::MaxValue $status = "Never Set" } @{ UserName = $user.SamAccountName DisplayName = $user.Name Department = $user.Department EmailAddress = $user.EmailAddress PasswordLastSet = $user.PasswordLastSet DaysSinceChange = $daysSinceChange.Days Status = $status PasswordNeverExpires = $user.PasswordNeverExpires } } # Summary statistics $summary = @{ TotalUsers = $users.Count Compliant = ($ageReport | Where-Object Status -eq "Compliant").Count Warning = ($ageReport | Where-Object Status -eq "Warning").Count Critical = ($ageReport | Where-Object Status -eq "Critical").Count NeverExpires = ($ageReport | Where-Object Status -eq "Never Expires").Count CompliancePercentage = ::Round((($ageReport | Where-Object Status -eq "Compliant").Count / $users.Count) * 100, 2) } return @{ DetailedReport = $ageReport Summary = $summary } } # Rapor oluştur ve kaydet $passwordReport = Get-PasswordAgeReport $passwordReport.DetailedReport | Export-Csv -Path "PasswordAgeReport_$(Get-Date -Format 'yyyyMMdd').csv" $passwordReport.Summary | ConvertTo-Json | Out-File "PasswordAgeSummary_$(Get-Date -Format 'yyyyMMdd').json" function Simulate-PasswordAgeAttack { param( ]$TargetUsers, $MaxPasswordAge = 45 ) $vulnerableUsers = @() foreach ($user in $TargetUsers) { $userObj = Get-ADUser -Identity $user -Properties PasswordLastSet, AccountLockoutTime $daysSinceChange = (Get-Date) - $userObj.PasswordLastSet if ($daysSinceChange.Days -gt $MaxPasswordAge) { $riskScore = ::Min(100, ($daysSinceChange.Days / $MaxPasswordAge) * 50) $vulnerableUsers += @{ UserName = $user DaysSinceChange = $daysSinceChange.Days RiskScore = $riskScore AttackVector = if ($riskScore -gt 80) { "High Priority Target" } elseif ($riskScore -gt 60) { "Medium Priority Target" } else { "Low Priority Target" } } } } return $vulnerableUsers | Sort-Object RiskScore -Descending } function Implement-ContinuousAuthentication { param( $UserName, $RiskBasedChangeInterval ) # Kullanıcı davranış analizi $userBehavior = Get-UserBehaviorMetrics -UserName $UserName # Risk skoruna göre dinamik parola yaşı $dynamicAge = switch ($userBehavior.RiskScore) { {$_ -gt 80} { 7 } # Çok yüksek risk: Haftalık {$_ -gt 60} { 14 } # Yüksek risk: İki haftalık {$_ -gt 40} { 30 } # Orta risk: Aylık default { 45 } # Standart: 45 günlük } # Dinamik politika uygula Set-UserPasswordPolicy -UserName $UserName -MaxAge $dynamicAge } # Azure AD Connect password writeback function Configure-PasswordWriteback { param( $TenantId, $SubscriptionId ) # Azure AD password policy sync $hybridConfig = @{ PasswordAge = 45 SyncOnPremAD = $true WritebackEnabled = $true ConditionalAccess = $true } # PowerShell for Azure AD Connect-AzureAD -TenantId $TenantId # Conditional access policy for password age $caPolicy = @{ DisplayName = "Password Age Compliance" State = "Enabled" Conditions = @{ Users = @{ IncludeUsers = "All" } Applications = @{ IncludeApplications = "All" } } GrantControls = @{ Operator = "OR" BuiltInControls = @("RequirePasswordChange") } } New-AzureADMSConditionalAccessPolicy @caPolicy } Maximum password age politikasının 45 gün olarak ayarlanması, modern güvenlik standartlarına uygun kritik bir gereksinimdir. Bu yapılandırma, uzun süreli parola kullanımından kaynaklanan güvenlik risklerini önemli ölçüde azaltır ve organizasyonun genel güvenlik seviyesini artırır.
Bu yapılandırmaları uygulayarak, password-based saldırılara karşı dirençli, modern güvenlik standartlarına uygun bir kimlik yönetimi altyapısı oluşturabilir ve organizasyonunuzun siber güvenlik seviyesini önemli ölçüde artırabilirsiniz.