Проверка политики паролей для существующих пользователей

11

Недавно я попал в среду, где во многих логинах баз данных enforce_password_policyфлаг не включен.
Предстоящий аудит требует проверки паролей этих логинов.

Я использовал следующий запрос, чтобы получить список логинов и узнать, включены ли флаги или нет.

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

Тем не менее, это не говорит мне, действительно ли пароли соответствуют политике паролей, так как флаг имеет значение только при создании пользователя.

Известен ли способ проверки существующих пользователей на соответствие политике паролей?
У меня нет доступа к старым паролям, и я предпочел бы метод, который не требует их.

Reaces
источник
1
Какая конференция? SQL Server дней? BICC? Сделал быстрый поиск, похоже, что нет встроенной функции, которая бы быстро дала вам результат. Может быть возможно использовать сторонний инструмент.
Стейн Виннантс
Дни SQL Server. Я также провел несколько быстрых поисков, и, кроме некоторых инструментов, которые просто выполняют атаки по словарю, PWDCOMPARE()я не нашел много, независимо от того, спасибо за усилия!
Reaces
Вы можете проверить политику при следующем входе в систему и принудительно выполнить сброс для всех пользователей, которые не вошли в систему до аудита. Меньше раздражения пользователя по сравнению со сбросом всех паролей.
CodesInChaos
@CodesInChaos Как вы проверяете политику во время входа в систему?
Аарон Бертран
1
Я писал об этой проблеме в блоге - и я призываю всех вас проголосовать и прокомментировать элемент Connect .
Аарон Бертран

Ответы:

15

Это может быть не очень популярно среди ваших пользователей, но я верю, что единственный способ узнать наверняка - принудительно менять пароль для каждого входа в SQL с помощью CHECK_POLICY = ON. Это сгенерирует набор ALTER LOGINкоманд с пустыми паролями, вы можете обновить запрос, задав им всем общий пароль, или вручную обновить каждую из них индивидуальными паролями - просто убедитесь, что они соответствуют вашей политике. Конечно, вы должны быть уверены, что политика паролей настолько сложна, насколько вы ожидаете, и что она включена (Панель управления> Администрирование> Локальная политика безопасности> Политики учетных записей> Политика паролей> Пароль должен соответствовать требованиям сложности).

SELECT N'ALTER LOGIN ' + QUOTENAME(name) 
  + N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;' 
  FROM sys.sql_logins 
  --WHERE is_policy_checked = 0;

Стив Джонс писал об этом некоторое время назад. Обратите внимание, что из-за того, что я раскрыл ниже, нельзя полагаться на is_policy_checked = 1то, что пароль действительно соответствует вашей текущей политике, поскольку логин мог быть создан с использованием хешированного пароля (в этом случае пароль в виде простого текста не может быть проверено) или в то время как локальная политика сложности была отключена (что все еще ведет к is_policy_checked = 1).

Другой подход, который, как я думал, сработает, состоит в том, чтобы попытаться создать копию каждого логина с указанием его текущего password_hashи с CHECK_POLICY = ON, и записать все, что не удалось. Однако это может не сработать - даже если CHECK_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;

Лично я считаю, что это ошибка. Если синтаксис позволяет мне создать логин, используя хешированный пароль, и я могу оговорить, что этот пароль должен соответствовать моей политике сложности, то это должно привести к ошибке или предупреждению о том, что политика фактически не проверялась.

ОБНОВЛЕНИЕ : я подал ошибку против этого поведения.

Аарон Бертран
источник
Другая сложность заключается в том, что я действительно уверен, что предыдущий админ только что включил эту политику после ввода легко запоминающихся паролей. select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;дал несколько положительных результатов. Так что мне придется делать это для всех входов в систему, а не только для тех, у кого is_policy_checkedотключено.
Reaces
@Reaces Возможно. Или ваша политика паролей в Windows может быть слабой или отключенной, поэтому попытка применения политики не поможет.
Аарон Бертран
Я просто попытался создать того же пользователя на втором сервере, но проверка пароля не удалась. Так что я думаю, что проверка сложности работает. Мне нравится идея воссоздания копий пользователей, хотя! Я начну работать над созданием сценария, который делает именно это! РЕДАКТИРОВАТЬ: на самом деле я мог бы просто использовать sp_help_revlogin, чтобы сделать тяжелую работу.
Reaces
«он не выполняет проверку уже хешированного пароля». Как он это сделал? Если вы знаете только хеш, а не простой пароль, вы не можете проверить сложность пароля. Вы могли бы угадать пароль, но это было бы очень дорого для приличного хэша пароля, так как весь смысл хэша пароля препятствует восстановлению открытого текста пароля.
CodesInChaos
@CodesInChaos Я знаю, это моя точка зрения ... Я сказал «нет», но мог бы также написать «не могу» ...
Аарон Бертран
4

Там нет никакого способа, которым вы собираетесь получить это 100% точности. Хотя вы можете использовать PWDCOMPAREдля проверки списка слабых паролей (вы можете добавить в список слабых паролей и сделать сравнение).

Я написал аналогичный скрипт, который делает сравнение и дает вам результаты. Я разместил это на github .

РЕДАКТИРОВАТЬ:

Теперь вы можете иметь список слабых паролей в csv, а затем использовать dbatools Test-DbaLoginPasswordс -Dictionaryswitch (Указывает список паролей, которые нужно включить в тест на слабые пароли.)

Кин Шах
источник
Я бы очень хотел использовать ваш сценарий, если мне когда-нибудь придется самому проверять пароль конкретного пользователя. Однако, не зная, что собирается делать аудитор, я бы предпочел просто убедиться, что все соответствует политике, и полагаться на тех, кто создает политики. Спасибо хоть! +1
Reaces
0

Политика паролей для каждого входа в SQL - это только флаг включения или выключения. Если установлен флажок «Политика паролей», то применяется политика паролей Windows из операционной системы.

Проверьте документацию CREATE LOGIN для получения подробной информации о том, что происходит, когда установлены CHECK_POLICY и CHECK_EXPIRATION.

Вы можете увидеть настройки для каждого пользователя SQL, проверив столбцы is_policy_checked и is_expiration_checked в sys.sql_logins

что-то вроде ниже:

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:

select * from sys.server_principals where type in ('U','G') - покажет вам логины и группы, которые могут получить доступ к SQL Server через аутентификацию Windows.

KASQLDBA
источник
Немного обновил мой вопрос, так как я уже использовал похожий запрос. Моя главная проблема заключается в том, что я должен заверить своего начальника, что пароли соответствуют политике, но, не зная паролей, я не знаю, как мог.
Reaces