Politiky hesel a zamykání účtů pomocí Group Policy

V každé síti je třeba řídit bezpečnost. Jedním z hlavních útoků je prolomení hesla a proto musíme mít definovánu politiku, jak mají být hesla silná a co se děje při zadání špatných hesel. V Microsoft prostředí na to využijeme Group Policy, které nám dovolí definovat a vynutit parametry hesel. Hesla můžeme definovat pro lokální účty a v doménovém prostředí také pro doménové účty. Windows Server 2008 navíc přináší možnost definovat více rozdílných politik pro doménové účty.

Anglicky se tato oblast označuje jako Password and Account Lockout Policy. Politika hesel (Password Policy) nám dovoluje specifikovat parametry hesla, jako je minimální počet znaků, zda musí být heslo komplexní , zda se musí hesla v pravidelném intervalu měnit (minimální a maximální stáří hesla), jestli a kolik starších hesel se pamatuje (ty se pak nedají nastavit znovu).

Komplexní heslo v tomto případě znamená, že nesmí obsahovat část uživatelova jména a musí obsahovat znaky minimálně ze tří skupin (ze čtyř možných), což jsou:

  • velké písmeno (A-Z)
  • malé písmeno (a-z)
  • číslice (0-9)
  • speciální (ne-alfanumerický) znak (třeba *#,.@%)

V Group Policy se nastavení politiky hesel nachází v cestě Computer Configuration/Windows Settings/Security Settings/Account Policies/Password Policy. Nastavení v této politice se uplatňuje při změně hesla. To znamená, že když změníme nastavení politiky, tak se pro uživatele nic nemění, dokud si nebudou měnit heslo, pak musí dodržet tyto parametry.

Změna hesla může být vynucena intervalem (maximální stáří hesla) nebo nastavením na účtu User must change password at next logon. Pokud je na uživatelském účtu nastaveno Password never expires, tak se pro tento účet neuplatňuje stáří hesla (není povinnost měnit heslo, i když je nastavena politika). Není možno nastavit současně User must change password at next logon a Password never expires. Pokud tedy nastavíme politiku hesel, a chceme mít hesla podle ní, tak máme jedinou možnost. Nastavíme na účty atribut User must change password at next logon a vypneme (pro jistotu) Password never expires. To můžeme udělat jednoduše pomocí PowerShellu, například:

 Get-ADUser -Filter * -SearchBase "OU=Firma,DC=firma,DC=local" 
| Set-ADUser -PasswordNeverExpires $false
 Get-ADUser -Filter * -SearchBase "OU=Firma,DC=firma,DC=local" 
| Set-ADUser -ChangePasswordAtLogon $true 

passw01

Politika zamykání účtů (Account Lockout Policy) nám určuje jestli, a po kolika chybně zadaných heslech, se účet zamkne, jestli se po zadané době automaticky odemkne a po jaké době se resetuje počítadlo chybných hesel. V Group Policy se nastavení politiky hesel nachází v cestě Computer Configuration/Windows Settings/Security Settings/Account Policies/Account Lockout Policy.

passw02

Politika pro doménové účty před Windows Server 2008

Pokud máme doménu nižšího stupně než Windows Server 2008, tak můžeme mít pouze jednu politiku hesel pro jednu doménu. To znamená, že pro všechny účty v doméně platí stejná pravidla. Obecně je to dáno tím, že může existovat pouze jedna politika hesel pro každou databázi účtů. Active Directory je jedna databáze, každý počítač pak má jednu svoji lokální databázi pro lokální účty. Takže pro každý počítač může být jiná politika pro lokální účty a pak může být pouze jedna společná politika pro doménu a doménové účty v ní. Obejít se to dá pouze složitě, třeba vytvořením více domén.

Standardně se při instalaci prvního DC vytvoří dvě GPO:

  • Default Domain Policy GPO – připojena na kořen domény, hlavní nastavení pro doménu včetně politiky hesel
  • Default Domain Controller Policy GPO – připojena k OU Domain Controllers, úvodní bezpečnostní nastavení pro DC

Pozn.: Doporučené řešení je neměnit nastavení těchto dvou GPO, ale vytvořit nové GPO na stejném místě a dát jim vyšší prioritu. Protože se tak můžeme rychle vrátit k originálnímu nastavení v případě problémů (stačí vypnout novou GPO).

Doménová politika hesel je standardně součástí Default Domain Policy, ale to není naprosto nutné. Můžeme použít libovolnou politiku (vytvořit novou), kde definujeme pravidla politiky hesel pro doménové účty, ale tuto politiku musíme připojit na kořenový kontejner domény. A její hodnoty nesmí přepisovat jiná politika na tomto místě, jinak řečeno nastavit této politice nejvyšší prioritu.

Politika pro lokální účty

Politiku hesel pro lokální účty na počítači můžeme definovat buďto lokálně pomocí Local Group Polici Editor nebo centrálně doménovou politikou. Když vytvoříme politiku hesel a připojíme ji na kontejner s počítači, tak se toto nastavení neuplatní pro doménové účty, ale pro lokální účty na daných počítačích.

Další politiky pro doménové účty na Windows Server 2008

Pokud máme funkční stupeň domény Windows Server 2008, tak můžeme použít Fine-Grained Password Policy (FGPP) , které nám dovolí definovat více politik hesel pro různé skupiny doménových účtů. Základní politiku hesel (defaultní) ale vytváříme pořád stejně a linkujeme ji na kořen domény.

Pokud chceme vytvořit další politiku hesel a aplikovat ji na určité účty, tak musíme použít FGPP. AD schéma je rozšířeno dva objekty Password Settings Container a Password Setting, které se v tomto případě využijí. Nejde tedy použít standardní metody a nástroj Group Policy Management Console, ale musíme buď využít ADSI Edit (adsiedit.msc) nebo PowerShell a modul Active Directory.

Postup je pak takový, že nejprve vytvoříme Password Settings Object (PSO) uvnitř Password Settings Container, kterému nastavíme parametry politiky. Potom PSO aplikujeme na uživatele nebo bezpečnostní skupinu (global security group). Nemůžeme PSO aplikovat na počítač nebo organizační jednotku (OU).

Abychom si to shrnuli. Microsoft konečně doplnil možnost vytvořit více politik hesel v doméně. Bohužel to ale neudělal standardním způsobem, takže další politiky musíme vytvářet úplně jiným postupem. Navíc změnil i to, že standardní politiky aplikujeme na OU (či doménu nebo site), ale PSO se aplikuje na bezpečnostní skupinu nebo uživatele (neříkám, že je to špatné).

Vytvoření PSO pomocí ADSI Edit

Pouze stručná informace, jak můžeme využít ADSI Edit.

  • pomocí adsiedit.msc se připojíme k doméně (pod účtem s oprávněními k AD – Domain Admin) k Default naming context
  • rozbalíme CN=Password Settings Container,CN=System,DC=firma,DC=local
  • klikneme pravým tlačítkem a z kontextového menu zvolíme New – Object
  • vybereme msDS-PasswordSettings a Next
  • nyní projdeme jednoduchého průvodce, kde vyplníme 11 povinných atributů

MS popis, který obsahuje detaily o jednotlivých atributech je AD DS Fine-Grained Password and Account Lockout Policy Step-by-Step Guide.

Přiřazení PSO pomocí ADUC

Vytvořené PSO objekty vidíme i pomocí Active Directory Users and Computers (ADUC), pokud máme nastaveno View - Advanced Features. A právě v ADUC budeme přiřazovat politiky uživatelům nebo skupinám (můžeme to samozřejmě udělat i v ADSI Edit).

  • otevřeme PSO (dvojklik)
  • přepneme se na záložku Attribute Editor
  • najdeme hodnotu msDS-PSOAppliesTo a zvolíme Edit
  • zde přidáme požadované uživatele nebo skupiny

Pokud chceme zjistit jestli, a případně jaká, PSO se aplikuje na uživatele, tak si otevřeme uživatelský účet v ADUC, přepneme se na záložku Attribute Editor. Pokud nemáme zobrazené konstruované atributy, tak klikneme na Filter a zaškrtneme Constructed. Potom najdeme atribut msDS-ResultantPSO, který obsahuje název aplikované (vítězné) politiky (PSO). Také se můžeme podívat na atribut msDS-PSOApplied, kde je seznam všech aplikovaných PSO (tento atribut vidíme i u skupin).

Vytvoření a přiřazení PSO pomocí PowerShellu

Záleží na vkusu, ale jako lepší metoda se mi zdá využití PowerShellu. Potřebujeme k tomu modul ActiveDirectory, který je součástí Remote Server Administration Tools.

Pro vytvoření PSO využijeme cmdlet New-ADFineGrainedPasswordPolicy. Jednotlivé parametry jsou pochopitelné již názvu. Je tu však důležitý rozdíl oproti standardní politice a to, že hodnotu MaxPasswordAge nemůžeme nastavit na 0, aby platnost hesla nikdy nevypršela. Pokud v cmdletu nulu zadáme, tak dostaneme chybu, která mi nepřipadá moc informativní.

New-ADFineGrainedPasswordPolicy : The modification was not permitted for security reasons

Řešením je buď na účtech nastavit Password never expires nebo nastavit MaxPasswordAge na maximální hodnotu 10675199.00:00:00, která je opravdu vysoká. Následují dva příklady vytvoření PSO.

New-ADFineGrainedPasswordPolicy -Name "JmenoPSO" -DisplayName "Domain Users PSO" -Description "The Domain Users Password Policy" -Precedence 500 -LockoutDuration "0.12:00:00" -LockoutObservationWindow "0.00:15:00" -LockoutThreshold 10 -MaxPasswordAge "60.00:00:00" -MinPasswordAge "1.00:00:00" -ComplexityEnabled $true -MinPasswordLength 8 -PasswordHistoryCount 24 -ReversibleEncryptionEnabled $false

New-ADFineGrainedPasswordPolicy -Name "PSO2" -Precedence 10 -LockoutDuration "0.12:00:00" -LockoutObservationWindow "0.00:15:00" -LockoutThreshold 3 -MaxPasswordAge "10675199.00:00:00" -MinPasswordAge "0.00:00:00" -ComplexityEnabled $true -MinPasswordLength 12 -PasswordHistoryCount 0 -ReversibleEncryptionEnabled $false

Pomocí PowerShellu můžeme také přiřadit PSO k uživateli/skupině jednoduchým příkazem.

Add-ADFineGrainedPasswordPolicySubject JmenoPSO -Subjects 'Domain Users'

Změna hodnot v PSO.

Set-ADFineGrainedPasswordPolicy "JmenoPSO" -MinPasswordLength 8 -PasswordHistoryCount 24

Smazání PSO.

Remove-ADFineGrainedPasswordPolicy -Identity JmenoPSO

Zrušení přiřazení PSO k uživateli/skupině.

Remove-ADFineGrainedPasswordPolicySubject JmenoPSO -Subjects User1

Vypsání seznamu PSO.

Get-ADFineGrainedPasswordPolicy -Filter 'Name -like "*"' | FT Name,Precedence,MinPasswordLength -AutoSize

Zobrazení detailů k jedné PSO.

Get-ADFineGrainedPasswordPolicy JmenoPSO -Properties *

Jaká PSO se aplikuje na určitého uživatele.

Get-ADUserResultantPasswordPolicy User1

Zajímavý je i následující příkaz, který zobrazí defaultní politiku hesel pro aktuálního (přihlášeného) uživatele.

Get-ADDefaultDomainPasswordPolicy

- Petr Bouška