Недавно я попал в среду, где во многих логинах баз данных 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
Тем не менее, это не говорит мне, действительно ли пароли соответствуют политике паролей, так как флаг имеет значение только при создании пользователя.
Известен ли способ проверки существующих пользователей на соответствие политике паролей?
У меня нет доступа к старым паролям, и я предпочел бы метод, который не требует их.
PWDCOMPARE()
я не нашел много, независимо от того, спасибо за усилия!Ответы:
Это может быть не очень популярно среди ваших пользователей, но я верю, что единственный способ узнать наверняка - принудительно менять пароль для каждого входа в SQL с помощью
CHECK_POLICY = ON
. Это сгенерирует наборALTER LOGIN
команд с пустыми паролями, вы можете обновить запрос, задав им всем общий пароль, или вручную обновить каждую из них индивидуальными паролями - просто убедитесь, что они соответствуют вашей политике. Конечно, вы должны быть уверены, что политика паролей настолько сложна, насколько вы ожидаете, и что она включена (Панель управления> Администрирование> Локальная политика безопасности> Политики учетных записей> Политика паролей> Пароль должен соответствовать требованиям сложности).Стив Джонс писал об этом некоторое время назад. Обратите внимание, что из-за того, что я раскрыл ниже, нельзя полагаться на
is_policy_checked = 1
то, что пароль действительно соответствует вашей текущей политике, поскольку логин мог быть создан с использованием хешированного пароля (в этом случае пароль в виде простого текста не может быть проверено) или в то время как локальная политика сложности была отключена (что все еще ведет кis_policy_checked = 1
).Другой подход, который, как я думал, сработает, состоит в том, чтобы попытаться создать копию каждого логина с указанием его текущего
password_hash
и сCHECK_POLICY = ON
, и записать все, что не удалось. Однако это может не сработать - даже еслиCHECK_POLICY = ON
оно не выполняет проверку уже хешированного пароля. Я включу код для потомков - но, по замыслу, политику просто невозможно проверить.Лично я считаю, что это ошибка. Если синтаксис позволяет мне создать логин, используя хешированный пароль, и я могу оговорить, что этот пароль должен соответствовать моей политике сложности, то это должно привести к ошибке или предупреждению о том, что политика фактически не проверялась.
ОБНОВЛЕНИЕ : я подал ошибку против этого поведения.
источник
select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;
дал несколько положительных результатов. Так что мне придется делать это для всех входов в систему, а не только для тех, у когоis_policy_checked
отключено.Там нет никакого способа, которым вы собираетесь получить это 100% точности. Хотя вы можете использовать
PWDCOMPARE
для проверки списка слабых паролей (вы можете добавить в список слабых паролей и сделать сравнение).Я написал аналогичный скрипт, который делает сравнение и дает вам результаты. Я разместил это на github .
РЕДАКТИРОВАТЬ:
Теперь вы можете иметь список слабых паролей в csv, а затем использовать dbatools
Test-DbaLoginPassword
с-Dictionary
switch (Указывает список паролей, которые нужно включить в тест на слабые пароли.)источник
Политика паролей для каждого входа в SQL - это только флаг включения или выключения. Если установлен флажок «Политика паролей», то применяется политика паролей Windows из операционной системы.
Проверьте документацию CREATE LOGIN для получения подробной информации о том, что происходит, когда установлены CHECK_POLICY и CHECK_EXPIRATION.
Вы можете увидеть настройки для каждого пользователя SQL, проверив столбцы is_policy_checked и is_expiration_checked в sys.sql_logins
что-то вроде ниже:
Для входа в систему аутентификации SQL Server:
select * from sys.server_principals where type in ('U','G')
- покажет вам логины и группы, которые могут получить доступ к SQL Server через аутентификацию Windows.источник