PowerShellの新しい認証情報管理(PowerShell Secrets Management)がGAしました
しばたです。
以前お伝えしたPowerShellの新しい認証情報管理機能(PowerShell Secrets Management)が先日ついにVer.1.0.0となり正式リリースされました。
PowerShell Teamからのアナウンスはこちらになります。
本記事ではこのモジュールについて解説して実際に試していきます。
機能の概要
このモジュールは最初PowerShell 7のマイルストーンのひとつとして複数の認証情報ストアへのアクセスを統一的に行う方法を提供する事を目的に開発が始まりました。
その後8回のプレビューリリースを経て今回の正式リリースに至っています。
この機能は以下の2つのモジュールから構成されており、それぞれ認証情報へのアクセス機能とデフォルトの認証情報ストア(Vault)の役割を担っています。
- Microsoft.PowerShell.SecretManagement : 認証情報へのアクセス
- Microsoft.PowerShell.SecretStore : デフォルトの認証情報ストア
Microsoft.PowerShell.SecretStore
については開発の途中でMicrosoft.PowerShell.SecretManagement
から分離される形となり、また、その実装もWindowsの資格情報マネージャーを使う形から独自ファイルに暗号化した認証情報を保存する形に変更されています。
加えて認証情報ストアは拡張可能で、PowerShell Teamのブログでは以下のツールやサービス向けのモジュールが紹介されていました。
- KeePass : SecretManagement.KeePass
- LastPass : SecretManagement.LastPass
- Hashicorp Vault (Preview) : SecretManagement.Hashicorp.Vault.KV
- KeyChain : SecretManagement.KeyChain
- CreadMan : SecretManagement.JustinGrote.CredMan
- Azure KeyVault : Az.KeyVault (公式)
PowerShell Galleryを検索すると他サービス向けのもの結構ある様です。
(AWS向けのも作っている人を見た覚えがあるのですが見つけることができませんでした...)
利用者向けの機能はそこまで多くないので、ここからは実際に試しながら機能の説明をしていきます。
試してみた
それでは早速試していきます。
このモジュールはPowerShell 5.1以降の環境で利用可能です。
今回は私の開発環境である、
- 64bit版 Windows 10 Pro (Ver.20H2)
- PowerShell 7.1.3
を検証環境とします。
1. インストール
モジュールのインストールはInstall-Module
から行います。
Microsoft.PowerShell.SecretManagement
とMicrosoft.PowerShell.SecretStore
の両方インストールしておきます。
Install-Module Microsoft.PowerShell.SecretManagement, Microsoft.PowerShell.SecretStore -Scope CurrentUser -Force
他の認証情報ストアを使いたい場合は適宜インストールしておいてください。
2. 初期状態の確認
Microsoft.PowerShell.SecretManagement
で公開されているコマンドレットは以下の通りです。
認証情報(Secret
)にアクセスする各種機能と、認証情報ストア(SecretVault
)の登録に関わる機能が用意されていることがわかります。
C:\> Get-Command -Module Microsoft.PowerShell.SecretManagement
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Secret 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Get-SecretInfo 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Get-SecretVault 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Register-SecretVault 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Remove-Secret 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Set-Secret 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Set-SecretInfo 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Set-SecretVaultDefault 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Test-SecretVault 1.0.0 Microsoft.PowerShell.SecretManagement
Cmdlet Unregister-SecretVault 1.0.0 Microsoft.PowerShell.SecretManagement
Microsoft.PowerShell.SecretStore
で公開されているコマンドレットは以下の通りです。
認証情報ストア側は公開するコマンドレットに決まりはなく[1]ツールやサービスに応じて必要な機能が用意される形となります。
C:\> Get-Command -Module Microsoft.PowerShell.SecretStore
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-SecretStoreConfiguration 1.0.0 Microsoft.PowerShell.SecretStore
Cmdlet Reset-SecretStore 1.0.0 Microsoft.PowerShell.SecretStore
Cmdlet Set-SecretStoreConfiguration 1.0.0 Microsoft.PowerShell.SecretStore
Cmdlet Set-SecretStorePassword 1.0.0 Microsoft.PowerShell.SecretStore
Cmdlet Unlock-SecretStore 1.0.0 Microsoft.PowerShell.SecretStore
3. 認証情報ストアの登録
最初に利用する認証情報ストアの登録をRegister-SecretVault
コマンドを使って行います。
# Register-SecretVault で認証情報ストアの登録を行う
Register-SecretVault -Name SecretStore -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
このコマンドでMicrosoft.PowerShell.SecretStore
を既定の認証情報ストアとして使う様になります。
認証情報ストアの情報はGet-SecretVault
で確認することができ、今の状態だと以下の様な結果になるはずです。
C:\> Get-SecretVault
Name ModuleName IsDefaultVault
---- ---------- --------------
SecretStore Microsoft.PowerShell.SecretStore True
もし過去にプレビュー版のモジュールを使っていた場合は既に設定がされているかもしれません。
Microsoft.PowerShell.SecretStore
の各種設定は
- Windows環境 :
$env:LOCALAPPDATA\Microsoft\PowerShell\secretmanagement
- 非Windows環境 :
$env:HOME/.secretmanagement
に保存されますのでディレクトリごと削除すると設定を初期化することができます。
4. 認証情報の登録、参照
認証情報の登録にはSet-Secret
コマンドを使います。
使い方はシンプルで-Name
パラメーターに認証情報を識別するキーとなる名称を、-Secret
パラメーターに認証情報を指定します。
Set-Secret -Name MySecret -Secret "秘密の値"
登録時にはパスワードを指定する様に要求されますので適切に設定します。
登録した認証情報はGet-Secret
で取得します。
# Get-Secretで認証情報(SecureString)を取得
Get-Secret -Name MySecret
# 平文の認証情報が欲しい場合は -AsPlainText パラメーターを指定
Get-Secret -Name MySecret -AsPlainText
ここで先ほど設定したパスワードの入力が求められ、パスワードが合っている場合のみ認証情報を取得できます。
認証情報はSecureString、または-AsPlainText
パラメーターを指定することで平文で取得できます。
設定した認証情報の一覧はGet-SecretInfo
で取得できます。
C:\> Get-SecretInfo
Vault SecretStore requires a password.
Enter password:
********
Name Type VaultName
---- ---- ---------
MySecret String SecretStore
S2 String SecretStore # ← 別途追加しておいた認証情報
S3 String SecretStore # ← 別途追加しておいた認証情報
補足1. 設定したパスワードについて
初見ではちょっとわかりにくいのですが、ここで設定したパスワードは「認証情報ストアにアクセスするためのパスワード」になります。
このため複数の認証情報を扱う場合でも同じパスワードを使用する必要があります。
個別の認証情報ごとにパスワード設定できるわけではないのでご注意ください。
またこのパスワードは一定時間(デフォルト900秒)キャッシュされます。
キャッシュされている間はパスワードの入力が不要となります。
このキャッシュはCIなどの自動化処理で役に立つでしょう。
パスワードの解除のみ行いたい場合はUnlock-SecretStore
を使うことが可能です。
Unlock-SecretStore -Password <SecureString型のパスワード>
補足2. 認証情報の型について
上記の例では単純に文字列の情報を登録しましたが、PowerShell Secrets Managementの使用としては認証情報に以下の型のデータが登録可能です。
- string
- byte[]
- SecureString
- PSCredential
- Hashtable
# Set-Secretでは文字列以外のデータも登録可能
C:\> Set-Secret -Name adminInfo -Secret @{ UserName = "admin"; Password = "P@ssword" }
# Get-Secretで参照するとこんな感じ
C:\> Get-Secret -Name adminInfo -AsPlainText
Name Value
---- -----
Password P@ssword
UserName admin
5. 認証情報の削除
認証情報を削除する場合はRemove-Secret
を使います。
仕様なのかバグなのかちょっとわからないのですが、削除の場合は対象となる認証情報ストア(-Vault
)を明示する必要があります。
Remove-Secret -Name MySecret -Vault SecretStore
最後に
以上となります。
PowerShell Teamのブログでは本記事で紹介した内容以外にAzure Key Vaultでの実行例や独自の認証情報ストア向け拡張の作り方にも触れているので、詳細に興味のある方はご覧いただくと良いでしょう。
Microsoft.PowerShell.SecretManagementを拡張するためのルールは別に存在します ↩︎