Microsoft ActiveDirectory-外部ストレージのユーザーパスワードの更新

この記事は、Windowsドメインを基盤とするハイブリッドシステム環境を管理または作成するユーザーに焦点を当てており、集中型資格情報ストレージシステムを備えた他のプラットフォームおよびシステムでユーザーを承認できる必要があります。 ほとんどの場合、問題はありませんが、たとえば、CRAM-MD5または(ADにはない)別の承認スキームを使用して承認を実装する必要があり、通常はLDAPをサポートしません(またはMicrosoftの理解ではLDAPを理解しません) )、この記事はあなたのためです。



はじめに:



一般に、Microsoftには次のサービスがあります。パスワード変更通知サービス(PCNS)。 その目的は、ユーザーパスワードを変更する前と後にそれぞれイベントをトリガーすることです。 これらのイベントでは、パスワードをクリアテキストで送信できます(当然、セキュリティで保護されたチャネルを介して)。これが必要です。

PCNSを使用するには、豊富な機能などを備えた有料製品が多数ありますが、無料で手頃な価格の素材で自転車を作ろうとしています。





以下はすべて、Windows Server 2008R2で行われました。 さあ、行こう!



Passwdhk



まず、すべてのドメインコントローラーにPasswdHkライブラリをインストールする必要があります。ユーザーパスワード変更イベントを処理します(イベントはユーザーが書き込み権限を選択してコントローラーで自動的に生成され、パスワードを変更すると、ハッシュは他のコントローラーに配布されます)。

インストーラー(x64用)をダウンロードし、定期的にライブラリーを設定します。 次に、C:\ Windows \ System32 \ passwdhk.dllをC:\ Windows \ SysWOW64 \にコピーする必要があります。

DLLの他に、グラフィカル構成ユーティリティ、サンプル構成ファイル(regファイル)、および作業テスト(batファイル)もあります。 すべての設定はレジストリで行われ、システムの起動時に適用されます(変更する場合は、システムを再起動する必要があります)。

ユーティリティの欠陥!!!
ご注意ください! [適用]ボタンをクリックするたびに、レジストリパラメータ "SYSTEM \ CurrentControlSet \ Control \ Lsa \ Notification Packages"に1行追加され、ハンドルで調整する必要があります。




ラボシステムの設定は次のとおりです。







テキスト内の設定
「変更前」セクションと「変更後」セクションでは、パスワードを変更する前(独自のパスワード複雑度フィルターを実装できます)および変更後のアクションをそれぞれ指定します。

  • プログラム:C:\ Windows \ system32 \ cmd.exe(イベントを処理するために実行されるプログラム);
  • 引数:/ c start C:\ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe -File d:\ control \ check-user.ps1(上記のプログラムに渡されるコマンドライン引数);
  • パスワードエスケープは、パスワード文字のエスケープを設定しますが、残念ながらそれだけです。 ユーザー名のエスケープは発生せず、さらに、dllはUTF-8などのエンコーディングでは最新ではないため、キリル文字でのログインは非常に悲しげに見えます(結果を通常の形式でデコードできますか?)




上記のstartコマンドによる起動のオプションは偶発的なものではなく、パスワードを処理するために起動されたプログラムが指定されたタイムアウト(待機時間)を超えて実行される場合に特定の問題を回避できます。 仮想マシンを備えた負荷の高いホストでこれをすべて開始したため、非常に控えめなリソースを備えたマシンで、PowerShellシェルを起動し、モジュールを(長い待機の後)コールドにロードしましたが、簡単に40秒間超過しました(このとき、ユーザーはパスワードの変更も指示しました座って待機)、30秒の控えめなタイムアウトで、ハンドラーの呼び出しが強制的に中断されました。



そのため、PasswdHkの作業は終了しました。次に、パスワードを取得する方法を理解します。 PasswdHkは、最後の2つのコマンドライン引数でユーザー名とパスワードのペアを渡します。



PowerShellでの処理



ラボでの作業では、PowerShellを選択しました(ファッション現象として、あらゆる処理を実行できます)。

Import-Module ActiveDirectory $csv_file = "d:\passwd.csv" $domain=(Get-ADDomain -Server localhost).DNSRoot $user=$args[0] $passwd=$args[1] if(Get-ADUser -Filter {sAMAccountName -eq $user } -SearchScope 2 -Server localhost){ $csv = @() $csv_new = New-Object System.Object $csv_new | Add-Member -MemberType NoteProperty -Name "DOMAIN" -Value $domain $csv_new | Add-Member -MemberType NoteProperty -Name "USER" -Value $user $csv_new | Add-Member -MemberType NoteProperty -Name "PASSWD" -Value $passwd $csv += $csv_new if (Test-Path $csv_file){ $csv | ConvertTo-Csv -NoTypeInformation -delimiter "`t" ` | select -Skip 1 ` | Out-File -Encoding UTF8 -Append $csv_file } else{ $csv | ConvertTo-Csv -NoTypeInformation -delimiter "`t" ` | Out-File -Encoding UTF8 -Append $csv_file } };
      
      





ここで、コマンドライン変数からいくつかのユーザー名とパスワードを取得し、$ domainでパスワードが変更されたドメインのDNS名を入力し、返されたユーザー検索が空でない場合、これらすべてを3つの列(DOMAIN、USER、PASSWD)を持つCSVに入れます結果(ラテン語以外の名前の場合を除き、ユーザーのみに対応するオブジェクトをフィルタリングできます。そうしないと、このファイルのパスワードを定期的に更新するマシンが見つかります)。



おわりに



この例を少し変更することで、これらのパスワードを使用する任意の環境に送信できます。この方法を使用して、Dovecotメールシステム用のCRAM-MD5ハッシュを生成しました。



All Articles