PowerShellを使って強力なランダムパスワードを生成する方法

Active Directory で新しいユーザーアカウントを設定する際、通常は一時的な初期パスワードを設定します。通常、このパスワードは一意でランダムに生成され、ユーザーは初回ログイン時にパスワードの変更を求められます(ここで、 userAccountControl属性で設定される「ユーザーは次回ログイン時にパスワード変更が必要」という設定が役立ちます)。手動で行う場合はそれほど手間はかかりませんが、大量のアカウントを作成する場合(例えば PowerShell スクリプトを使用する場合)、それぞれにランダムなパスワードを入力するのは面倒です。そこで、パスワードジェネレーターのスクリプトを作成することで、時間を大幅に節約でき、手間をかけずにすべてのパスワードが強力で一意であることを確認できます。

PowerShellでこれを行う便利な方法の一つは、System. Web. Security. MembershipクラスのGeneratePasswordメソッドを活用することです。私のマシンで試してみましたが、かなり信頼性が高いです。ここでは、その仕組みを簡単に説明するとともに、会社のパスワードポリシーに違反したり、入力が面倒なパスワードを作成したりしないためのヒントをいくつかご紹介します。

Active Directoryユーザー向けの安全なパスワードを生成する方法

方法1: GeneratePassword による基本的なパスワード生成

この方法はシンプルです。パスワードポリシーがそれほど厳しくない場合に適しています。この方法では、パスワードの長さと特殊文字の数を指定できます。設定によっては、少し奇抜すぎるパスワードや、複雑さのチェックボックスをすべて満たさないパスワードが生成される場合があります。特にパスワードポリシーが厳格である場合は、いくつか試してみて、どれがうまくいくかを確認してください。

PowerShell での実行方法は次のとおりです。

# Import the necessary assembly Add-Type -AssemblyName System. Web # Generate a password of 8 characters with 2 special characters [System. Web. Security. Membership]::GeneratePassword(8, 2) 

例えば、生成されるパスワードは次のようなものになるかもしれQX.9ogy:ません。悪くはありませんが、警告として、特殊文字を1~2個以上追加すると、特に特定のキーボードやショートカットで、ユーザーの入力が困難になる可能性があります。少し奇妙に聞こえるかもしれませんが、一部のシステムでは、複雑すぎる組み合わせで誤動作することがあります。

方法2: カスタムパスワードで新しいユーザーを作成する

ここからが実用的です。New -ADUserを使ってアカウント作成のスクリプトを作成する場合は、パスワードジェネレーターをスクリプトに直接組み込むことができます。

Add-Type -AssemblyName System. Web New-ADUser -Name "Jeremy Irons" ` -GivenName "Jeremy" ` -Surname "Irons" ` -SamAccountName "jirons" ` -UserPrincipalName "[email protected]" ` -Path "OU=Users, OU=Glasgow, OU=UK, DC=woshub, DC=com" ` -AccountPassword ( [System. Web. Security. Membership]::GeneratePassword(8, 2) ) ` -ChangePasswordAtLogon $true ` -Enabled $true 

この方法により、すべての新規ユーザーはすぐにランダム化された、かなり強力なパスワードを取得できます。ただし、ADポリシーが厳格な場合、生成されたパスワードがそのままでは複雑さのルールを満たさない場合があることにご注意ください。その場合は、パスワードの確認や再生成が必要になる場合があります。また、後からパスワードをリセットする場合も同じ方法で、新しいパスワードを生成して適用するだけで済みます。

方法3: パスワードがドメインの複雑さの要件を満たしていることを確認する

さて、この部分は少し難しいです。ADのパスワードポリシーでは、長さだけでなく複雑さも求められることが多く、少なくとも大文字、小文字、数字、特殊文字の3種類の文字の組み合わせが必要です。GeneratePasswordメソッドはこれを保証しないため、脆弱なパスワードやポリシーに準拠していないパスワードがすり抜けてしまう可能性があります。これに対処するには、スクリプトのちょっとした魔法が役立ちます。つまり、ランダムでありながらポリシーに準拠したパスワードを生成するのです

適切な複雑度チェックに達するまで生成を続ける小さなPowerShell関数を自作しました。基本的な考え方は次のとおりです。

Function GenerateStrongPassword ([Parameter(Mandatory=$true)][int]$PasswordLength) { Add-Type -AssemblyName System. Web $PassComplexCheck = $false do { $newPassword = [System. Web. Security. Membership]::GeneratePassword($PasswordLength, 1) if ( ($newPassword -cmatch "[A-Z]") -and ($newPassword -cmatch "[a-z]") -and ($newPassword -cmatch "[\d]") -and ($newPassword -cmatch "[^\w]") ) { $PassComplexCheck = $true } } while (-not $PassComplexCheck) $newPassword } 

を実行するとGenerateStrongPassword (5)、少なくとも1つの特殊文字を含む5文字のパスワードを生成し続け、パスワードがすべての条件を満たした時点で停止します。正確な理由は不明ですが、厳格なドメインポリシーにも準拠したパスワードを生成する傾向があります。ただし、短いパスワードはユーザーが覚えにくくなる可能性があり、ポリシーが非常に厳しい場合はそれでも失敗する可能性があることに注意してください。

いずれにせよ、合格するパスワードを生成したら、それをユーザーアカウントに割り当てたり、パスワードをリセットしたりしても安全です。このスクリプトは、パスワードが単にランダムに強力であるだけでなく、ポリシーに準拠していることを保証するので、後々面倒な作業を減らすことができます。

私の経験では、このプロセス全体は最初は面倒に感じるかもしれませんが、一度コツをつかめば、ユーザー作成とパスワード設定の自動化ははるかに楽になります。さらに、推測や手入力に頼ることなく、パスワードを統一的(強力かつユニーク)に保つことができます。

まとめ

  • [System. Web. Security. Membership]::GeneratePassword()素早くランダムなパスワードを作成するために使用します。
  • それを AD ユーザー作成スクリプトにラップして、アカウントのプロビジョニングを自動化します。
  • パスワードが複雑なポリシーを満たす必要がある場合は、準拠するまで生成およびチェックする小さなループを記述します。
  • 特にポリシーが厳しい場合は、ユーザーの不満を避けるために生成されたパスワードをテストしてください。

まとめ

複数の異なる設定で動作したので、新しいADアカウントの作成が少しでも楽になれば幸いです。いつものように、このようなスクリプトを導入する前にパスワードポリシーを再確認してください。そうしないと、大量のパスワードを手動で再生成することになりかねません。この方法が、ユーザーのオンボーディングをスムーズかつ安全に行うのに役立つことを願っています。