To może nie być popularne wśród twoich użytkowników, ale uważam, że jedynym sposobem, aby wiedzieć na pewno, jest wymuszenie zmiany hasła przy każdym logowaniu SQL CHECK_POLICY = ON
. Spowoduje to wygenerowanie zestawu ALTER LOGIN
poleceń z pustymi hasłami, możesz zaktualizować zapytanie, nadając im wspólne hasło lub ręcznie zaktualizować każde z osobnym hasłem - po prostu upewnij się, że spełniają twoje zasady. Oczywiście musisz upewnić się, że zasady haseł są tak złożone, jak się spodziewasz i że są włączone (Panel sterowania> Narzędzia administracyjne> Zasady zabezpieczeń lokalnych> Zasady kont> Zasady haseł> Hasło musi spełniać wymagania dotyczące złożoności).
SELECT N'ALTER LOGIN ' + QUOTENAME(name)
+ N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;'
FROM sys.sql_logins
--WHERE is_policy_checked = 0;
Steve Jones pisał o tym jakiś czas temu. Zauważ, że - z powodu tego, co odkryłem poniżej - nie możesz polegać na is_policy_checked = 1
tym, że hasło faktycznie spełnia twoje obecne zasady, ponieważ login mógł zostać utworzony za pomocą hasła zakodowanego (w takim przypadku hasło zwykłego tekstu nie może być zaznaczone) lub gdy lokalna polityka złożoności była wyłączona (co nadal prowadzi do is_policy_checked = 1
).
Innym podejściem, które moim zdaniem zadziałałoby, byłoby utworzenie kopii każdego loginu z ich obecnym password_hash
i za pomocą CHECK_POLICY = ON
oraz zanotowanie każdego, który się nie powiedzie. To jednak nie działa - nawet przy CHECK_POLICY = ON
nie sprawdza poprawności już zakodowanego hasła. Dołączę kod dla potomności - ale z założenia zasady po prostu nie można sprawdzić.
SELECT N'BEGIN TRY
CREATE LOGIN ' + QUOTENAME(N'copy_of_' + name)
+ N' WITH PASSWORD = '
+ CONVERT(NVARCHAR(255), password_hash, 1)
+ ' HASHED, CHECK_POLICY = ON;
DROP LOGIN ' + QUOTENAME(N'copy_of_' + name) + ';
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 15118
PRINT N''' + REPLACE(name, '''', '''''')
+ N' was not complex enough.'';
END CATCH'
FROM sys.sql_logins;
Osobiście uważam, że to błąd. Jeśli składnia pozwala mi utworzyć login przy użyciu zaszyfrowanego hasła i mogę stwierdzić, że hasło to musi spełniać moją zasadę złożoności, powinien wygenerować błąd lub ostrzeżenie, że zasada nie została w rzeczywistości sprawdzona.
AKTUALIZACJA : Złożyłem błąd dotyczący tego zachowania.