Mevcut kullanıcılar için şifre politikasını doğrulama


11

Son zamanlarda, birçok veritabanı oturum açma işleminin enforce_password_policybayrağının etkin olmadığı bir ortama girdim .
Yaklaşan bir denetim, bu oturum açma parolalarının doğrulanmasını gerektiriyor.

Oturum açma listesi ve bayrakların açık veya kapalı olup olmadığını öğrenmek için aşağıdaki sorguyu kullandım.

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

Ancak, bu, parolaların gerçekten parola ilkesine uyup uymadığını söylemez, çünkü bayrak yalnızca bir kullanıcı oluştururken geçerlidir.

Mevcut kullanıcıları şifre politikası uyumluluğu açısından test etmenin bilinen bir yolu var mı ?
Eski parolalara erişimim yok ve bunları gerektirmeyen bir yöntemi tercih ederim.


1
Ne Konferansı? SQL Server günleri? BICC? Hızlı bir arama yaptı, size hızlı bir şekilde sonuç verecek yerel bir işlev yok gibi görünüyor. Üçüncü taraf bir araç kullanmak mümkün olabilir.
Stijn Wynants

SQL Server günleri. Ben de bazı hızlı aramalar yaptım, ve sadece sözlük saldırıları kullanan bazı araçlar dışında PWDCOMPARE()ben gerçekten çok bulamadım, çaba için teşekkür ederiz!
1515

Bir sonraki girişteki politikayı doğrulayabilir ve denetimden önce giriş yapmayan tüm kullanıcılar için sıfırlamayı zorlayabilirsiniz. Tüm şifreleri sıfırlamaya kıyasla daha az kullanıcı sıkıntısı.
CodesInChaos

@CodesInChaos Bir giriş etkinliği sırasında politikayı nasıl doğrularsınız?
Aaron Bertrand

1
Bu sorun hakkında blog yazdım - ve hepinizi Connect öğesine oy vermek ve yorum yapmak için teşvik ediyorum .
Aaron Bertrand

Yanıtlar:


15

Bu kullanıcılarınız arasında popüler olmayabilir, ancak emin olabilirsiniz tek yolu her SQL giriş için bir şifre değişikliği zorlamak olduğuna inanıyorum CHECK_POLICY = ON. Bu, ALTER LOGINboş parolalarla bir dizi komut oluşturacak, tüm ortak bir parola vererek sorguyu güncelleyebilir veya her birini tek tek parolalarla manuel olarak güncelleyebilirsiniz - yalnızca politikanıza uyduğundan emin olun. Elbette, şifre politikasının beklediğiniz kadar karmaşık olduğundan ve etkinleştirildiğinden emin olmanız gerekir (Denetim Masası> Yönetim Araçları> Yerel Güvenlik Politikası> Hesap Politikaları> Şifre Politikası> Şifre karmaşıklık gereksinimlerini karşılamalıdır).

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 bunu bir süre önce yazdı . - Aşağıda ortaya çıkardığım şey nedeniyle - is_policy_checked = 1girişin karma bir şifre ile oluşturulmuş olabileceğinden (bu durumda düz metin şifresi olamaz) şifrenin aslında mevcut politikanızı karşıladığına güvenemeyeceğinizi unutmayın. işaretlenir) veya yerel karmaşıklık politikası devre dışı bırakılırken (yine de buna yol açar is_policy_checked = 1).

İşe yarayacağını düşündüğüm başka bir yaklaşım , her girişin mevcut ve birlikte bir kopyasını oluşturmak ve başarısız olan her birini not etmek olacaktır. Ancak, bu çalışmaz - zaten karma bir parolanın doğrulamasını yapmaz. Gelecek kuşak için kod ekleyeceğim - ancak tasarım gereği politika kontrol edilemez.password_hashCHECK_POLICY = ONCHECK_POLICY = ON

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;

Şahsen, bunun bir hata olduğunu düşünüyorum. Sözdizimi karma bir parola kullanarak bir giriş oluşturmama izin veriyorsa ve bu parolanın karmaşıklık ilkemi karşılaması gerektiğini şart koşarsam, ilkenin aslında kontrol edilmediğine dair bir hata veya uyarı oluşturması gerekir.

