Active Directoryの弱いパスワードを監査する方法(PowerShell+DSInternals)
Active Directoryドメインにおけるユーザーパスワードの複雑性は、ユーザーデータのみならず、ドメインインフラ全体のセキュリティを左右する重要な要素のひとつです。しかし多くのユーザーは、個人情報や辞書にある単語、単純な組み合わせをパスワードに使わないよう推奨されているにもかかわらず、覚えやすい簡単なパスワードを好んで使用しがちです。
本記事では、PowerShellを使用してActive Directoryのユーザーパスワードを監査し、脆弱で単純なパスワードを検出する方法を解説します。
たとえドメインで複雑なパスワードポリシーが設定されていても、ユーザーは技術的には Pa$$w0rd や P@ssw0rd のような脆弱なパスワードやデフォルトのパスワードを設定できてしまいます。
DSInternals(Directory Services Internals)PowerShellモジュールのインストール方法
Active Directoryデータベース(ntds.ditファイル)に保存されたユーザーのパスワードハッシュと、単純・よく使われるパスワードの辞書を照合するには、サードパーティ製のPowerShellモジュール「DSInternals」を利用します。このモジュールには、ADデータベースに対してオンラインまたはオフライン(ntds.ditファイルを直接操作)でさまざまな操作を行うためのコマンドレットが多数含まれています。
特に注目したいのがTest-PasswordQualityコマンドレットです。これにより、脆弱なパスワード、類似したパスワード、標準的なパスワード、空白のパスワード(Password Not Required)、有効期限が設定されていないパスワードを持つユーザーを検出できます。
注意: もちろん、ユーザーのパスワードを平文のままADデータベースから取得することはできません。Active Directoryに保存されるパスワードはハッシュ化されています。ただし、ADユーザーのパスワードハッシュと辞書ファイル内の単語のハッシュを比較することで、脆弱なパスワードを見つけることは可能です。
PowerShell 5以降では、公式のPowerShellギャラリーから次のコマンドでDSInternalsモジュールをオンラインインストールできます。
Install-Module DSInternals
それ以前のバージョンのPowerShellやオフライン環境の場合は、GitHub(https://github.com/MichaelGrafnetter/DSInternals/releases)から最新版モジュールの.zipアーカイブをダウンロードしてください。執筆時点での最新リリースはDSInternals v4.4.1です。アーカイブを展開し、以下のいずれかのPowerShellモジュール用ディレクトリに配置します。
- C:\Windows\system32\WindowsPowerShell\v1.0\Modules\DSInternals
- C:\Users\%username%\Documents\WindowsPowerShell\Modules\DSInternals
または、次のコマンドで現在のPowerShellセッションにDSInternalsモジュールをインポートすることもできます。
Import-Module C:\distr\PS\DSInternals\DSInternals.psd1
モジュールのインポート時に「cannot be loaded because running scripts is disabled on this system」(このシステムではスクリプトの実行が無効になっているため読み込めません)というエラーが表示される場合は、PowerShellの実行ポリシーを変更し、少なくとも現在のセッションで外部PSスクリプトの実行を許可する必要があります。
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
利用可能なコマンドレットの一覧は、次のコマンドで確認できます。
Get-Command -Module DSInternals

Test-PasswordQualityコマンドレットでActive Directoryの脆弱なパスワードを検出する
次に、パスワード辞書を作成します。これは、よく使われる脆弱なパスワードなどのリストを記載したシンプルなテキストファイルです。インターネットからパスワード辞書ファイルをダウンロードしてもよいですし、自分で作成しても構いません。DSInternalsモジュールは、Active Directory内のユーザーのパスワードハッシュと、このファイル内の単語のハッシュを比較できます。パスワードのリストをテキストファイルPasswordDict.txtとして保存してください。

続いて、小さなPowerShellスクリプトを作成します。次の変数に、パスワードファイルのパス、ドメイン名、ドメインコントローラー名を指定します。
$DictFile = "C:\distr\PS\DSInternals\PasswordDict.txt"
$DC = "lon-dc01"
$Domain = "DC=woshub,DC=loc"
次に、Get-ADReplAccountコマンドレットを使用して、AD内のユーザーリストを取得します(Get-ADUserと同様の動作)。さらに、このコマンドレットはNTハッシュとLMハッシュ、およびハッシュ履歴も返します。そして各ユーザーについて、パスワードのハッシュと辞書ファイル内のハッシュを比較します(無効化されたユーザーアカウントもチェック対象となります)。
Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordsFile $DictFile -IncludeDisabledAccounts
スクリプトの実行結果は、次のようになります。
Active Directory Password Quality Report ---------------------------------------- Passwords of these accounts are stored using reversible encryption: LM hashes of passwords of these accounts are present: These accounts have no password set: TEST\DefaultAccount TEST\Guest Passwords of these accounts have been found in the dictionary: TEST\a.adams TEST\jbrion TEST\jsanti These groups of accounts have the same passwords: Group 1: TEST\a.novak TEST\Administrator TEST\amuller TEST\k.brown Group 2: TEST\a.adams TEST\jbrion TEST\jsanti These computer accounts have default passwords: Kerberos AES keys are missing from these accounts: Kerberos pre-authentication is not required for these accounts: Only DES encryption is allowed to be used with these accounts: These administrative accounts are allowed to be delegated to a service: TEST\a.adams TEST\a.novak TEST\Administrator TEST\jbrion TEST\jsanti TEST\k.brown TEST\krbtgt Passwords of these accounts will never expire: TEST\a.adams TEST\Administrator TEST\DefaultAccount TEST\Guest TEST\k.brown TEST\krbtgt TEST\web These accounts are not required to have a password: TEST\ADFS1$ TEST\DefaultAccount TEST\Guest These accounts that require smart card authentication have a password:

以前のバージョンのDSInternalsモジュールには、辞書内でハッシュが一致した場合にユーザーのパスワードを平文で表示するShowPlainTextパラメーターが用意されていましたが、現行リリースのTest-PasswordQualityでは削除されています。古いバージョンのDSInternalsモジュールを使用したい場合は、次のコマンドでインストールしてください。
Install-Module -Name DSInternals -RequiredVersion 2.23
ハッシュの検索は、ADに保存されているユーザーのパスワード履歴も含めて実行されます。ご覧のとおり、単純なパスワード(辞書と一致するパスワード)を設定しているADユーザーが正常に検出されました。また、同じパスワードを共有している複数のユーザーも発見されています。このスクリプトを使えば、細粒度パスワードポリシー(Fine-Grained Password Policies)の適用対象となるアカウントの中から、単純なパスワードを持つものを特定することもできます。
脆弱なパスワードを持つユーザーに対しては、強力なランダムパスワードを生成し、PowerShell経由でAD上のパスワード変更を強制することが可能です。
さらに、Active Directoryデータベースファイル(ntds.dit)をオフラインでスキャンすることもできます。ntds.ditファイルのコピーは、シャドウコピーまたはドメインコントローラーのバックアップから取得できます。
ntds.ditファイル内のユーザーハッシュをオフラインでチェックするには、次のコマンドを使用します。
$keyboot = Get-BootKey -SystemHiveFilePath 'C:\ADBackup\registry\SYSTEM'
Get-ADDBAccount -All -DatabasePath 'C:\ADBackup\ntds.dit' -BootKey $keyboot | Test-PasswordQuality -WeakPasswordsFile $DictFile
すべてのハッシュのリストをテキストファイルにエクスポートすることもできます。
Get-ADDBAccount -All -DBPath 'C:\ADBackup\ntds.dit' -Bootkey $keyboot | Format-Custom -View HashcatNT | Out-File c:\ps\ad_hashes.txt -Encoding ASCII
Active Directory Domain Servicesには、禁止パスワードのリストを設定する組み込みツールはありません。ただし、Azure AD パスワード保護(Azure AD Password Protection)を利用すれば、オンプレミスのActive Directoryでも特定のパスワードをブロック(ブラックリスト登録)できます。
以上のシナリオを活用すれば、ADユーザーのパスワード品質やブルートフォース攻撃への耐性を簡単に分析し、現在のドメインパスワードポリシーの強度について必要な改善点を導き出すことができます。Active Directory管理者は、この監査を定期的に実施することが望まれます。
-
ZabbixでActive Directory連携のシングルサインオン(SSO)認証を構築する方法【Kerberos設定手順】
本記事では、Kerberosを使用して、Zabbix 4.0以降とActive Directoryを連携させた透過的なSSO(シングルサインオン)認証を段階的に構築する手順を解説します。最終的なゴールは、ユーザーが資格情報を入力することなく、Zabbixのフロントエンドに自動ログインできる状態を作ることです。そのためには、ユーザーがZabbixに登録されたActive DirectoryドメインアカウントでWindowsにログインしている必要があります。さらに、ブラウザ側でも事前設定(Kerberosサポートの有効化やIEでの信頼済みイントラネットサイトへの登録など)が必要です。検証環境今回の
-
Windows 10でActive Directoryを有効にする方法【RSAT導入から設定まで解説】
Active Directoryは、Windows Server環境を管理するための重要なツールです。ネットワーク上のユーザーやリソースへのアクセス権限を、管理者が制御・付与するために使用されます。Windows PCにはデフォルトではインストールされていませんが、Microsoftの公式サイトから入手して、自分のデバイスにインストールすることが可能です。 「Windows 10でActive Directoryをどう使えばいいのか分からない」とお悩みの方も多いのではないでしょうか。本記事では、Windows 10でActive Directoryを有効にする方法を、初心者の方にも分かりやすく