Підтвердження політики паролів на існуючих користувачах


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

Однак це не говорить про те, чи дійсно паролі відповідають політиці щодо паролів, оскільки прапор має значення лише під час створення користувача.

Чи відомий спосіб перевірити існуючих користувачів на відповідність політиці паролів?
У мене немає доступу до старих паролів, і я вважаю за краще метод, який їх не вимагає.


1
Яка конференція? Дні SQL Server? BICC? Швидкий пошук, здається, що немає вродженої функції, яка швидко дасть вам результат. Можливо, можливо використовувати сторонній інструмент.
Stijn Wynants

Дні SQL Server Я також здійснив кілька швидких пошуків, і крім деяких інструментів, які просто роблять атаки на словники, PWDCOMPARE()я не дуже знайшов, незалежно від вдячності за зусилля!
Здійснює

Ви можете підтвердити політику щодо наступного входу та застосувати скидання для всіх користувачів, які не входять до аудиту. Менше роздратування користувачів у порівнянні з перезавантаженням усіх паролів.
CodesInChaos

@CodesInChaos Як ви підтверджуєте політику під час події входу?
Аарон Бертран

1
Я обговорював це питання - і я закликаю всіх вас голосувати і прокоментувати пункт "Підключення" .
Аарон Бертран

Відповіді:


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вимкнено.
Здійснює

@ Можливо, можливо. Або політика щодо вашого пароля в Windows може бути слабкою або вимкненою, тому спроба їх виконання не допомагає.
Аарон Бертран

Я просто спробував створити того самого користувача на другому сервері, і не вдалося перевірити пароль. Тож я здогадуюсь, перевірка складності працює. Мені подобається ідея відтворення копій користувачів! Я буду працювати над створенням сценарію, який робить саме це! EDIT: насправді я міг просто використовувати sp_help_revlogin для важкого підйому.
Здійснює

"він не виконує перевірку вже хешованих паролів". Як це зробити? Якщо ви знаєте лише хеш, а не простий пароль, ви не можете перевірити складність пароля. Ви можете здогадатися про пароль, але це було б дуже дорого для гідного хешу пароля, оскільки вся суть хешу паролів перешкоджає відновленню простого тексту.
CodesInChaos

@CodesInChaos Я знаю, це моя думка ... Я сказав "не", але міг також написати "не міг" ...
Аарон Бертран

4

Ні в якому разі ви не зможете отримати це на 100% точність. Хоча ви можете використовувати PWDCOMPAREдля перевірки списку слабких паролів (ви можете додати до списку слабких паролів і зробити порівняння).

Я написав подібний сценарій, який робить порівняння і дає вам результати. Я розмістив його на github .

Редагувати:

Тепер ви можете мати список слабких паролів у csv, а потім використовувати dbatools Test-DbaLoginPasswordз -Dictionaryперемикачем (Вказує список паролів, які потрібно включити до тесту на слабкі паролі.)


Я дуже хотів би використовувати ваш сценарій, якщо мені коли-небудь доведеться робити перевірку пароля конкретного користувача. Однак, не знаючи, що збирається робити аудитор, я краще просто переконатись, що все відповідає політиці, і покладатися на тих, хто створює політику. Дякую, хоча! +1
реалізує

0

Політика паролів на вхід у SQL - це лише прапор для ввімкнення та вимкнення. Якщо прапор Політики пароля встановлено, тоді застосовується Політика пароля Windows з операційної системи.

Перегляньте документацію CREATE LOGIN, щоб дізнатися, що саме відбувається, коли встановлено CHECK_POLICY та CHECK_EXPIRATION.

Ви можете переглянути налаштування для кожного користувача SQL, перевіривши стовпці is_policy_ перевірені та is_expiration_ перевірені в 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-сервера через автентифікацію Windows.


Трохи оновив моє запитання, оскільки я вже використовував подібний запит. Моє головне питання полягає в тому, що мені потрібно запевнити свого шефа, що паролі відповідають політиці, але не знаючи паролів, я не знаю, як я міг би.
Здійснює
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.