Đ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 LOGIN
lệ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 = 1
mậ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_hash
và 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.