web-dev-qa-db-ja.com

既存ユーザーのパスワードポリシーの確認

最近、多くのデータベースログインで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

ただし、フラグはユーザーの作成時にのみ関連するため、パスワードが実際にパスワードポリシーに準拠しているかどうかはわかりません。

既存ユーザーにパスワードポリシーのコンプライアンスをテストする既知の方法はありますか?
私は古いパスワードにアクセスできません。私はそれらを必要としない方法を好みます。

11
Reaces

これはユーザーの間では一般的ではないかもしれませんが、確かに知ることができる唯一の方法は、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_hashCHECK_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 [〜#〜]:この動作に対してバグを報告しました。

15
Aaron Bertrand

これを100%正確にする方法はありません。ただし、PWDCOMPAREを使用して脆弱なパスワードのリストをチェックできます(脆弱なパスワードのリストに追加して比較できます)。

比較を行い、結果を提供する同様のスクリプトを作成しました。 github に投稿しました。

編集:

これで、csvに脆弱なパスワードのリストを作成し、dbatools Test-DbaLoginPassword-Dictionaryスイッチ(脆弱なパスワードのテストに含めるパスワードのリストを指定します。)

4
Kin Shah

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にアクセスできるログインとグループを表示します。

0
KASQLDBA