自動化で SecretStore を使用する

Important

PowerShellチームは、Secretモジュールは機能が完結しており、今後積極的に開発されることはないと決定しました。 これらのモジュールは引き続きサポートされ、セキュリティや重大なバグ修正が行われます。 コードリポジトリはアーカイブされています。

最新に公開されたバージョンは以下の通りです:

このプロジェクトが設計されて以来、秘密の性質は根本的に変わりました。 パスキー、シングルサインオン、Microsoft Entra ID、生体認証、ハードウェアセキュリティキーなどのフェデレーテッド認証システムなどのパスワードレス認証方法が将来的に登場します。

この記事では、Microsoftの使い方の例を提供しています。自動化シナリオにおけるPowerShell.SecretStoreのボールト。 SecretStoreのVaultは、ローカルマシン上の自動化パイプラインで使用するために必要なパスワード、トークン、その他の秘密を安全に保存・取得する方法を提供します。

自動化を実行するホストを設定しましょう

この例ではまずSecretManagementモジュールをインストールし、設定する必要があります。 この例は、オートメーションホストがWindowsを使っていることを前提としています。 これらのコマンドはホスト上の自動化アカウントのユーザーコンテキスト内で実行されなければなりません。

Install-Module -Name Microsoft.PowerShell.SecretStore -Repository PSGallery -Force
Install-Module -Name Microsoft.PowerShell.SecretManagement -Repository PSGallery -Force
Import-Module Microsoft.PowerShell.SecretStore
Import-Module Microsoft.PowerShell.SecretManagement

SecretStoreのボールトを設定する

また、SecretStoreの保管のために SecureString としてパスワードを作成する必要があります。 あなたが使っている自動化システムには、保管庫を守るために使える安全なパスワードを提供する仕組みがあるかもしれません。 例えば、GitHubはGitHub Actionsで秘密を安全に保存・利用する方法を提供しています。 詳細については、「 GitHub Actions でのシークレットの使用」を参照してください。

この例では、パスワードはSecureStringで、XMLファイルに安全にエクスポートされ、Windowsデータ保護(DPAPI)によって暗号化されています。 次のコマンドはパスワードの入力を促します。 この例では ユーザー名 は重要ではありません。

PS> $credential = Get-Credential -UserName 'SecureStore'

PowerShell credential request
Enter your credentials.
Password for user SecureStore: **************

パスワードを手に入れたら、それを暗号化したXMLファイルに保存できます。

$securePasswordPath = 'C:\automation\passwd.xml'
$credential.Password |  Export-Clixml -Path $securePasswordPath

次に SecretStore のVaultを設定する必要があります。 この設定はユーザーのインタラクションを Noneに設定するため、 SecretStoreが ユーザーにプロンプトを送らないようにします。 この設定にはパスワードが必要で、パスワードは SecureString オブジェクトとして渡されます。 -Confirm:falseパラメータはPowerShellが確認を求めないように使われています。

Register-SecretVault -Name SecretStore -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
$password = Import-CliXml -Path $securePasswordPath

$storeConfiguration = @{
    Authentication = 'Password'
    PasswordTimeout = 3600 # 1 hour
    Interaction = 'None'
    Password = $password
    Confirm = $false
}
Set-SecretStoreConfiguration @storeConfiguration

Vaultをインストール・設定したら、 Set-Secret を使って自動化スクリプトに必要な秘密を追加できます。

自動化でシークレットを使う

SecretStoreのパスワードは安全な方法で提供されなければなりません。 ここでは、パスワードがWindowsデータ保護(DPAPI)で暗号化されたファイルからインポートされています。

Note

これはWindows専用の解決策ですが、別の選択肢としては、GitHub ActionsのようなCIシステムが提供する安全な変数を使う方法もあります。

自動化スクリプトは、スクリプト内の秘密を取り出すためにヴォールトを解除する必要があります。 Unlock-SecretStoreコマンドレットはこのセッションのSecretStoreをアンロックするために使われます。 パスワードのタイムアウトは1時間に設定されていました。 その期間、セッション中は金庫が解除されたままです。 タイムアウト後は、秘密にアクセスする前に再び金庫を解除しなければなりません。

$password = Import-CliXml -Path $securePasswordPath
Unlock-SecretStore -Password $password
$automationPassword = Get-Secret -Name CIJobSecret