GÜNCELLEME : Bu davranışa karşı bir hata bildirdim.


Başka bir komplikasyon, aslında önceki yöneticinin hatırlaması kolay şifreleri koyduktan sonra bu politikayı kontrol ettiğinden eminim. select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;birkaç olumlu sonuç verdi. Bu yüzden bunu sadece kapalı olanlar için değil, tüm girişler için yapmak zorundayım is_policy_checked.
Reaces

@ Muhtemelen. Veya Windows'taki parola politikanız zayıf veya devre dışı olabilir, bu nedenle bu politikayı uygulamaya çalışmanız yardımcı olmaz.
Aaron Bertrand

Aynı kullanıcıyı ikinci bir sunucuda oluşturmayı denedim ve şifre doğrulaması başarısız oldu. Sanırım karmaşıklık kontrolü çalışıyor. Yine de kullanıcıların kopyalarını yeniden oluşturma fikrini seviyorum! Sadece bunu yapan bir script oluşturmak için çalışacağım! EDIT: aslında sadece ağır kaldırma yapmak için sp_help_revlogin kullanabilirsiniz .
Reaces

"zaten karma bir parolanın doğrulamasını yapmaz" Bunu nasıl yapardı? Düz parolayı değil, yalnızca karmayı biliyorsanız, parolanın karmaşıklığını kontrol edemezsiniz. Parolayı tahmin edebilirsiniz, ancak bir parola karmasının bütün noktası düz metin parolanın kurtarılmasını önlediğinden, bu iyi bir parola karması için çok pahalı olacaktır.
CodesInChaos

@CodesInChaos Biliyorum, bu benim açımdan ... "Yapmaz" dedim ama "muhtemelen olamazdı" da yazmış olabilirim ...
Aaron Bertrand

4

Bu% 100 doğru elde etmek için hiçbir yolu yoktur. Yine PWDCOMPAREde zayıf parolalar listesini kontrol etmek için kullanabilirsiniz (zayıf parolalar listesine ekleyebilir ve bir karşılaştırma yapabilirsiniz).

Karşılaştırmayı yapan ve sonuçları veren benzer bir komut dosyası yazdım. Bunu github'a gönderdim .

DÜZENLE:

Artık bir csv zayıf şifreler bir listesini olabilir ve daha sonra dbatools kullanmak Test-DbaLoginPasswordile -Dictionaryanahtarın (zayıf şifreler için testine dahil etmek belirten şifreleri içeren bir liste.)


Belirli bir kullanıcının şifresini kendim denetlemem gerekirse, betiğinizi kullanmak isterim. Ancak denetçinin ne yapacağını bilmeden, her şeyin politikaya uygun olmasını ve politikaları oluşturanlara güvenmesini tercih ederim. Yine de teşekkürler! +1
Reaces

0

SQL Login başına Parola İlkesi yalnızca açık veya kapalı için bir işarettir. Parola İlkesi bayrağı işaretlenirse, işletim sisteminden Windows Parola İlkesi uygulanır.

CHECK_POLICY ve CHECK_EXPIRATION ayarlandığında ne olacağına dair ayrıntılar için CREATE LOGIN belgelerine bakın.

Sys.sql_logins içinde is_policy_checked ve is_expiration_checked sütunlarını kontrol ederek SQL kullanıcısı başına ayarları görebilirsiniz.

aşağıdaki gibi bir şey:

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 ;

SQL Server Kimlik Doğrulama Girişleri için:

select * from sys.server_principals where type in ('U','G') - Windows Kimlik Doğrulaması ile SQL Server'a erişebilen giriş ve grupları gösterir.


Zaten benzer bir sorgu kullanıyordum sorumu biraz güncelledim. Benim asıl meselem, patronuma şifrelerin politika uyumlu olduğunu, ancak şifreleri bilmediğimi, nasıl yapabileceğimi bilmediğimden emin olmam gerekiyor.
Reaces
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.