PowerShellの新しい認証情報管理(PowerShell Secrets Management)がGAしました

2021.03.27

しばたです。

以前お伝えしたPowerShellの新しい認証情報管理機能(PowerShell Secrets Management)が先日ついにVer.1.0.0となり正式リリースされました。

PowerShell Teamからのアナウンスはこちらになります。

本記事ではこのモジュールについて解説して実際に試していきます。

機能の概要

このモジュールは最初PowerShell 7のマイルストーンのひとつとして複数の認証情報ストアへのアクセスを統一的に行う方法を提供する事を目的に開発が始まりました。
その後8回のプレビューリリースを経て今回の正式リリースに至っています。

この機能は以下の2つのモジュールから構成されており、それぞれ認証情報へのアクセス機能とデフォルトの認証情報ストア(Vault)の役割を担っています。

Microsoft.PowerShell.SecretStoreについては開発の途中でMicrosoft.PowerShell.SecretManagementから分離される形となり、また、その実装もWindowsの資格情報マネージャーを使う形から独自ファイルに暗号化した認証情報を保存する形に変更されています。
加えて認証情報ストアは拡張可能で、PowerShell Teamのブログでは以下のツールやサービス向けのモジュールが紹介されていました。

※上記モジュールは公式のものではなく有志のOSSがほとんどです

PowerShell Galleryを検索すると他サービス向けのもの結構ある様です。
(AWS向けのも作っている人を見た覚えがあるのですが見つけることができませんでした...)

利用者向けの機能はそこまで多くないので、ここからは実際に試しながら機能の説明をしていきます。

試してみた

それでは早速試していきます。
このモジュールはPowerShell 5.1以降の環境で利用可能です。

今回は私の開発環境である、

  • 64bit版 Windows 10 Pro (Ver.20H2)
  • PowerShell 7.1.3

を検証環境とします。

1. インストール

モジュールのインストールはInstall-Moduleから行います。
Microsoft.PowerShell.SecretManagementMicrosoft.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での実行例や独自の認証情報ストア向け拡張の作り方にも触れているので、詳細に興味のある方はご覧いただくと良いでしょう。

脚注

  1. Microsoft.PowerShell.SecretManagementを拡張するためのルールは別に存在します