最近、多くのデータベースログインで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
ただし、フラグはユーザーの作成時にのみ関連するため、パスワードが実際にパスワードポリシーに準拠しているかどうかはわかりません。
既存ユーザーにパスワードポリシーのコンプライアンスをテストする既知の方法はありますか?
私は古いパスワードにアクセスできません。私はそれらを必要としない方法を好みます。
これはユーザーの間では一般的ではないかもしれませんが、確かに知ることができる唯一の方法は、CHECK_POLICY = ON
を使用してSQLログインするたびにパスワードをforce変更することです。これにより、空白のパスワードを含む一連の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;
Steve Jonesがこれについて書いた しばらく前。 -以下で明らかにしたことにより、is_policy_checked = 1
を信頼して、パスワードが実際の現在のポリシーを満たしているとは言えないことに注意してください。パスワードはチェックできません)、またはローカルの複雑性ポリシーが無効になっている間(これはis_policy_checked = 1
につながります)。
私がうまくいくと思った別のアプローチは、現在のpassword_hash
とCHECK_POLICY = ON
を使用してすべてのログインのcopyを作成し、メモをとることです失敗するすべての人。 ただし、これは機能しません-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;
個人的にはバグだと思います。構文でハッシュされたパスワードを使用してログインを作成でき、そのパスワードが複雑性ポリシーを満たす必要があると規定できる場合、ポリシーが実際にはチェックされなかったというエラーまたは警告が生成されます。
[〜#〜] update [〜#〜]:この動作に対してバグを報告しました。
これを100%正確にする方法はありません。ただし、PWDCOMPARE
を使用して脆弱なパスワードのリストをチェックできます(脆弱なパスワードのリストに追加して比較できます)。
比較を行い、結果を提供する同様のスクリプトを作成しました。 github に投稿しました。
編集:
これで、csvに脆弱なパスワードのリストを作成し、dbatools Test-DbaLoginPassword
と-Dictionary
スイッチ(脆弱なパスワードのテストに含めるパスワードのリストを指定します。)
SQLログインごとのパスワードポリシーは、オンまたはオフのフラグにすぎません。パスワードポリシーフラグをオンにすると、オペレーティングシステムのWindowsパスワードポリシーが適用されます。
CHECK_POLICYとCHECK_EXPIRATIONが設定されている場合の動作の詳細については、CREATE LOGINのドキュメントを確認してください。
Sys.sql_loginsの列is_policy_checkedおよびis_expiration_checkedを確認することで、SQLユーザーごとの設定を確認できます。
以下のようなもの:
_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')
-Windows認証を介してSQL Serverにアクセスできるログインとグループを表示します。