Weryfikacja polityki haseł dla istniejących użytkowników

11

Niedawno znalazłem się w środowisku, w którym wiele logowań do baz danych nie ma enforce_password_policywłą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.

Reaces
źródło
1
Jaka konferencja? Dni serwera SQL? BICC? Po szybkim wyszukiwaniu wydaje się, że nie ma natywnej funkcji, która szybko dałaby wynik. Może być możliwe użycie narzędzia innej firmy.
Stijn Wynants
Dni serwera SQL. Przeprowadziłem też kilka szybkich wyszukiwań, a oprócz narzędzi, które po prostu wykonują ataki słownikowe PWDCOMPARE(), nie znalazłem wiele, niezależnie od podziękowania za wysiłek!
Reaces,
Możesz zweryfikować zasadę przy następnym logowaniu i wymusić reset dla wszystkich użytkowników, którzy nie zalogują się przed audytem. Mniej irytacji użytkownika w porównaniu z resetowaniem wszystkich haseł.
CodesInChaos
@CodesInChaos W jaki sposób weryfikujesz zasady podczas zdarzenia logowania?
Aaron Bertrand
1
Napisałem na blogu o tym problemie - i zachęcam wszystkich do głosowania i komentowania elementu Connect .
Aaron Bertrand

Odpowiedzi:

15

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 LOGINpoleceń 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 = 1tym, ż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_hashi za pomocą CHECK_POLICY = ONoraz zanotowanie każdego, który się nie powiedzie. To jednak nie działa - nawet przy CHECK_POLICY = ONnie 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.

Aaron Bertrand
źródło
Inną komplikacją jest to, że jestem całkiem pewien, że poprzedni administrator właśnie sprawdził tę zasadę po wprowadzeniu łatwych do zapamiętania haseł. 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_checkedwyłączeni.
Reaces,
@Reaces Ewentualnie. Lub zasady haseł w systemie Windows mogą być słabe lub wyłączone, więc próba egzekwowania zasad nie pomaga.
Aaron Bertrand
Właśnie próbowałem utworzyć tego samego użytkownika na drugim serwerze i nie udało mi się zweryfikować hasła. Myślę, że sprawdzenie złożoności działa. Podoba mi się jednak pomysł odtwarzania kopii użytkowników! Zacznę pracować nad stworzeniem skryptu, który właśnie to robi! EDYCJA: właściwie mógłbym po prostu użyć sp_help_revlogin do ciężkiego podnoszenia.
Reaces,
„nie wykonuje żadnej weryfikacji poprawnego hasła”. Jak by to zrobił? Jeśli znasz tylko skrót, a nie zwykłe hasło, nie możesz sprawdzić złożoności hasła. Możesz odgadnąć hasło, ale byłoby to bardzo kosztowne dla porządnego skrótu hasła, ponieważ cały punkt skrótu hasła uniemożliwia odzyskanie hasła w postaci zwykłego tekstu.
CodesInChaos
@CodesInChaos Wiem, o to mi chodzi ... Powiedziałem: „nie”, ale mogłem też napisać „nie można” ...
Aaron Bertrand
4

Nie ma możliwości, aby uzyskać to w 100% dokładne. Chociaż możesz użyć, PWDCOMPAREaby 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-DbaLoginPasswordz -Dictionaryprzełącznikiem (określa listę haseł, które należy uwzględnić w teście słabych haseł).

Kin Shah
źródło
Bardzo chciałbym użyć twojego skryptu, jeśli kiedykolwiek będę musiał przeprowadzić audyt hasła konkretnego użytkownika. Jednak nie wiedząc, co zamierza zrobić audytor, wolę po prostu upewnić się, że wszystko jest zgodne z zasadami i polegać na tych, którzy je tworzą. W każdym razie dzięki! +1
Reaces 15.04.15
0

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:

SELECT name,
create_date,
modify_date,
LOGINPROPERTY(name, 'DaysUntilExpiration') DaysUntilExpiration,
LOGINPROPERTY(name, 'PasswordLastSetTime') PasswordLastSetTime,
LOGINPROPERTY(name, 'IsExpired') IsExpired,
LOGINPROPERTY(name, 'IsMustChange') IsMustChange
From sys.sql_logins ;

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.

KASQLDBA
źródło
Trochę zaktualizowałem moje pytanie, ponieważ używałem już podobnego zapytania. Moim głównym problemem jest to, że muszę zapewnić szefa, że ​​hasła są zgodne z zasadami, jednak nie znając haseł, nie wiem, jak mogłem.
Reaces,