Kurumsal ortamlarda en sık karşılaşılan güvenlik sorunlarından biri, tüm makinelerde aynı yerel yönetici parolasının kullanılmasıdır. Bir saldırgan bu parolayı ele geçirdiğinde tüm domain’deki makinelere erişebilir hale gelir. Microsoft’un ücretsiz sunduğu LAPS (Local Administrator Password Solution), bu sorunu otomatik parola rotasyonu ile çözer. Bu yazıda LAPS’ı sıfırdan kurup yapılandıracağız, gerçek dünya senaryolarına bakacağız ve PowerShell ile yönetimi nasıl kolaylaştırabileceğimizi göreceğiz.
LAPS Nedir ve Neden Kullanmalısınız?
LAPS, her makinedeki yerel yönetici hesabının parolasını otomatik olarak değiştiren ve bu parolayı Active Directory’de şifreli şekilde saklayan bir çözümdür. Temel çalışma mantığı şudur: bir Group Policy ile belirlenen süre dolduğunda, makine kendi üzerindeki yerel yönetici parolasını rastgele oluşturur ve bu parolayı ilgili bilgisayar nesnesinin bir AD attribute’una yazar. Yetkili kişiler bu parolayı AD’den okuyabilir.
Neden bu kadar kritik?
- Pass-the-Hash saldırılarını büyük ölçüde engeller
- Lateral movement riskini minimuma indirir
- Her makinenin parolası farklı olduğundan tek bir ifşa tüm ağı etkilemedz
- Ücretsiz ve Microsoft destekli bir çözümdür
- Denetim ve uyumluluk gereksinimlerini karşılar
Pratikte gördüğüm bir senaryoyu anlatayım: 500 istemcili bir kurumda IT ekibi yıllarca P@ssw0rd123 gibi tek bir yerel admin parolası kullanmıştı. Bir phishing saldırısında tek bir makineden bu parola ele geçirildi ve saldırgan gece boyunca tüm domain’de yanal hareket etti. LAPS olsaydı, ele geçirilen parola sadece o tek makine için geçerli olacaktı.
LAPS Mimarisi
Sistem üç temel bileşenden oluşur:
- LAPS Client (CSE – Client Side Extension): Hedef makinelere yüklenen bileşen. Group Policy işlendiğinde parolayı değiştirir ve AD’ye yazar.
- Active Directory Attribute’ları:
ms-Mcs-AdmPwdparolayı,ms-Mcs-AdmPwdExpirationTimeise son kullanma tarihini tutar. - Management Tools: Yöneticilerin parolaları okuması ve yönetmesi için kullanılan araçlar.
Windows LAPS vs Legacy LAPS
Microsoft, Windows Server 2019/2022 ve Windows 10/11 ile birlikte Windows LAPS adında yerleşik bir LAPS çözümü sunmaktadır. Eski yöntem olan Legacy LAPS ise MSI paketi gerektirmektedir. Bu yazıda her ikisini de ele alacağız, ancak yeni kurulumlar için Windows LAPS tercih edilmesi önerilir.
Legacy LAPS Kurulumu
Active Directory Hazırlığı
Önce AD schema’yı genişletmemiz gerekiyor. Bu işlemi Schema Admins grubunun üyesi olan bir hesapla yapmalısınız.
# LAPS modülünü import et
Import-Module AdmPwd.PS
# AD Schema'yı güncelle
Update-AdmPwdADSchema
# Çıktıda şu mesajları görmelisiniz:
# Name DistinguishedName
# ---- -----------------
# ms-Mcs-AdmPwd CN=ms-Mcs-AdmPwd,CN=Schema,...
Schema güncellemesi tüm domain’e replike olana kadar beklemeniz gerekebilir. Büyük ortamlarda bu 15-30 dakika alabilir.
OU Seviyesinde İzin Yapılandırması
Her bilgisayarın kendi parolasını AD’ye yazabilmesi için gerekli izinleri vermeliyiz:
# Bilgisayarların kendi parolalarını yazmasına izin ver
# OU yolunu kendi ortamınıza göre düzenleyin
Set-AdmPwdComputerSelfPermission -OrgUnit "OU=Workstations,DC=contoso,DC=com"
# İç içe geçmiş OU'lar varsa recursive yapın
Get-ADOrganizationalUnit -Filter "Name -like '*'" |
ForEach-Object { Set-AdmPwdComputerSelfPermission -OrgUnit $_.DistinguishedName }
Parola Okuma İzinleri
Kimin parolayı görebileceğini belirleyelim. Bu kritik bir noktadır, çünkü varsayılan olarak Domain Admins zaten okuyabilir, ancak helpdesk gibi gruplara da bu yetkiyi vermek isteyebilirsiniz:
# Helpdesk grubuna parola okuma izni ver
Set-AdmPwdReadPasswordPermission -OrgUnit "OU=Workstations,DC=contoso,DC=com" -AllowedPrincipals "CONTOSOHelpdesk"
# IT-Admins grubuna hem okuma hem parola sıfırlama izni ver
Set-AdmPwdResetPasswordPermission -OrgUnit "OU=Workstations,DC=contoso,DC=com" -AllowedPrincipals "CONTOSOIT-Admins"
# Mevcut izinleri kontrol et
Find-AdmPwdExtendedRights -Identity "OU=Workstations,DC=contoso,DC=com"
LAPS Client Dağıtımı
LAPS MSI paketini tüm makinelere dağıtmak için SCCM, Intune veya basit bir GPO software deployment kullanabilirsiniz. Manuel kurulum için:
# Uzak makineye LAPS yükle (test amaçlı, production'da SCCM/Intune tercih edin)
$computers = Get-ADComputer -Filter * -SearchBase "OU=Workstations,DC=contoso,DC=com" |
Select-Object -ExpandProperty Name
foreach ($computer in $computers) {
$session = New-PSSession -ComputerName $computer
Invoke-Command -Session $session -ScriptBlock {
Start-Process msiexec.exe -ArgumentList "/i \dc01LAPS$LAPS.x64.msi /quiet /norestart" -Wait
}
Remove-PSSession $session
Write-Host "$computer - LAPS kuruldu" -ForegroundColor Green
}
Group Policy Yapılandırması
LAPS için iki ayrı GPO oluşturmanızı tavsiye ederim: biri LAPS ayarlarını, diğeri de güvenlik ayarlarını içersin.
Yeni GPO Oluşturma:
Group Policy Management Console’u açın, hedef OU’ya sağ tıklayın ve “Create a GPO in this domain” seçin.
GPO’yu düzenlerken şu yolu izleyin: Computer Configuration > Administrative Templates > LAPS
Yapılandırmanız gereken ayarlar:
- Enable local admin password management: Enabled
- Password Settings: Enabled
– Complexity: Large letters + small letters + numbers + specials – Length: 14 (minimum, ben 16 öneriyorum) – Age: 30 gün (NIST önerisi, siz ortamınıza göre ayarlayın)
- Name of administrator account to manage: Eğer varsayılan “Administrator” hesabını kullanmıyorsanız buraya özel ismi yazın
- Do not allow password expiration time longer than required by policy: Enabled
Windows LAPS Kurulumu (Modern Yöntem)
Windows Server 2019/2022 ve Windows 10 21H2+ sürümlerinde LAPS artık işletim sistemine entegre gelir. Ek MSI kurulumu gerekmez.
AD’yi Windows LAPS İçin Hazırlama
# Windows LAPS cmdlet'lerinin mevcut olduğunu kontrol et
Get-Command -Module LAPS
# AD Schema'yı Windows LAPS için güncelle
# Bu işlemi Schema Admin yetkisiyle yapın
Update-LapsADSchema
# OU'ya bilgisayar self-write izni ver
Set-LapsADComputerSelfPermission -Identity "OU=Workstations,DC=contoso,DC=com"
# Helpdesk grubuna parola okuma izni ver
Set-LapsADReadPasswordPermission -Identity "OU=Workstations,DC=contoso,DC=com" -AllowedPrincipals "CONTOSOHelpdesk"
Windows LAPS GPO Ayarları
Windows LAPS için GPO yolu farklıdır: Computer Configuration > Administrative Templates > System > LAPS
# GPO yerine registry ile hızlı test yapabilirsiniz (production'da GPO kullanın)
# Bu komutları hedef makinede çalıştırın
# LAPS'ı etkinleştir
Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesLAPS" `
-Name "BackupDirectory" -Value 1 -Type DWord
# Parola karmaşıklığı (4 = tüm karakter tipleri)
Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesLAPS" `
-Name "PasswordComplexity" -Value 4 -Type DWord
# Parola uzunluğu
Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesLAPS" `
-Name "PasswordLength" -Value 16 -Type DWord
# Parola geçerlilik süresi (gün)
Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesLAPS" `
-Name "PasswordAgeDays" -Value 30 -Type DWord
Parola Yönetimi ve Günlük Operasyonlar
LAPS devreye girdikten sonra en sık yapılan operasyonlar parola okuma ve sıfırlamadır.
Parola Okuma
# Legacy LAPS ile parola okuma
Get-AdmPwdPassword -ComputerName "WORKSTATION01"
# Windows LAPS ile parola okuma
Get-LapsADPassword -Identity "WORKSTATION01" -AsPlainText
# Birden fazla makine için toplu parola sorgulama
$computers = @("PC001", "PC002", "PC003")
foreach ($computer in $computers) {
$result = Get-LapsADPassword -Identity $computer -AsPlainText
[PSCustomObject]@{
ComputerName = $computer
Password = $result.Password
ExpirationTime = $result.ExpirationTimestamp
AccountName = $result.AccountName
}
} | Format-Table -AutoSize
# Süresi yakında dolacak parolaları bul (önümüzdeki 7 gün)
$threshold = (Get-Date).AddDays(7)
Get-ADComputer -Filter * -SearchBase "OU=Workstations,DC=contoso,DC=com" -Properties "ms-Mcs-AdmPwdExpirationTime" |
Where-Object {
$_."ms-Mcs-AdmPwdExpirationTime" -ne $null -and
[datetime]::FromFileTime($_."ms-Mcs-AdmPwdExpirationTime") -lt $threshold
} |
Select-Object Name, @{N="ExpiresAt";E={[datetime]::FromFileTime($_."ms-Mcs-AdmPwdExpirationTime")}}
Parola Sıfırlama
Bir makineyi bakıma aldıktan sonra veya güvenlik olayı yaşandıktan sonra parolayı hemen sıfırlamak isteyebilirsiniz:
# Legacy LAPS ile parola süresini sıfırla (makine bir sonraki GP uygulamasında parolayı değiştirir)
Reset-AdmPwdPassword -ComputerName "WORKSTATION01"
# Windows LAPS ile hemen sıfırla
Invoke-LapsPolicyProcessing
# Uzak makinede GP'yi zorla uygula ve parolayı yenile
Invoke-Command -ComputerName "WORKSTATION01" -ScriptBlock {
gpupdate /force
# GP uygulandıktan sonra LAPS parola değişimini tetikler
}
# Windows LAPS - sona erme zamanını geçmişe ayarlayarak bir sonraki GP döngüsünde sıfırlatma
Set-LapsADPasswordExpirationTime -Identity "WORKSTATION01" -WhenEffective (Get-Date).AddMinutes(-1)
Güvenlik Sertleştirmesi ve Best Practice’ler
LAPS’ı kurduktan sonra yapmanız gereken birkaç ek güvenlik adımı var.
Attribute Güvenliği
ms-Mcs-AdmPwd attribute’unun “Confidential” olarak işaretlenmesi, yetkisiz kişilerin AD enumeration yapmasını zorlaştırır:
# Attribute'u confidential olarak işaretle
# Bu işlemi Schema Admin ile yapın
$schemaPath = "CN=ms-Mcs-AdmPwd,CN=Schema,CN=Configuration," + (Get-ADDomain).DistinguishedName
$schemaObject = Get-ADObject -Identity $schemaPath -Properties searchFlags
$currentFlags = $schemaObject.searchFlags
# searchFlags'a 128 (CONFIDENTIAL) ekle
Set-ADObject -Identity $schemaPath -Replace @{searchFlags = ($currentFlags -bor 128)}
Denetim Logları
Kim, ne zaman hangi makinenin parolasını okudu? Bu soruyu cevaplayabilmek için denetim politikası kurulmalıdır:
# AD nesne erişim denetimini etkinleştir
# Domain Controller'da çalıştırın
auditpol /set /subcategory:"Directory Service Access" /success:enable /failure:enable
# LAPS parola okuma olaylarını filtrele (Event ID 4662)
Get-WinEvent -FilterHashtable @{
LogName = "Security"
Id = 4662
} | Where-Object {
$_.Message -match "ms-Mcs-AdmPwd"
} | Select-Object TimeCreated,
@{N="Who";E={$_.Properties[1].Value}},
@{N="Object";E={$_.Properties[6].Value}} |
Sort-Object TimeCreated -Descending |
Select-Object -First 20
Yaygın Yapılandırma Hataları
Yıllarca LAPS kurulumu yaparken şu hataları tekrar tekrar gördüm:
- Varsayılan Administrator hesabını kapatmak ama LAPS’ı özel hesap için yapılandırmamak: LAPS “Administrator” hesabını yönetir, özel bir local admin hesabı oluşturdaysanız GPO’da ismini belirtmelisiniz.
- Schema güncellemesini replikasyon tamamlanmadan yapmak: Bir DC’de schema güncellemesi yapıldıktan hemen sonra diğer DC’lerde LAPS operasyonları yaparsanız hatalar alırsınız. Replikasyonu bekleyin.
- Okuma iznini çok geniş vermek: “Domain Users tüm parolaları okuyabilsin” gibi bir yapılandırma, LAPS’ı anlamsız kılar. En az yetki prensibine uyun.
- GP uygulanmadan önce parolayı sorgulamak: LAPS client kurulup ilk GP uygulanana kadar AD’de parola bulunmaz.
ms-Mcs-AdmPwdattribute boş kalır.
Monitoring ve Raporlama
Kurumsal ortamlarda LAPS sağlığını izlemek şart:
# LAPS yönetilen ve yönetilmeyen makineleri raporla
function Get-LapsComplianceReport {
param(
[string]$SearchBase = (Get-ADDomain).DistinguishedName
)
$allComputers = Get-ADComputer -Filter {Enabled -eq $true} -SearchBase $SearchBase `
-Properties "ms-Mcs-AdmPwd", "ms-Mcs-AdmPwdExpirationTime", LastLogonDate
$report = foreach ($computer in $allComputers) {
$hasPassword = -not [string]::IsNullOrEmpty($_."ms-Mcs-AdmPwd")
$expirationTime = $null
if ($computer."ms-Mcs-AdmPwdExpirationTime") {
$expirationTime = [datetime]::FromFileTime($computer."ms-Mcs-AdmPwdExpirationTime")
}
[PSCustomObject]@{
ComputerName = $computer.Name
LAPSEnabled = -not [string]::IsNullOrEmpty($computer."ms-Mcs-AdmPwd")
PasswordExpires = $expirationTime
IsExpired = if ($expirationTime) { $expirationTime -lt (Get-Date) } else { $null }
LastLogon = $computer.LastLogonDate
}
}
Write-Host "=== LAPS Uyumluluk Raporu ===" -ForegroundColor Cyan
Write-Host "Toplam Makine: $($report.Count)"
Write-Host "LAPS Yönetilen: $(($report | Where-Object LAPSEnabled).Count)" -ForegroundColor Green
Write-Host "LAPS Yonetilmeyen: $(($report | Where-Object {-not $_.LAPSEnabled}).Count)" -ForegroundColor Red
Write-Host "Suresi Dolmus Parola: $(($report | Where-Object IsExpired).Count)" -ForegroundColor Yellow
return $report
}
Get-LapsComplianceReport -SearchBase "OU=Workstations,DC=contoso,DC=com"
Intune ile LAPS (Azure AD / Entra ID)
Hibrit veya tam bulut ortamlarda Intune üzerinden LAPS yapılandırması giderek yaygınlaşıyor. Azure AD join makineler için:
Microsoft Endpoint Manager admin center üzerinden: Endpoint Security > Account protection > Create Policy > Windows 10 and later > Local admin password solution (Windows LAPS)
Policy ayarları:
- Backup directory: Azure Active Directory
- Password age days (Azure AD): 30
- Password length: 16
- Password complexity: Large letters + small letters + numbers + special characters
- Post authentication actions: Reset password and logoff
Intune ile dağıtılan LAPS parolalarını Azure Portal veya Graph API ile sorgulayabilirsiniz:
# Microsoft Graph ile Azure AD LAPS parolası sorgula
# Önce gerekli modülü yükle
Install-Module Microsoft.Graph -Scope CurrentUser
Connect-MgGraph -Scopes "DeviceLocalCredential.Read.All"
# Cihaz ID'si ile parola sorgula
$deviceId = (Get-MgDevice -Filter "displayName eq 'WORKSTATION01'").Id
Get-MgDeviceLocalCredential -DeviceId $deviceId
Gerçek Dünya Senaryoları
Senaryo 1: Helpdesk Parolasını Nasıl Alır?
Helpdesk ekibi bir kullanıcının bilgisayarına erişmesi gerektiğinde:
# Helpdesk için basit parola sorgulama scripti
# Bunu helpdesk portalına entegre edebilirsiniz
param([Parameter(Mandatory)][string]$ComputerName)
try {
$computer = Get-ADComputer -Identity $ComputerName -ErrorAction Stop
$password = Get-LapsADPassword -Identity $ComputerName -AsPlainText
Write-Host "Bilgisayar: $ComputerName" -ForegroundColor Cyan
Write-Host "Hesap: $($password.AccountName)"
Write-Host "Parola: $($password.Password)" -ForegroundColor Yellow
Write-Host "Gecerlilik: $($password.ExpirationTimestamp)"
# Parolayı görüntüledikten sonra log kaydet
Write-EventLog -LogName Application -Source "LAPS-Helpdesk" `
-EventId 1001 -Message "Parola goruntulendi: $ComputerName - $env:USERNAME"
} catch {
Write-Host "Hata: $($_.Exception.Message)" -ForegroundColor Red
}
Senaryo 2: Toplu Sunucu Parolası Rotasyonu
Bir güvenlik olayının ardından tüm sunucuların parolalarını sıfırlamanız gerektiğinde:
# Tüm sunucu parolalarını bir sonraki GP döngüsünde sıfırlatmak için sona erme zamanını geçmişe çek
$servers = Get-ADComputer -Filter * -SearchBase "OU=Servers,DC=contoso,DC=com"
foreach ($server in $servers) {
Set-LapsADPasswordExpirationTime -Identity $server.Name -WhenEffective (Get-Date).AddMinutes(-1)
Write-Host "$($server.Name) - Parola sifirlamasi planlandı" -ForegroundColor Green
}
Write-Host "`nToplam $($servers.Count) sunucu icin parola sifirlamasi planlandı."
Write-Host "Sunucularda gpupdate calistirildiktan sonra parolalar yenilenecek."
Sorun Giderme
Sık karşılaşılan sorunlar ve çözümleri:
- Parola AD’ye yazılmıyor: Event Viewer’da
Application and Services Logs > Microsoft > Windows > LAPS > Operationalloguna bakın. Bilgisayar hesabınınms-Mcs-AdmPwdattribute’una yazma izni olduğundan emin olun. - “Access Denied” hatası: Parolayı okumaya çalışan hesabın ilgili OU için
Set-AdmPwdReadPasswordPermissionile yetkilendirilmiş olduğunu kontrol edin. - GPO uygulanmıyor:
gpresult /rile LAPS GPO’sunun uygulandığını doğrulayın. Çakışan GPO’lar olabilir. - Eski LAPS ve Windows LAPS çakışması: İkisi aynı anda aktif olmamalı. Geçiş döneminde dikkatli olun.
# LAPS durumunu makinede kontrol et
# Hedef makinede çalıştırın
Get-WinEvent -LogName "Microsoft-Windows-LAPS/Operational" -MaxEvents 20 |
Select-Object TimeCreated, LevelDisplayName, Message |
Format-List
Sonuç
LAPS, kurumsal güvenlik arsenalinde olması gereken temel araçlardan biridir. Kurulumu görece basit, maliyeti sıfır, faydası ise muazzamdır. Özellikle pass-the-hash ve lateral movement saldırılarına karşı sağladığı koruma, onu vazgeçilmez kılar.
Önerdiğim uygulama sırası şöyle olabilir: Önce test ortamında Legacy LAPS veya Windows LAPS’ı kurun ve birkaç hafta izleyin. Ardından pilot bir OU ile production’a geçin. Son olarak tüm makine parkınıza yayın. Monitoring scriptlerini günlük çalıştıracak şekilde Task Scheduler’a ekleyin ve uyumsuz makineleri haftalık raporla takip edin.
Yeni ortamlar için kesinlikle Windows LAPS tercih edin; Legacy LAPS’ın geliştirilmesi durdurulmuş durumda ve Microsoft tüm yatırımını Windows LAPS’a yapmaktadır. Hibrit ortamlarda ise Azure AD entegrasyonunu değerlendirin, özellikle Remote/Hybrid çalışanların makineleri için Intune üzerinden yönetim çok daha pratiktir.
Son olarak şunu vurgulayalım: LAPS tek başına yeterli değildir. Privileged Access Workstation, JIT access ve güçlü parola politikaları ile birleştiğinde gerçek anlamda derinlemesine savunma (defense in depth) stratejisi oluşturur.