PowerShell SecretManagementモジュールでパスワードとシークレットを安全に管理する方法
Microsoftは、PowerShellスクリプト内で保存済みのパスワード(シークレット)を安全に保管・利用できる便利なSecretManagementモジュールを提供しています。このモジュールは2つのコンポーネントで構成されています。1つは既定のパスワードストアとなるSecretStoreボールト、もう1つは各種パスワードボールトへアクセスするためのエンジンであるSecretManagementです。
組み込みのSecretStoreボールトに加えて、KeePass、LastPass、HashiCorp Vault、Azure Key Vault、Bitwarden、Windows資格情報マネージャーなどのサードパーティ製シークレットボールトにも対応しています。SecretManagementを利用すれば、任意のパスワード(資格情報)をシークレットボールトに保存し、必要なときにいつでも取り出せます。ライセンスキーやアクセスキーなど、その他の機密情報の保存も可能です(Hashtable、Byte、String、SecureString、PSCredentialオブジェクト型をサポート)。
この記事では、PowerShellスクリプトでSecretManagementモジュールを使って資格情報を保存・取得する方法と、KeePassとの連携例を詳しく解説します。
SecretManagementモジュールのインストール
SecretManagementモジュールには、Windows PowerShell 5.1以降、またはPowerShell Core 6.x/7.xが必要です。
NuGetパッケージマネージャー経由でSecretManagementをインストールするには、以下のコマンドを実行します。
Install-Module -Name Microsoft.PowerShell.SecretManagement
Microsoftが提供する既定のSecretStoreボールトをインストールするには、次のコマンドを使用します。
Install-Module -Name Microsoft.PowerShell.SecretStore
モジュールで利用可能なコマンドレットの一覧を表示するには、以下のコマンドを実行します。
Get-Command -Module Microsoft.PowerShell.SecretManagement
Get-Command -Module Microsoft.PowerShell.SecretStore
PowerShellでパスワードストア(SecretStoreボールト)を作成する
まず、ローカルのシークレットボールトを作成します。ここでは「MyDomainPassdb」という名前を付け、既定のパスワードストアとして登録します。
Register-SecretVault -Name MyDomainPassdb -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
PowerShellスクリプト実行ポリシーの設定によりモジュールが実行できない場合は、現在のセッション限定で以下のように設定を変更できます。
Set-ExecutionPolicy -Scope Process Unrestricted
ローカルとリモートのどちらのパスワードボールトでも作成・利用できます。
現在のユーザーに登録されているパスワードボールトの一覧を表示するには、次のコマンドを実行します。
Get-SecretVault
SecretStoreボールトへアクセスするためのマスターパスワードを確認・設定するには、以下のコマンドレットを使用します。
Get-SecretStoreConfiguration
注意: マスターパスワードを忘れると、ボールトに保存されたデータへアクセスできなくなります。
既定では、以下の設定によって誰がどのようにパスワードストアへアクセスできるかが決まります。
- Scope –
CurrentUser(現在のユーザーのみがSecretStoreにアクセス可能) - Authentication –
Password(マスターパスワードによる認証でアクセス) - PasswordTimeout –
900秒:マスターパスワードの再入力が不要になるセッション時間。Set-SecretStoreConfiguration -PasswordTimeout 1200で延長できます - Interaction –
Prompt(変更操作時にマスターパスワードの入力を求めるかどうか)
シークレットボールトへのアクセス時にマスターパスワードを要求しない設定も可能ですが(推奨されません)、その場合はAuthentication = Noneを指定します。
Set-SecretStoreConfiguration -Authentication None
マスターパスワードを変更するには、Set-SecretStorePasswordコマンドレットを使用します。
Windowsの場合、ローカルのパスワードストアはユーザープロファイルフォルダー内の %LOCALAPPDATA%\Microsoft\PowerShell\secretmanagement に格納されます。
なお、マネージドサービスアカウント(MSA/gMSA)にはユーザープロファイルが作成されないため、SecretManagementモジュールは利用できない点に注意してください。
SecretManagementモジュールで保存した資格情報を管理する
SecureString型のシークレットをパスワードボールトに追加するには、Set-Secretコマンドレットを使用します。ボールト名とエントリー名を指定しましょう。
Set-Secret -Vault MyDomainPassdb -Name user1
保存したいパスワード(シークレット)を対話形式で入力します。
または、保護したい値を直接指定して保存することもできます(GitHubキーの例)。
Set-Secret -Vault MyDomainPassdb -Name MY_GITHUB_TOKEN -Secret 'GitHub_AUTH_API_Token'
注意: 機密情報をPowerShellコンソールに平文で入力すると、コマンド履歴に記録が残るため注意が必要です。
シークレットボールト内のエントリー一覧を表示するには、次のコマンドを実行します。
Get-SecretInfo
PowerShell 7.xでは、-AsPlainTextオプションを使うことで、パスワードボールトから取得した保護された値を平文で表示できます(必要に応じてPowerShellのバージョンを更新してください)。
Get-Secret -Vault MyDomainPassdb -Name user1 | ConvertFrom-SecureString -AsPlainText
Windowsネットワーク環境では、パスワードのみではなくユーザー名とパスワードの両方を保存するケースがほとんどです。その場合は、資格情報をPSCredentialオブジェクトとして保存します。さらに、保存したエントリーの説明などをメタデータとして追加することも可能です。
Set-Secret -Vault MyDomainPassdb -Name adm_maxbak -Secret (Get-Credential) -Metadata @{description = "AD enterprise admin woshub.com"}
Get-Credentialウィンドウでアカウント名を入力したくない場合は、あらかじめユーザー名を指定しておくこともできます。
Set-Secret -Vault MyDomainPassdb -Name adm_maxbak -Secret (Get-Credential woshub\adm_maxbak)
保存済みのパスワードとその説明の一覧を表示する方法は次のとおりです。
Get-SecretInfo | Ft Name, Metadata
PowerShellスクリプトでシークレットボールトの保存済みパスワードを使う
これで、保存したパスワードをPowerShellスクリプトやコマンドの中で自由に使えるようになりました。
たとえば、ある企業ではセキュリティ確保と管理者アカウント保護のため、管理者ごとに十数個のアカウントを、さらにサービスやタスクごとに別々のアカウントを使い分けています。同じパスワードの使い回しは禁止されており、定期的にパスワード監査も実施されます。そのため管理者にとって、異なるパスワードを毎回手入力するのは大きな負担でした。
SecretManagementモジュールを使えば、パスワードをローカルボールトに安全に保管し、必要なときだけ取り出せるようになります。
たとえば、PowerShell Remoting経由でリモートコンピューターに接続してコマンドを実行するには、次のようなコードを使用します。
Enter-PSSession -ComputerName mun-dc01 -Credential (Get-Secret -Vault MyDomainPassdb -Name adm_maxbak)
同様の方法で、ExchangeやMicrosoft 365(旧Office 365)への接続も簡単になります。
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://mun-exch1.woshub.com/PowerShell/ -Authentication Kerberos -Credential (Get-Secret -Vault MyDomainPassdb -Name adm_ex_maxbak)
Azure ADテナントへの接続も次のように行えます。
Connect-AzureAD -Credential (Get-Secret -Vault MyDomainPassdb -Name azadm_maxbak)
また、単に資格情報を取得してPowerShell変数に格納することもできます。
$Cred = Get-Secret -Vault MyDomainPassdb -Name user1
PowerShellでKeePassのパスワードとシークレットを管理する
SecretManagementモジュールは、その他の人気パスワードボールトへのアクセスにも活用できます。ここでは、KeePassファイル(*.kdbx)に保存されたパスワードへアクセスする方法を見てみましょう。
まず、KeePassと連携するためのSecretManagementモジュールをインストールします。
Install-Module -Name SecretManagement.KeePass
次に、ユーザープロファイル内にあるKeePassボールトファイルを登録します。
Register-SecretVault -Name "KeePassDB" -ModuleName "SecretManagement.KeePass" -VaultParameters @{
Path = "C:\Users\maxbak\Documents\personal_creds.kdbx"
UseMasterPassword = $true
}
KeePassファイルへのアクセスを確認するには、次のコマンドを実行します。
Test-SecretVault -Name KeePassDB
KeePassボールトにアクセスするためのマスターパスワードを入力します。パスワードが正しければ、コマンドはTrueを返します。
続いて、KeePassデータベースに保存されているパスワードの一覧を表示します。
Get-SecretInfo -Vault KeePassDB
KeePassに新しいシークレットを保存する場合は、次のようにします。
Set-Secret -Vault KeePassDB -Name "ILO_adm" -Secret (Get-Credential woshub\ILO_adm)
同じ手順で、LastPassやAzure Key Vaultなど、他の一般的なパスワード管理ソリューションにも接続し、PowerShellから統一的に操作できます。スクリプト内にパスワードをハードコーディングする危険な運用から脱却し、安全で効率的な資格情報管理を実現しましょう。
-
Microsoft Edgeで保存されたパスワードを表示・管理する方法
Microsoftは競合に対抗し、比類のないユーザー体験を提供するために、Edgeブラウザーへ新機能を継続的に追加しています。他のブラウザーと同様に、Microsoft Edgeでも保存されたパスワードを表示・管理することが可能です。ログインが必要なサイトを訪れると、Edgeは「次回ログイン時にこのサイトのパスワードを記憶しますか?」と尋ねてきます。 Edgeをメインブラウザーとして使っている場合、通常はブラウザーがパスワード欄を自動入力してくれますが、特定のサイトのパスワードを直接確認したい場面もあります。例えば、別のデバイスで同じサイトにアクセスするために、保存済みのパスワードを見る必要
-
1つの保管庫で複数のパスワードを識別・ロック・管理する方法|TweakPass活用ガイド
オンラインニュースサイトの簡単なログインパスワードであっても、銀行口座やクレジットカードに関わる重要な情報であっても、認証情報は常に安全に管理すべき大切なデータです。認証情報は「ユーザー名」と「パスワード」の2つの要素で構成されており、パスワードはユーザーの裁量で自由に選択・保存できます。これはメリットに思えますが、裏を返せば、誰でも推測できる単純なパスワードを選んでしまうリスクにもつながります。本記事では、安全なパスワード管理アプリとして定評のある「TweakPass」を使って、複数のパスワードをロックし、効率的に管理する方法をご紹介します。 TweakPassで複数のパスワードをロック・管