Existuje velmi zajímavé chování Active Directory v případě, že si uživatel změní heslo (change password), nebo mu ho změní správce (reset password). Stejně zajímavá je druhá situace ohledně zamykání účtu (account lockout), auditu (account logon auditing) a jeho atributů badPasswordCount a badPasswordTime. Tedy v případě, že člověk použije "omylem" starší heslo, které už někdy měl, a přitom už teď má jiné.
Po změně hesla se ještě hodinu dá použít jeho starší hodnota
Podle http://support.microsoft.com/kb/906305 se od service pack 1 na Windows 2003 změnilo chování při ověřování NTLM a například i LDAP simple bind a to takto.
Jestliže se uživateli změní heslo, při NTLM, nebo LDAP simple bind ověření, se ještě hodinu může k přihlášení použít jeho původní hodnota. Řadiče domény (DC) mohou přece ukládat historii hesel, takže si předchozí hodnotu pamatují. Funguje to jen pro poslední heslo a jen pokud je historie hesel opravdu zapnuta v politice.
Proč se to takto nechová pro Kerberos? Nejspíš proto, že Kerberos je chápán jako bezpečnější a tak mu asi nechtěli dávat takovéto úlevy. Na druhé straně, Kerberos tikety platí obvykle 10 hodin, což může procentuálně vylepšit celý problém i bez téhle NTLM specialitky.
Funguje to jen pro síťová ověření. Lokálně (interactive), ani jako služba apod. to nefunguje. Tedy předpokládám právě proto, že tahle ověřování jsou Kerberos.
Na konec bych doplnil, že je samozřejmě možné tento časový limit jedné hodiny zkrátit pomocí registrové hodnoty OldPasswordAllowedPeriod.
Atribut badPasswordCount a badPasswordTime se neaktualizuje a účet se nezamyká, pokud se použije starší heslo
Podle článku http://technet.microsoft.com/en-us/library/cc780271(v=ws.10).aspx existuje od Windows 2003 speciální vlastnost nazvaná Password history check (N-2). Pokud použijete předchozí, nebo před-předchozí heslo k ověření, sice se nepřihlásíte, ale účet se vám nezamkne.
Opět se jedná o ochranu proti zbytečnému zamykání účtu kvůli kdovíjakým replikačním prodlevám po změně hesla. Samozřejmě že máte PDC, ale co když není občas dostupné, nebo ho třeba nechcete používat přes WAN linky (AvoidPdcOnWan).
Takže, pokud zkusíte použít starší heslo, které je na DC uloženo v historii hesel, prostě to nezamyká účet. Ano, do Event Viewer, do Security logu to zapíše korektně Failure Audit, že neplatí heslo (pre-authentication failed v případě Kerberos) a klienta to samozřejmě odmítne. Tedy pokud se nejedná náhodou o případ předchozí kapitoly.
Ale na badPasswordCount a badPasswordTime to nesahá. Takže tyto hodnoty to nemění (ani neresetuje) a tím pádem se ten účet kvůli těmto neúspěchům ani nezamkne. Tohle funguje bez ohledu na čas, takže navždycky, dokud je to heslo v historii, v loubce historie do dvou předchozích hesel.
Vadí to bezpečnostně? Moc ne. Z pohledu síťového klienta je to informace, že se nelze ověřit. Takže útočník to nepozná rozdíl mezi špatným heslem, nebo starým heslem.