Niedawno znalazłem się w środowisku, w którym wiele logowań do baz danych nie ma enforce_password_policy
włączonej flagi.
Nadchodzący audyt wymaga weryfikacji haseł tych loginów.
Użyłem następującego zapytania, aby uzyskać listę logowania i czy flagi są włączone, czy wyłączone.
select
@@SERVERNAME as servername,
name,
IS_SRVROLEMEMBER('sysadmin', name) as SYSADMIN,
type_desc,
create_date,
is_policy_checked,
is_disabled,
password_hash,
PWDCOMPARE(name, password_hash) as UsernameAsPassword
FROM sys.sql_logins
Nie mówi mi to jednak, czy hasła faktycznie są zgodne z zasadami haseł, ponieważ flaga jest istotna tylko podczas tworzenia użytkownika.
Czy istnieje znany sposób przetestowania istniejących użytkowników pod kątem zgodności z zasadami haseł?
Nie mam dostępu do starych haseł i wolałbym metodę, która ich nie wymaga.
PWDCOMPARE()
, nie znalazłem wiele, niezależnie od podziękowania za wysiłek!Odpowiedzi:
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 zestawuALTER 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).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 dois_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 przyCHECK_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ć.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.
źródło
select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;
dał kilka pozytywnych wyników. Będę musiał to zrobić dla wszystkich loginów, nie tylko dla tych, którzy sąis_policy_checked
wyłączeni.Nie ma możliwości, aby uzyskać to w 100% dokładne. Chociaż możesz użyć,
PWDCOMPARE
aby sprawdzić listę słabych haseł (możesz dodać do listy słabych haseł i dokonać porównania).Napisałem podobny skrypt, który dokonuje porównania i daje wyniki. Zamieściłem go na github .
EDYTOWAĆ:
Teraz możesz mieć listę słabych haseł w pliku csv, a następnie użyć dbatools
Test-DbaLoginPassword
z-Dictionary
przełącznikiem (określa listę haseł, które należy uwzględnić w teście słabych haseł).źródło
Zasady haseł dla SQL Login są tylko flagą włączania i wyłączania. Jeśli flaga Zasady haseł jest zaznaczona, zasady haseł systemu Windows w systemie operacyjnym są egzekwowane.
Sprawdź dokumentację UTWÓRZ LOGOWANIE, aby uzyskać szczegółowe informacje o tym, co dzieje się, gdy są ustawione CHECK_POLICY i CHECK_EXPIRATION.
Możesz zobaczyć ustawienia dla użytkownika SQL, sprawdzając kolumny is_policy_checked i is_expiration_checked w sys.sql_logins
coś jak poniżej:
W przypadku logowania do uwierzytelniania programu SQL Server:
select * from sys.server_principals where type in ('U','G')
- pokaże loginy i grupy, które mogą uzyskać dostęp do SQL Server poprzez uwierzytelnianie systemu Windows.źródło