Xác minh chính sách mật khẩu trên người dùng hiện tại


11

Gần đây tôi đã đến một môi trường nơi nhiều thông tin đăng nhập cơ sở dữ liệu không enforce_password_policykích hoạt cờ.
Một cuộc kiểm toán sắp tới là bắt buộc phải xác minh mật khẩu của những lần đăng nhập này.

Tôi đã sử dụng truy vấn sau đây để có được danh sách đăng nhập và liệu các cờ được bật hay tắt.

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

Tuy nhiên, điều này không cho tôi biết nếu mật khẩu thực sự tuân thủ chính sách mật khẩu, vì cờ chỉ có liên quan khi tạo người dùng.

Có cách nào để kiểm tra người dùng hiện tại về việc tuân thủ chính sách mật khẩu không?
Tôi không có quyền truy cập vào các mật khẩu cũ và tôi thích một phương pháp không yêu cầu chúng.


1
Hội nghị gì? Ngày máy chủ SQL? BICC? Đã tìm kiếm nhanh, có vẻ như không có chức năng riêng nào sẽ nhanh chóng cung cấp cho bạn một kết quả. Có thể sử dụng một công cụ của bên thứ ba.
Phụ nữ Stijn

Ngày máy chủ SQL. Tôi cũng đã thực hiện một số tìm kiếm nhanh và ngoài một số công cụ thực hiện các cuộc tấn công từ điển bằng cách sử dụng PWDCOMPARE()tôi thực sự không tìm thấy nhiều, bất kể cảm ơn vì nỗ lực của bạn!
Hồi phục

Bạn có thể xác thực chính sách cho lần đăng nhập tiếp theo và buộc thiết lập lại cho tất cả người dùng không đăng nhập trước khi kiểm toán. Ít khó chịu hơn so với việc thiết lập lại tất cả các mật khẩu.
CodeInChaos

@CodesInChaos Làm thế nào để bạn xác thực chính sách trong một sự kiện đăng nhập?
Aaron Bertrand

1
Tôi đã viết blog về vấn đề này - và tôi khuyến khích tất cả các bạn bỏ phiếu và nhận xét về mục Kết nối .
Aaron Bertrand

Câu trả lời:


15

Điều này có thể không phổ biến đối với người dùng của bạn, nhưng tôi tin rằng cách duy nhất bạn có thể biết chắc chắn là buộc thay đổi mật khẩu cho mỗi lần đăng nhập SQL CHECK_POLICY = ON. Điều này sẽ tạo ra một tập hợp các ALTER LOGINlệnh với mật khẩu trống, bạn có thể cập nhật truy vấn cung cấp cho họ tất cả mật khẩu chung hoặc cập nhật thủ công từng mật khẩu riêng lẻ - chỉ cần đảm bảo rằng chúng đáp ứng chính sách của bạn. Tất nhiên, bạn cần chắc chắn rằng chính sách mật khẩu phức tạp như bạn mong đợi và nó đã được bật (Bảng điều khiển> Công cụ quản trị> Chính sách bảo mật cục bộ> Chính sách tài khoản> Chính sách mật khẩu> Mật khẩu phải đáp ứng các yêu cầu phức tạp).

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 đã viết về điều này một thời gian trở lại. Lưu ý rằng - do những gì tôi phát hiện ra bên dưới - bạn không thể tin vào is_policy_checked = 1mật khẩu thực sự đáp ứng chính sách hiện tại của bạn, vì thông tin đăng nhập có thể được tạo bằng mật khẩu băm (trong trường hợp mật khẩu văn bản đơn giản không thể đã kiểm tra) hoặc trong khi chính sách phức tạp cục bộ đã bị vô hiệu hóa (vẫn còn dẫn đến is_policy_checked = 1).

Một cách tiếp cận khác mà tôi nghĩ sẽ có hiệu quả là cố gắng tạo một bản sao của mỗi lần đăng nhập với hiện tại của họ password_hashvà với CHECK_POLICY = ON, và ghi chú lại mỗi lần thất bại. Tuy nhiên, điều này không thể hoạt động - ngay cả với CHECK_POLICY = ON, nó không thực hiện bất kỳ xác nhận nào về mật khẩu đã được băm. Tôi sẽ bao gồm mã cho hậu thế - nhưng, theo thiết kế, chính sách đơn giản là không thể được kiểm tra.

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;

Cá nhân, tôi nghĩ rằng đây là một lỗi. Nếu cú ​​pháp cho phép tôi tạo thông tin đăng nhập bằng mật khẩu băm và tôi có thể quy định rằng mật khẩu đó phải đáp ứng chính sách phức tạp của tôi, thì thực tế nó sẽ tạo ra lỗi hoặc cảnh báo rằng chính sách đó không được kiểm tra.

