Verifica della politica della password per gli utenti esistenti


11

Di recente sono entrato in un ambiente in cui molti accessi ai database non hanno il enforce_password_policyflag abilitato.
Un controllo imminente richiede la verifica delle password di questi accessi.

Ho usato la seguente query per ottenere un elenco di accessi e se i flag sono attivi o meno.

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

Tuttavia, questo non mi dice se le password aderiscono effettivamente alla politica delle password, poiché il flag è rilevante solo quando si crea un utente.

Esiste un modo noto per testare la conformità dei criteri password agli utenti esistenti ?
Non ho accesso alle vecchie password e preferirei un metodo che non le richieda.


1
Quale conferenza? Giorni di SQL Server? BICC? Hai fatto una ricerca veloce, sembra che non ci sia una funzione nativa che ti darà rapidamente un risultato. Potrebbe essere possibile utilizzare uno strumento di terze parti.
Stijn Wynants,

Giorni di SQL Server. Ho fatto anche alcune ricerche rapide, e oltre ad alcuni strumenti che fanno solo attacchi con dizionari usando PWDCOMPARE()non ho trovato molto, indipendentemente grazie per lo sforzo!
Reagisce il

È possibile convalidare la politica al successivo accesso e forzare un ripristino per tutti gli utenti che non effettuano l'accesso prima dell'audit. Meno fastidi per l'utente rispetto al ripristino di tutte le password.
Codici A Caos il

@CodesInChaos Come si convalida la politica durante un evento di accesso?
Aaron Bertrand

1
Ho scritto un blog su questo problema e incoraggio tutti voi a votare e commentare l'elemento Connect .
Aaron Bertrand

Risposte:


15

Questo potrebbe non essere popolare tra i tuoi utenti, ma credo che l'unico modo che puoi sapere con certezza sia forzare una modifica della password per ogni accesso SQL con CHECK_POLICY = ON. Questo genererà una serie di ALTER LOGINcomandi con password vuote, puoi aggiornare la query dando loro una password comune o aggiornare manualmente ognuno con password individuali - assicurati solo che rispettino la tua politica. Ovviamente devi essere sicuro che la politica della password sia complessa come ti aspetti e che sia abilitata (Pannello di controllo> Strumenti di amministrazione> Politica di sicurezza locale> Politiche dell'account> Politica della password> La password deve soddisfare i requisiti di complessità).

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 ne ha scritto qualche tempo fa. Tieni presente che, a causa di ciò che ho scoperto di seguito, non puoi fare affidamento sul fatto is_policy_checked = 1che la password soddisfi effettivamente la tua politica attuale, poiché l'accesso potrebbe essere stato creato con una password con hash (nel qual caso la password in testo normale non può essere selezionato) o mentre la politica di complessità locale era disabilitata (il che porta ancora a is_policy_checked = 1).

Un altro approccio che pensavo avrebbe funzionato sarebbe stato quello di provare a creare una copia di ogni login con il loro attuale password_hashe con CHECK_POLICY = ON, e prendere nota di tutti quelli che falliscono. Tuttavia, questo non può funzionare - anche con CHECK_POLICY = ON, non esegue alcuna convalida di una password già con hash. Includerò il codice per i posteri - ma, in base alla progettazione, la politica semplicemente non può essere verificata.

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;

Personalmente, penso che questo sia un bug. Se la sintassi mi consente di creare un account di accesso utilizzando una password con hash e posso stabilire che tale password deve soddisfare la mia politica di complessità, dovrebbe generare un errore o un avviso che la politica non è stata effettivamente verificata.

AGGIORNAMENTO : ho presentato un bug per questo comportamento.


Un'altra complicazione è che in realtà sono abbastanza sicuro che l'amministratore precedente abbia appena controllato questa politica dopo aver inserito password facili da ricordare. select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;ha dato diversi risultati positivi. Quindi dovrò farlo per tutti gli accessi, non solo per quelli is_policy_checkeddisattivati.
Reagisce il

@Reaces Forse. Oppure la politica della password in Windows potrebbe essere debole o disabilitata, quindi provare a far rispettare la politica non aiuta.
Aaron Bertrand

Ho appena provato a creare lo stesso utente su un secondo server e la convalida della password non è riuscita. Quindi immagino che il controllo di complessità funzioni. Mi piace l'idea di ricreare copie degli utenti! Mi metterò al lavoro creando uno script che fa proprio questo! EDIT: in realtà potrei semplicemente usare sp_help_revlogin per fare il sollevamento pesante.
Reagisce il

"non esegue alcuna convalida di una password già con hash" Come lo farebbe? Se conosci solo l'hash e non la semplice password, non puoi verificare la complessità della password. Potresti indovinare la password, ma sarebbe molto costoso per un hash di password decente poiché l'intero punto di un hash di password impedisce il recupero della password in chiaro.
Codici A Caos il

@CodesInChaos Lo so, questo è il mio punto ... Ho detto "non" ma avrei potuto anche scrivere "impossibile" ...
Aaron Bertrand

4

Non è possibile ottenere questo preciso al 100%. Sebbene sia possibile utilizzare PWDCOMPAREper verificare un elenco di password deboli (è possibile aggiungere all'elenco di password deboli e fare un confronto).

Ho scritto uno script simile che fa il confronto e ti dà i risultati. L'ho pubblicato su github .

MODIFICARE:

Ora puoi avere un elenco di password deboli in un csv e quindi usare dbatools Test-DbaLoginPasswordcon -Dictionaryswitch (Specifica un elenco di password da includere nel test per password deboli).


Mi piacerebbe molto usare il tuo script se dovessi mai fare un controllo da solo della password di un determinato utente. Tuttavia, non sapendo che cosa farà il revisore, preferirei solo assicurarmi che tutto sia conforme alle politiche e fare affidamento su coloro che le creano. Grazie comunque! +1
Reagisce il

0

Il criterio password per l'accesso SQL è solo un indicatore di attivazione o disattivazione. Se il flag Criteri password è selezionato, vengono applicati i criteri password di Windows dal sistema operativo.

Controllare la documentazione CREATE LOGIN per i dettagli su cosa succede quando sono impostati CHECK_POLICY e CHECK_EXPIRATION.

È possibile visualizzare le impostazioni per utente SQL controllando le colonne is_policy_checked e is_expiration_checked in sys.sql_logins

qualcosa come sotto:

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 ;

Per gli accessi di autenticazione di SQL Server:

select * from sys.server_principals where type in ('U','G') - ti mostrerà i login e i gruppi che possono accedere a un SQL Server tramite l'autenticazione di Windows.


Ho aggiornato un po 'la mia domanda, poiché già utilizzavo una query simile. Il mio problema principale è che devo assicurare al mio capo che le password sono conformi alle politiche, tuttavia non conoscendo le password che non so come potrei.
Reagisce il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.