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


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、2015

SQL Server日。私はいくつかのクイック検索も行っPWDCOMPARE()ていますが、私が使用して辞書攻撃を行うだけのツール以外は、それほど多くは見つかりませんでした。努力に感謝します!
2015

次のログイン時にポリシーを検証し、監査前にログインしていないすべてのユーザーを強制的にリセットできます。すべてのパスワードをリセットする場合と比較して、ユーザーの煩わしさが軽減されます。
CodesInChaos 2015

@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;

Steve Jonesがしばらく前にこれについて書いています。-以下で明らかにしたことによりis_policy_checked = 1、ハッシュが作成されたパスワードでログインが作成された可能性があるため、パスワードが実際の現在のポリシーを満たしているとは言えません(この場合、プレーンテキストのパスワードはオンにした場合)またはローカルの複雑性ポリシーが無効になっている間(それでもにつながりますis_policy_checked = 1)。

私がうまくいくと思った別のアプローチは、現在とですべてのログインのコピーを作成し、失敗したすべてのログインを書き留めることです。ただし、これは機能しません -を使用しても、すでにハッシュされたパスワードの検証は実行されません。後世のコードを含めますが、仕様上、ポリシーを確認することはできません。password_hashCHECK_POLICY = ONCHECK_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
2015

@Reacesたぶん。または、Windowsのパスワードポリシーが脆弱であるか無効になっている可能性があるため、ポリシーを適用しようとしても役に立たない。
アーロンバートランド

2つ目のサーバーで同じユーザーを作成しようとしたところ、パスワードの検証に失敗しました。だから私は複雑さのチェックがうまくいくと思います。ユーザーのコピーを再作成するというアイデアも気に入っています。それを行うスクリプトの作成に取り掛かります!編集:実際には私はsp_help_revloginを使用して重い作業を行うことができました。
2015

「すでにハッシュ化されたパスワードの検証を実行しません」どのように実行しますか?単純なパスワードではなくハッシュだけを知っている場合、パスワードの複雑さをチェックすることはできません。パスワードを推測することはできますが、適切なパスワードハッシュの場合、パスワードハッシュの全体のポイントがプレーンテキストパスワードの回復を妨げているため、非常にコストがかかります。
CodesInChaos 2015

@CodesInChaosわかっています、それが私のポイントです...私は「しない」と言いましたが、「おそらくできなかった」と書くこともできました...
Aaron Bertrand

4

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

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

編集:

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


特定のユーザーのパスワードを自分で監査する必要がある場合は、スクリプトを使用してください。しかし、監査人が何をしようとしているのかわからないので、むしろすべてがポリシーに準拠していることを確認し、ポリシーの作成者に依存します。ありがとう!+1
2015

0

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


すでに同様のクエリを使用していたため、質問を少し更新しました。私の主な問題は、上司にパスワードがポリシーに準拠していることを保証する必要があることですが、パスワードがわからないので、どうすればよいかわかりません。
2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.