802.1X ile Windows Server NPS Ağ Erişim Kontrolü
Kurumsal ağlarda “kim bağlanıyor?” sorusunun cevabını bilmemek, güvenlik açısından gerçek bir kabustur. Bir noktada switch portuna takılan her cihazın ağa erişebildiği dönemler geride kaldı ama hâlâ bu şekilde çalışan onlarca kurumla karşılaşıyorum. 802.1X, bu problemi port bazlı kimlik doğrulama ile çözen bir IEEE standardıdır ve Windows Server NPS (Network Policy Server) ile birlikte kullandığınızda oldukça güçlü bir NAC (Network Access Control) altyapısı kurabilirsiniz. Bu yazıda sıfırdan kurulum yapacağız, gerçek hayatta karşılaştığım sorunları aktaracağım ve production ortamı için gerekli ince ayarları da işleyeceğiz.
802.1X Nedir ve Neden Kullanmalısınız?
802.1X, IEEE tarafından tanımlanmış port bazlı ağ erişim kontrolü standardıdır. Üç temel bileşeni vardır:
- Supplicant: Ağa bağlanmak isteyen istemci (bilgisayar, telefon, yazıcı)
- Authenticator: Erişim noktası veya switch (Cisco, HP, Aruba vs.)
- Authentication Server: Kimlik doğrulama kararını veren sunucu (bizim durumumuzda NPS)
Bir istemci switch portuna bağlandığında port önce “unauthorized” modda kalır, yani hiçbir trafik geçmez. Supplicant kimlik bilgilerini gönderir, authenticator bunları NPS’e iletir, NPS Active Directory üzerinde doğrulama yapar ve “Access-Accept” ya da “Access-Reject” döner. Bu kadar basit ama bu kadar güçlü.
Kurumunuzda 802.1X’e ihtiyacınız olduğuna dair birkaç senaryo: Misafir bir ziyaretçi kendi laptopunu konferans odasındaki ethernet portuna takıyor. BYOD politikası var ama hangi cihazların güvenli olduğunu bilemiyorsunuz. Güvenlik denetiminde “network segmentation” soruluyor ve switch ACL’lerinden başka bir şey gösteremiyorsunuz.
Mimari ve Ön Gereksinimler
Bu yazıda kuracağımız mimari şu şekilde olacak:
- Windows Server 2022 üzerinde NPS rolü
- Active Directory domain ortamı (contoso.local)
- Cisco veya HP switch (RADIUS client olarak)
- Domain üyesi Windows istemciler
- CA altyapısı (PEAP-MSCHAPv2 için sunucu sertifikası)
NPS kurulumu için domain controller olması şart değil, ayrı bir member server üzerinde de kurabilirsiniz. Hatta production’da bunu öneririm, NPS yükü DC’yi etkilemesin.
Ön gereksinimler:
- Active Directory: Kurulu ve çalışıyor olmalı
- PKI/CA: NPS sunucu sertifikası için Enterprise CA öneriyorum
- NPS Sunucu: En az 2 vCPU, 4 GB RAM (orta ölçekli kurumlar için)
- Switch: RADIUS desteği olan herhangi bir yönetilebilir switch
- DNS: NPS FQDN’i doğru çözümlenebilmeli
NPS Rolünün Kurulumu
Server Manager üzerinden de kurabilirsiniz ama PowerShell ile yapalım, hem daha hızlı hem de tekrarlanabilir:
# NPS rolünü kur
Install-WindowsFeature NPAS -IncludeManagementTools
# Kurulum doğrulama
Get-WindowsFeature NPAS | Select-Object Name, InstallState, DisplayName
# NPS servisini başlat ve otomatik başlatmayı ayarla
Set-Service -Name IAS -StartupType Automatic
Start-Service -Name IAS
Kurulum tamamlandıktan sonra NPS’i Active Directory’e kaydetmeniz gerekiyor. Bu adım kritik, atlamayın. NPS, AD üzerinde kullanıcı dial-in özelliklerini okuyabilmek için bu kaydı yapmak zorunda:
# NPS'i Active Directory'e kaydet
netsh ras add registeredserver
# Veya NPS konsolundan: NPS > sağ tık > Register Server in Active Directory
# PowerShell ile doğrulama
Get-ItemProperty "HKLM:SYSTEMCurrentControlSetServicesRemoteAccessParameters" | Select-Object ServerFlags
RADIUS Client Tanımlaması (Switch Konfigürasyonu)
NPS tarafında switch’i RADIUS client olarak tanımlamanız gerekiyor. Shared secret’ı güçlü tutun, en az 22 karakter, harf-rakam-özel karakter karışımı:
# PowerShell ile RADIUS client ekle
$sharedSecret = ConvertTo-SecureString "Str0ng$ecret!NPS2024#Corp" -AsPlainText -Force
New-NpsRadiusClient `
-Name "CoreSwitch-01" `
-Address "10.10.1.254" `
-SharedSecret $sharedSecret `
-AuthAttributeRequired $false `
-VendorName "RADIUS Standard"
# Birden fazla switch için döngü
$switches = @(
@{Name="SW-Floor1"; IP="10.10.1.1"},
@{Name="SW-Floor2"; IP="10.10.1.2"},
@{Name="SW-Floor3"; IP="10.10.1.3"}
)
foreach ($sw in $switches) {
New-NpsRadiusClient `
-Name $sw.Name `
-Address $sw.IP `
-SharedSecret $sharedSecret
Write-Host "$($sw.Name) eklendi" -ForegroundColor Green
}
Switch tarafında Cisco IOS için örnek konfigürasyon:
# Cisco IOS - Global RADIUS konfigürasyonu
radius server NPS-PRIMARY
address ipv4 10.10.2.10 auth-port 1812 acct-port 1813
key Str0ng$ecret!NPS2024#Corp
aaa new-model
aaa authentication dot1x default group radius
aaa authorization network default group radius
aaa accounting dot1x default start-stop group radius
dot1x system-auth-control
# Interface seviyesinde 802.1X aktifleştirme
interface GigabitEthernet1/0/1
description Workstation-Port
switchport mode access
switchport access vlan 100
authentication port-control auto
dot1x pae authenticator
spanning-tree portfast
HP ProCurve/Aruba switch kullanıyorsanız syntax farklıdır ama mantık aynıdır. O switch belgelerine bakmanızı öneririm, her model için ufak farklılıklar olabiliyor.
Network Policy Oluşturma
NPS’in kalbi burasıdır. Connection Request Policy ve Network Policy olmak üzere iki ayrı policy tipi var. Connection Request Policy, isteğin nasıl işleneceğini belirler (local mı işlensin, proxy’ye mi yönlendirilsin). Network Policy ise erişim kararını verir.
# Önce mevcut policy'leri listeleyelim
Get-NpsNetworkPolicy | Select-Object Name, ProcessingOrder, PolicySource
# Domain Computers için policy oluştur
New-NpsNetworkPolicy `
-Name "802.1X Domain Computers" `
-ProcessingOrder 1 `
-PolicySource "Use Windows authentication for all users" `
-AuthType "PEAPorEAP" `
-ConditionString @(
"MATCH("Windows-Groups=contoso\Domain Computers")"
)
GUI üzerinden yaparken şu adımları izleyin:
NPS konsolunda Policies > Network Policies > New seçeneğine tıklayın. Policy adını “802.1X Domain Computers” koyun. Conditions sekmesinde Windows Groups ekleyin, “Domain Computers” grubunu seçin. NAS Port Type olarak “Ethernet” seçin. Constraints sekmesinde Authentication Methods altında PEAP’ı ekleyin ve inner method olarak MS-CHAP v2 seçin.
PEAP için sunucu sertifikası seçmeniz gerekecek. Enterprise CA’dan verilen bir sertifika burada otomatik görünür. Self-signed kullanmayın, istemcilerde güven sorunu yaşarsınız.
Active Directory Grup Yapısı ve Politika Tasarımı
Gerçek hayatta tek bir policy yetmez. Gruplar halinde düşünün:
# AD'de gerekli grupları oluştur
New-ADGroup -Name "NPS-FullAccess" `
-GroupScope Universal `
-GroupCategory Security `
-Path "OU=Security Groups,DC=contoso,DC=local" `
-Description "802.1X tam erisim - domain bilgisayarlar"
New-ADGroup -Name "NPS-LimitedAccess" `
-GroupScope Universal `
-GroupCategory Security `
-Path "OU=Security Groups,DC=contoso,DC=local" `
-Description "802.1X kisitli erisim - BYOD ve misafir"
New-ADGroup -Name "NPS-Blocked" `
-GroupScope Universal `
-GroupCategory Security `
-Path "OU=Security Groups,DC=contoso,DC=local" `
-Description "802.1X erisimi engellenen cihazlar"
# Bilgisayarları gruba ekle (örnek)
Add-ADGroupMember -Identity "NPS-FullAccess" `
-Members (Get-ADComputer -Filter * -SearchBase "OU=Workstations,DC=contoso,DC=local")
VLAN ataması için Network Policy’de RADIUS attributes kullanmanız gerekiyor. Bu kısım çok kritik, özellikle dinamik VLAN atamasında:
# VLAN attributes eklemek için NPS policy güncelleme
# RADIUS attribute ID'leri:
# 64 = Tunnel-Type (13 = VLAN)
# 65 = Tunnel-Medium-Type (6 = IEEE 802)
# 81 = Tunnel-Private-Group-ID (VLAN ID)
$policy = Get-NpsNetworkPolicy -Name "802.1X Domain Computers"
# Manuel olarak attribute eklemek için Set-NpsNetworkPolicy kullanın
# veya XML export/import yöntemi daha güvenilirdir
# Policy'i XML olarak export et, düzenle ve import et
Export-NpsConfiguration -Path "C:NPS-Backupnps-config.xml"
XML içinde VLAN attribute’larını şu şekilde ekleyebilirsiniz:
<!-- NPS XML konfigürasyonunda VLAN attribute örneği -->
<RadiusAttributes>
<RadiusAttribute>
<VendorId>0</VendorId>
<AttributeId>64</AttributeId>
<AttributeValue>13</AttributeValue>
</RadiusAttribute>
<RadiusAttribute>
<VendorId>0</VendorId>
<AttributeId>65</AttributeId>
<AttributeValue>6</AttributeValue>
</RadiusAttribute>
<RadiusAttribute>
<VendorId>0</VendorId>
<AttributeId>81</AttributeId>
<AttributeValue>100</AttributeValue>
</RadiusAttribute>
</RadiusAttributes>
NPS Logging ve İzleme
Production’da logging olmadan NPS çalıştırmak kör uçmak gibidir. Hem SQL logging hem de Windows Event Log kullanın:
# NPS log dosyası ayarları
# Log dosyaları varsayılan olarak C:WindowsSystem32LogFiles altında
# Event Log'dan başarısız kimlik doğrulama girişimlerini çek
Get-WinEvent -LogName "Security" | Where-Object {
$_.Id -eq 6273 # Network Policy Server denied access
} | Select-Object TimeCreated, Message | Format-List
# Başarılı authentications
Get-WinEvent -LogName "Security" | Where-Object {
$_.Id -eq 6272 # Network Policy Server granted access
} | Select-Object TimeCreated -First 20
# NPS özel event log'u
Get-WinEvent -LogName "System" | Where-Object {
$_.ProviderName -eq "IAS"
} | Select-Object TimeCreated, Id, Message | Format-List
SQL Server logging için NPS konsolundan Accounting > Configure Accounting altında SQL Server seçeneğini aktif edin. Bu şekilde tüm authentication logları sorgulanabilir hale gelir. Özellikle compliance gereksinimleri olan kurumlarda bu zorunlu.
Sorun Giderme
NPS’in en çok zaman alan kısmı troubleshooting’dir. Yıllar içinde öğrendiğim en yaygın sorunlar ve çözümleri:
Sorun 1: İstemci “Unable to connect” hatası alıyor ama policy var
Event ID 6273’e bakın, reason code sizi doğru yönlendirir. Reason code 16 “Authentication failed due to user credentials mismatch” demektir, kullanıcı adı/şifre ya da sertifika sorunu var. Reason code 48 ise “The connection request did not match any configured network policy” anlamına gelir.
# Spesifik reason code'ları filtrele
Get-WinEvent -LogName "Security" | Where-Object {
$_.Id -eq 6273
} | ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Time = $_.TimeCreated
User = $xml.Event.EventData.Data | Where-Object {$_.Name -eq "SubjectUserName"} | Select-Object -ExpandProperty "#text"
Reason = $xml.Event.EventData.Data | Where-Object {$_.Name -eq "Reason"} | Select-Object -ExpandProperty "#text"
CallingStation = $xml.Event.EventData.Data | Where-Object {$_.Name -eq "CallingStationID"} | Select-Object -ExpandProperty "#text"
}
} | Format-Table -AutoSize
Sorun 2: Switch RADIUS server’a ulaşamıyor
# Cisco switch'ten RADIUS test
test aaa group radius server 10.10.2.10 testuser testpassword new-code
# NPS sunucusunda firewall rule kontrolü
netsh advfirewall firewall show rule name="Network Policy Server"
# UDP 1812 ve 1813 portları açık mı?
Test-NetConnection -ComputerName 10.10.2.10 -Port 1812
Sorun 3: Sertifika güven sorunu (PEAP)
İstemcilerde CA sertifikası Trusted Root CA store’unda olmadığında PEAP doğrulaması başarısız olur. Group Policy ile dağıtın:
# CA sertifikasını GPO ile dağıtmak için
# Computer Configuration > Windows Settings > Security Settings
# > Public Key Policies > Trusted Root Certification Authorities
# Sertifika store kontrolü
Get-ChildItem Cert:LocalMachineRoot | Where-Object {
$_.Subject -like "*ContosoCA*"
} | Select-Object Subject, Thumbprint, NotAfter
High Availability ve Yedeklilik
Tek NPS sunucusu production için risk oluşturur. İki NPS sunucusu arasında konfigürasyon senkronizasyonu için düzenli export/import rutini kurmanızı öneririm:
# NPS konfigürasyonunu yedekle ve ikinci sunucuya aktar
$backupPath = "\fileservernps-backupnps-$(Get-Date -Format 'yyyyMMdd-HHmm').xml"
# Primary NPS'te çalıştır
Export-NpsConfiguration -Path $backupPath
# Secondary NPS'te çalıştır
Import-NpsConfiguration -Path $backupPath
# Her gece çalışacak scheduled task oluştur
$action = New-ScheduledTaskAction `
-Execute "PowerShell.exe" `
-Argument "-NonInteractive -Command Export-NpsConfiguration -Path '$backupPath'"
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
Register-ScheduledTask `
-TaskName "NPS-Config-Backup" `
-Action $action `
-Trigger $trigger `
-RunLevel Highest `
-User "SYSTEM"
Switch tarafında iki NPS sunucusunu tanımlayın, primary ve secondary olarak. Switch, primary’ye ulaşamazsa otomatik secondary’ye geçer. Bu geçiş süresi genellikle 30-60 saniyedir, switch vendor’a göre değişir.
MAB (MAC Authentication Bypass) ve IoT Cihazlar
Yazıcılar, IP telefonlar, kameralar gibi 802.1X supplicant’ı olmayan cihazlar için MAB kullanmanız gerekir. MAB’da cihazın MAC adresi kullanıcı adı ve şifre olarak RADIUS’a gönderilir.
NPS tarafında bunun için ayrı bir policy oluşturun ve bu MAC adreslerini AD’de bir gruba ekleyin ya da NPS’in local kullanıcı veritabanında tanımlayın:
# MAB için NPS policy - MAC adresi kullanıcı adı olarak geliyor
New-NpsNetworkPolicy `
-Name "802.1X MAB Devices" `
-ProcessingOrder 10 `
-AuthType "Unauthenticated" `
-ConditionString @(
"MATCH("Windows-Groups=contoso\NPS-MABDevices")"
)
# MAC adreslerini AD grubuna kullanıcı olarak ekleyebilir
# veya NPS'te ayrı bir network policy + RADIUS users ile yönetebilirsiniz
Gerçek hayatta MAB listesini yönetmek ciddi bir operasyonel yük oluşturabilir. 200 yazıcısı olan bir kurumda her yazıcı değişiminde MAC adresini güncellemek zorunda kaldığımı söylesem abartmış olmam. Bu yüzden IPAM ve asset management sistemiyle entegrasyon düşünmenizi öneririm.
Güvenlik Sertleştirme Notları
Kurulum tamamlandıktan sonra şu güvenlik önlemlerini alın:
- Shared secret rotasyonu: Altı ayda bir switch ve NPS arasındaki shared secret’ı değiştirin. Script ile otomatikleştirmek mümkün.
- NPS sunucusu hardening: NPS sunucusunda gereksiz rolleri kaldırın. Sadece NPAS rolü yeterli.
- Log retention: NPS loglarını en az 90 gün saklayın, tercihen merkezi SIEM’e gönderin.
- Sertifika süresi: NPS sunucu sertifikası dolmadan önce yenileyin. Sertifika dolduğunda tüm 802.1X kimlik doğrulaması durur, bunu zor yoldan öğrendim.
- RADIUS attribute filtreleme: Switch’ten gelen attribute’ları NPS policy’de sınırlayın, gereksiz attribute’ların geçmesine izin vermeyin.
# Sertifika süresi monitoring scripti
$npsCert = Get-ChildItem Cert:LocalMachineMy | Where-Object {
$_.EnhancedKeyUsageList.FriendlyName -contains "Server Authentication"
} | Sort-Object NotAfter | Select-Object -First 1
$daysLeft = ($npsCert.NotAfter - (Get-Date)).Days
if ($daysLeft -lt 30) {
Send-MailMessage `
-To "[email protected]" `
-From "[email protected]" `
-Subject "UYARI: NPS Sertifikasi $daysLeft gun icinde doluyor!" `
-Body "NPS sunucu sertifikasi: $($npsCert.Subject) - Son gecerlilik: $($npsCert.NotAfter)" `
-SmtpServer "mail.contoso.com"
}
Sonuç
802.1X ve NPS kombinasyonu, kurumsal ağ güvenliğinin temel taşlarından biridir. Zero trust mimarisine geçiş yaparken bu altyapı size sağlam bir başlangıç noktası sunar. Kurulum zahmetli görünebilir, özellikle PKI ve switch konfigürasyonu aynı anda ele alındığında, ama bir kez çalışır hale getirdiğinizde operasyonel getirisi çok yüksek.
Önemli hatırlatmalar: Test ortamında pilot grup ile başlayın, tüm portları aynı anda 802.1X’e geçirmeye çalışmayın. MAB cihaz listesini asset management ile entegre edin. NPS log’larını SIEM’e gönderin ve anormallik alarmları kurun. Sertifika yönetimini ihmal etmeyin, bu konuda hata yapanların sayısı hiç azalmıyor.
Şirket ağınızda hâlâ herkesin her porta takılıp ağa girebiliyorsa, 802.1X artık bir lüks değil zorunluluktur. Regulatory compliance açısından da bu giderek daha fazla sorgulanır hale geliyor. Başlamak için en iyi zaman, birkaç yıl önceydi. İkinci en iyi zaman bugün.
