Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShell SecretManagementモジュールでパスワードとシークレットを安全に管理する方法

Microsoftは、PowerShellスクリプト内で保存済みのパスワード(シークレット)を安全に保管・利用できる便利なSecretManagementモジュールを提供しています。このモジュールは2つのコンポーネントで構成されています。1つは既定のパスワードストアとなるSecretStoreボールト、もう1つは各種パスワードボールトへアクセスするためのエンジンであるSecretManagementです。

組み込みのSecretStoreボールトに加えて、KeePass、LastPass、HashiCorp Vault、Azure Key Vault、Bitwarden、Windows資格情報マネージャーなどのサードパーティ製シークレットボールトにも対応しています。SecretManagementを利用すれば、任意のパスワード(資格情報)をシークレットボールトに保存し、必要なときにいつでも取り出せます。ライセンスキーやアクセスキーなど、その他の機密情報の保存も可能です(HashtableByteStringSecureStringPSCredentialオブジェクト型をサポート)。

この記事では、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

注意: マスターパスワードを忘れると、ボールトに保存されたデータへアクセスできなくなります。

既定では、以下の設定によって誰がどのようにパスワードストアへアクセスできるかが決まります。

  • ScopeCurrentUser(現在のユーザーのみがSecretStoreにアクセス可能)
  • AuthenticationPassword(マスターパスワードによる認証でアクセス)
  • PasswordTimeout900秒:マスターパスワードの再入力が不要になるセッション時間。Set-SecretStoreConfiguration -PasswordTimeout 1200で延長できます
  • InteractionPrompt(変更操作時にマスターパスワードの入力を求めるかどうか)

シークレットボールトへのアクセス時にマスターパスワードを要求しない設定も可能ですが(推奨されません)、その場合は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から統一的に操作できます。スクリプト内にパスワードをハードコーディングする危険な運用から脱却し、安全で効率的な資格情報管理を実現しましょう。

  1. Microsoft Edgeで保存されたパスワードを表示・管理する方法

    Microsoftは競合に対抗し、比類のないユーザー体験を提供するために、Edgeブラウザーへ新機能を継続的に追加しています。他のブラウザーと同様に、Microsoft Edgeでも保存されたパスワードを表示・管理することが可能です。ログインが必要なサイトを訪れると、Edgeは「次回ログイン時にこのサイトのパスワードを記憶しますか?」と尋ねてきます。 Edgeをメインブラウザーとして使っている場合、通常はブラウザーがパスワード欄を自動入力してくれますが、特定のサイトのパスワードを直接確認したい場面もあります。例えば、別のデバイスで同じサイトにアクセスするために、保存済みのパスワードを見る必要

  2. 1つの保管庫で複数のパスワードを識別・ロック・管理する方法|TweakPass活用ガイド

    オンラインニュースサイトの簡単なログインパスワードであっても、銀行口座やクレジットカードに関わる重要な情報であっても、認証情報は常に安全に管理すべき大切なデータです。認証情報は「ユーザー名」と「パスワード」の2つの要素で構成されており、パスワードはユーザーの裁量で自由に選択・保存できます。これはメリットに思えますが、裏を返せば、誰でも推測できる単純なパスワードを選んでしまうリスクにもつながります。本記事では、安全なパスワード管理アプリとして定評のある「TweakPass」を使って、複数のパスワードをロックし、効率的に管理する方法をご紹介します。 TweakPassで複数のパスワードをロック・管