CẬP NHẬT : Tôi đã nộp một lỗi chống lại hành vi này.


Một điều phức tạp khác là tôi thực sự khá chắc chắn rằng quản trị viên trước đó chỉ kiểm tra chính sách này sau khi nhập mật khẩu dễ nhớ. select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;đã cho một số kết quả tích cực. Vì vậy, tôi sẽ phải làm điều này cho tất cả các thông tin đăng nhập, không chỉ những người is_policy_checkedđã tắt.
Hồi phục

@Reaces Có thể. Hoặc chính sách mật khẩu của bạn trong Windows có thể yếu hoặc bị vô hiệu hóa, vì vậy cố gắng thực thi với chính sách không có ích.
Aaron Bertrand

Tôi vừa thử tạo cùng một người dùng trên máy chủ thứ hai và không xác thực được mật khẩu. Vì vậy, tôi đoán kiểm tra phức tạp hoạt động. Tôi thích ý tưởng tái tạo bản sao của người dùng! Tôi sẽ thiết lập để tạo ra một kịch bản làm điều đó! EDIT: thực sự tôi chỉ có thể sử dụng sp_help_Vvlogin để thực hiện việc nâng vật nặng.
Hồi phục

"Nó không thực hiện bất kỳ xác nhận nào về mật khẩu đã được băm" Làm thế nào để làm điều đó? Nếu bạn chỉ biết hàm băm và không phải mật khẩu đơn giản, bạn không thể kiểm tra độ phức tạp của mật khẩu. Bạn có thể đoán mật khẩu, nhưng sẽ rất tốn kém cho một hàm băm mật khẩu đàng hoàng vì toàn bộ điểm băm mật khẩu đang ngăn sự phục hồi của mật khẩu văn bản gốc.
CodeInChaos

@CodesInChaos Tôi biết, đó là quan điểm của tôi ... Tôi đã nói "không" nhưng cũng có thể viết "không thể" ...
Aaron Bertrand

4

Không có cách nào mà bạn sẽ có được điều này chính xác 100%. Mặc dù bạn có thể sử dụng PWDCOMPAREđể kiểm tra danh sách mật khẩu yếu (bạn có thể thêm vào danh sách mật khẩu yếu và so sánh).

Tôi đã viết một kịch bản tương tự làm so sánh và cung cấp cho bạn kết quả. Tôi đã đăng nó trên github .

BIÊN TẬP:

Bây giờ bạn có thể có một danh sách các mật khẩu yếu trong csv và sau đó sử dụng dbatools Test-DbaLoginPasswordvới -Dictionaryswitch (Chỉ định danh sách mật khẩu để đưa vào kiểm tra mật khẩu yếu.)


Tôi rất muốn sử dụng tập lệnh của bạn nếu tôi phải tự kiểm tra mật khẩu của một người dùng cụ thể. Tuy nhiên, không biết kiểm toán viên sẽ làm gì, tôi chỉ đảm bảo rằng mọi thứ đều tuân thủ chính sách và dựa vào những người tạo ra chính sách. Cảm ơn mặc dù! +1
Hồi phục

0

Chính sách mật khẩu cho mỗi lần đăng nhập SQL chỉ là một cờ cho bật hoặc tắt. Nếu cờ Chính sách mật khẩu được chọn, thì Chính sách mật khẩu Windows từ hệ điều hành sẽ được thi hành.

Kiểm tra tài liệu CREATE LOGIN để biết chi tiết về những gì xảy ra khi CHECK_POLICY và CHECK_EXPIRATION được đặt.

Bạn có thể thấy các cài đặt cho mỗi người dùng SQL bằng cách kiểm tra các cột is_policy_checked và is_Exption_checked trong sys.sql_logins

một cái gì đó như dưới đây:

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 ;

Đối với thông tin đăng nhập xác thực máy chủ SQL:

select * from sys.server_principals where type in ('U','G') - sẽ hiển thị cho bạn thông tin đăng nhập và nhóm có thể truy cập Máy chủ SQL thông qua Xác thực Windows.


Đã cập nhật câu hỏi của tôi một chút, vì tôi đã sử dụng một truy vấn tương tự. Vấn đề chính của tôi là tôi cần đảm bảo với sếp rằng mật khẩu tuân thủ chính sách, tuy nhiên không biết mật khẩu tôi không biết làm thế nào tôi có thể.
Hồi phục
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.