Maximum Password Age (Misconfiguration)

Maximum Password Age (Misconfiguration)

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 Nedir?

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.

Password Policy Bileşenleri

Core Password Policies:

  • Maximum Password Age: Parolanın maksimum kullanım süresi (önerilen: 45 gün)
  • Minimum Password Age: Parolanın minimum kullanım süresi (önerilen: 1 gün)
  • Password History: Hatırlanan eski parola sayısı (önerilen: 12-24)
  • Minimum Password Length: Minimum parola uzunluğu (önerilen: 14+ karakter)
  • Password Complexity: Karmaşıklık gereksinimleri

Password Age Timeline:

Gün 0 Gün 45 Gün 50 Gün 60 │ │ │ │ │◄───────┴────────┴────────┤ │ │ New Warning Grace Account Password Period Period Disabled 

Güvenlik Riskleri ve Saldırı Vektörleri

1. Prolonged Exposure Risk

Extended Attack Window:

Uzun süre aynı parola kullanımı şu riskleri artırır:

  • Brute force saldırılarına daha fazla zaman tanır
  • Password spraying saldırılarının başarı oranını artırır
  • Social engineering ile elde edilen parolaların uzun süre geçerli kalması
  • Credential stuffing saldırılarında kullanılabilir durumda kalması

Statistical Risk Analysis:

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) 

2. Credential Harvesting Impact

Data Breach Scenarios:

  • Phishing saldırıları ile elde edilen parolalar uzun süre kullanılabilir
  • Keylogger malware ile çalınan parolalar değerini korur
  • Network sniffing ile yakalanan hash'ler daha uzun süre geçerli kalır
  • Insider threats durumunda parolaların uzun süre bilinmesi

Örnek Saldırı Timeline:

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 

3. Advanced Persistent Threat (APT) Facilitation

Long-term Access Maintenance:

  • APT grupları uzun süre sistemde kalabilir
  • Çalınan credential'lar uzun süre geçerli kalır
  • Backdoor hesaplar fark edilmeden kullanılabilir
  • Dormant access'ler uzun süre aktif kalır

4. Password Reuse and Predictability

Human Password Behavior:

# 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" } } 

Çözüm Yöntemleri

1. Group Policy (GPO) ile Yapılandırma

Default Domain Policy Ayarları:

Yol: Computer Configuration → Windows Settings → Security Settings → Account Policies → Password Policy

Önerilen Konfigürasyon:

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 

PowerShell ile GPO Yapılandırması:

# 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." 

2. Fine-Grained Password Policy (FGPP) Uygulama

Farklı Kullanıcı Grupları için Özel Politikalar:

Executive/VIP Users:

# 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" 

Service Accounts:

# 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" 

Regular Users:

# 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" 

3. Password Policy Tablosu

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

Gelişmiş Parola Yönetimi Stratejileri

1. Adaptive Password Policies

Risk-Based Password Aging:

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" } 

2. Behavioral Analysis Integration

Password Change Pattern Detection:

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 } } 

3. Machine Learning-Based Password Prediction

Password Strength Evolution Tracking:

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 } 

Monitoring ve Automation

1. Password Expiration Monitoring

Automated Alert System:

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") 

2. Compliance Reporting

Password Policy Audit Script:

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" 

3. User Experience Optimization

Self-Service Password Reset Integration:

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" } 

Security Validation ve Testing

1. Password Age Audit Tools

Comprehensive Password Age Analysis:

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" 

2. Penetration Testing Simulation

Password Age-Based Attack Simulation:

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 } 

İleri Seviye Güvenlik Stratejileri

1. Zero Trust Password Model

Continuous Authentication:

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 } 

2. Integration with Identity Providers

Azure AD Hybrid Configuration:

# 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 } 

Sonuç ve Öneriler

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.

Hızlı Uygulama Rehberi:

  1. Mevcut password age ayarlarını audit edin
  2. Default domain policy'i 45 gün olarak ayarlayın
  3. Fine-grained policy'leri farklı user grupları için yapılandırın
  4. Automated monitoring ve alerting sistemi kurun
  5. Self-service password reset özelliğini aktifleştirin
  6. User training programı başlatın

Kritik Kontrol Listesi:

  • ✅ Maximum password age ≤ 45 gün mı?
  • ✅ Farklı risk seviyeleri için özel policy'ler tanımlandı mı?
  • ✅ Password expiration alerting sistemi aktif mi?
  • ✅ SSPR (Self-Service Password Reset) yapılandırıldı mı?
  • ✅ Compliance monitoring otomatikleştirildi mi?
  • ✅ User education programı tamamlandı mı?

Modern Güvenlik Yaklaşımları:

  • Risk-based adaptive password aging uygulayın
  • Behavioral analytics ile anomali tespiti yapın
  • Zero Trust model ile continuous authentication sağlayın
  • Multi-factor authentication zorunluluğu getirin
  • Password-less authentication alternativlerini değerlendirin

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.

Önceki Yazı Built-in Administrator Account Güvenliği (Misconfiguration)
Built-in Administrator Account Güvenliği (Misconfiguration)

Built-in Administrator Account Güvenlik Açığı: En Kritik Güvenlik Riski Wi...

Sonraki Yazı Administrator Account Enumeration (Misconfiguration)
Administrator Account Enumeration (Misconfiguration)

UAC Elevation Sırasında Bilgi Sızıntısı Windows User Account Control (UAC)...