PowerShellの認証情報の安全な管理(Azure Key Vaultとの連携)

ITシステムの自動化やスクリプト運用を行う上で、パスワードやAPIキーなどの認証情報を安全に管理することは非常に重要です。

しかし、PowerShellのスクリプト内にこれらの情報をハードコードしてしまうと、情報漏洩のリスクが高まります。

本記事では、Azure Key VaultとPowerShellを活用して、認証情報を安全に管理する方法を解説します。


Azure Key Vaultとは?

Azure Key Vaultは、Microsoft Azureが提供するシークレット管理サービスです。

APIキーやパスワード、証明書などの機密情報を安全に保管し、必要なときだけアクセスする仕組みを提供します。

主な特徴は次の通りです:

  • 情報の暗号化:Azureの管理するHSM(ハードウェア セキュリティ モジュール)で暗号化
  • アクセス制御:Azure Active Directory (Azure AD)を使ったアクセス管理
  • 監査ログ:アクセスログが保存され、監査やトラブルシューティングに活用可能

Azure Key Vaultを利用することで、アプリケーションやスクリプトに認証情報を直接書かず、セキュリティを高めることができます。


PowerShellとAzure Key Vaultの連携

ここでは、PowerShellを使ってAzure Key Vaultに保管したシークレット(認証情報)にアクセスする具体的な手順を紹介します。

必要な事前準備

  1. Azureアカウントの作成:Azureのサブスクリプションが必要です。まだ持っていない場合は、Azure公式サイトから無料アカウントを作成してください。
  2. Azure Key Vaultの作成:以下のコマンドをPowerShellで実行し、Key Vaultを作成します。

Key Vaultの作成スクリプト

# Azureにログイン
Connect-AzAccount

# リソースグループの作成
$resourceGroupName = "MyResourceGroup"
$location = "JapanEast"
New-AzResourceGroup -Name $resourceGroupName -Location $location

# Key Vaultの作成
$keyVaultName = "MySecureVault"
New-AzKeyVault -VaultName $keyVaultName -ResourceGroupName $resourceGroupName -Location $location

Key Vaultへのシークレットの保存

次に、Key Vaultに認証情報(例:APIキーやパスワード)を保存します。

シークレットの保存スクリプト

# シークレットの保存
$secretName = "MyApiSecret"
$secretValue = "SuperSecretAPIKey123"
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretName -SecretValue $secretValue

PowerShellでシークレットを取得する

以下のスクリプトで、Key Vaultに保存されたシークレットを取得し、変数に格納します。

シークレットの取得スクリプト

# シークレットの取得
$retrievedSecret = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretName

# シークレットの値を表示(実際の運用では表示しないことが推奨)
Write-Output $retrievedSecret.SecretValueText

シークレットの利用例

取得したシークレットを使って、APIへの認証を行う例です。

API認証のスクリプト例

# シークレットを取得して変数に格納
$apiKey = (Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretName).SecretValueText

# APIリクエストの例
$headers = @{ "Authorization" = "Bearer $apiKey" }
$response = Invoke-RestMethod -Uri "https://exampleapi.com/data" -Method Get -Headers $headers

# レスポンスの表示
Write-Output $response

演習問題:PowerShellを使ったKey Vaultの活用

問題1:シークレットの新規保存

  1. リソースグループ「TestResourceGroup」にKey Vault「TestVault」を作成してください。
  2. 「TestVault」に「TestSecret」という名前で「Password123」という値を持つシークレットを保存してください。

問題2:取得したシークレットの利用

  1. 「TestVault」から「TestSecret」の値を取得し、変数に格納してください。
  2. その変数の値を使って、任意のHTTPリクエストのヘッダーに設定し、GETリクエストを送信するスクリプトを書いてください。

演習問題の解答例

解答例1:シークレットの新規保存

# リソースグループの作成
New-AzResourceGroup -Name "TestResourceGroup" -Location "JapanEast"

# Key Vaultの作成
New-AzKeyVault -VaultName "TestVault" -ResourceGroupName "TestResourceGroup" -Location "JapanEast"

# シークレットの保存
Set-AzKeyVaultSecret -VaultName "TestVault" -Name "TestSecret" -SecretValue "Password123"

解答例2:取得したシークレットの利用

# シークレットの取得
$testSecret = (Get-AzKeyVaultSecret -VaultName "TestVault" -Name "TestSecret").SecretValueText

# 取得したシークレットを使ってAPIリクエストのヘッダーを設定
$headers = @{ "Authorization" = "Bearer $testSecret" }
$response = Invoke-RestMethod -Uri "https://exampleapi.com/test" -Method Get -Headers $headers

# レスポンスの表示
Write-Output $response

まとめ

PowerShellとAzure Key Vaultを組み合わせることで、認証情報を安全に管理しながらスクリプトを実行することが可能です。

スクリプト内にパスワードやAPIキーをハードコードすることはセキュリティリスクを高めますが、Key Vaultを使用することでそのリスクを最小限に抑えられます。

Azure Key VaultとPowerShellを活用することで、次のようなメリットがあります:

  • セキュアな認証情報管理:暗号化された環境で管理できる
  • アクセス制御の強化:Azure ADと連携したアクセス管理が可能
  • 拡張性:大規模なシステムにも対応できる

ぜひ、本記事の内容を実践し、システムのセキュリティ向上に役立ててください。