Key Vault と Azure PowerShell を使用したストレージ アカウント キーの管理 (レガシ)

重要

Key Vault マネージド ストレージ アカウント キー (レガシ) は、現状のままサポートされ、今後の更新は予定されていません。 2018 年 3 月 28 日以降の SAS 定義署名ストレージ サービス バージョンでは、アカウント SAS のみがサポートされます。

重要

Azure Storage と Microsoft Entra ID の統合 (Microsoft のクラウドベースの ID およびアクセス管理サービス) を使用することをお勧めします。 Microsoft Entra 統合は Azure BLOB およびキューで利用できます。また、Azure Key Vault と同様に、Azure Storage へのトークンベースの OAuth2 アクセスが提供されます。 Microsoft Entra ID では、ストレージ アカウントの資格情報ではなく、アプリケーションまたはユーザーの ID を使用してクライアント アプリケーションを認証することができます。 Azure で実行するときは、Microsoft Entra マネージド ID を使用できます。 マネージド ID を使用すると、クライアント認証やアプリケーションでの資格情報の保存が不要になります。 Microsoft Entra 認証が不可能な場合にのみ、このソリューションを使ってください。

Azure ストレージ アカウントでは、アカウント名とキーで構成された資格情報が使用されます。 キーは自動生成され、暗号キーではなくパスワードとして機能します。 Key Vault では、ストレージ アカウントでストレージ アカウント キーを定期的に再生成することでそのようなキーの管理が行われることに加え、ストレージ アカウント内のリソースへの委任アクセス用の Shared Access Signature トークンが提供されます。

Key Vault マネージド ストレージ アカウント キー機能を使用して、Azure ストレージ アカウントのキーを一覧表示し (同期)、定期的にキーを再生成 (ローテーション) できます。 ストレージ アカウントと従来のストレージ アカウントの両方のキーを管理できます。

マネージド ストレージ アカウント キー機能を使用する場合は、次の点を考慮してください。

  • キーの値は、呼び出し元への応答で返されることはありません。
  • ストレージ アカウント キーの管理は Key Vault のみが行う必要があります。 キーを自分で管理したり、Key Vault のプロセスに干渉したりしないでください。
  • ストレージ アカウント キーの管理は、1 つの Key Vault オブジェクトのみが行う必要があります。 複数のオブジェクトからのキー管理を許可しないでください。
  • キーの再生成は、Key Vault のみを使用して行います。 ストレージ アカウント キーを手動で再生成しないでください。

重要

ストレージ アカウントでキーを直接再生成すると、管理対象ストレージ アカウントのセットアップが中断され、使用中の SAS トークンが無効になり、障害を引き起こす可能性があります。

Note

Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、Azure PowerShell のインストールに関する記事を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

サービス プリンシパルのアプリケーション ID

Microsoft Entra テナントは、登録されている各アプリケーションにサービス プリンシパルを提供します。 サービス プリンシパルはアプリケーション ID として機能し、Azure RBAC を介した他の Azure リソースへのアクセスに対する承認のセットアップ時に使用されます。

Key Vault は、すべての Microsoft Entra テナントに事前登録されている Microsoft アプリケーションです。 Key Vault は、各 Azure クラウド内に同じアプリケーション ID で登録されています。

テナント クラウド アプリケーション ID
Microsoft Entra ID Azure Government 7e7c393b-45d0-48b1-a35e-2905ddf8183c
Microsoft Entra ID Azure Public cfa8b339-82a2-471a-a3c9-0fc0be7a4093
その他 Any cfa8b339-82a2-471a-a3c9-0fc0be7a4093

前提条件

このガイドを完了するには、まず次の手順を実行する必要があります。

ストレージ アカウント キーを管理する

Azure アカウントに接続する

Connect-AzAccount コマンドレットを使用して PowerShell セッションを認証します。

Connect-AzAccount

複数の Azure サブスクリプションを持っている場合は、Get-AzSubscription コマンドレットを使用してそれらを一覧表示し、Set-AzContext コマンドレットで使用するサブスクリプションを指定できます。

Set-AzContext -SubscriptionId <subscriptionId>

変数の設定

まず、次の手順で、PowerShell コマンドレットによって使用される変数を設定します。 プレースホルダー "YourResourceGroupName"、"YourStorageAccountName"、"YourKeyVaultName" を更新し、cfa8b339-82a2-471a-a3c9-0fc0be7a4093 に $keyVaultSpAppId を設定します (「サービス プリンシパルのアプリケーション ID」で指定)。

Azure ストレージ アカウントのユーザー ID とコンテキストを取得するために、Azure PowerShell の Get-AzContext および Get-AzStorageAccount コマンドレットも使います。

$resourceGroupName = <YourResourceGroupName>
$storageAccountName = <YourStorageAccountName>
$keyVaultName = <YourKeyVaultName>
$keyVaultSpAppId = "cfa8b339-82a2-471a-a3c9-0fc0be7a4093"
$storageAccountKey = "key1" #(key1 or key2 are allowed)

# Get your User Id
$userId = (Get-AzContext).Account.Id

# Get a reference to your Azure storage account
$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccountName

Note

従来のストレージ アカウントの場合、$storageAccountKey には、"primary" と "secondary" を使用します。
従来のストレージ アカウント用の "Get-AzStorageAccount" ではなく、"Get-AzResource -Name "ClassicStorageAccountName" -ResourceGroupName $resourceGroupName" を使用してください。

Key Vault にストレージ アカウントへのアクセス権を付与する

Key Vault からストレージ アカウント キーにアクセスして管理できるようにするには、ストレージ アカウントへのアクセスを承認する必要があります。 Key Vault アプリケーションでは、ストレージ アカウントのキーを "一覧表示" し "再生成" するアクセス許可が必要です。 このようなアクセス許可は、Azure 組み込みロールであるストレージ アカウント キー オペレーターのサービス ロールで有効になります。

Azure PowerShell の New-AzRoleAssignment コマンドレットを使用して、このロールを Key Vault サービス プリンシパルに割り当て、範囲をそのストレージ アカウントに限定します。

# Assign Azure role "Storage Account Key Operator Service Role" to Key Vault, limiting the access scope to your storage account. For a classic storage account, use "Classic Storage Account Key Operator Service Role."
New-AzRoleAssignment -ApplicationId $keyVaultSpAppId -RoleDefinitionName 'Storage Account Key Operator Service Role' -Scope $storageAccount.Id

ロールの割り当てが成功すると、次のような出力が表示されます。

RoleAssignmentId   : /subscriptions/03f0blll-ce69-483a-a092-d06ea46dfb8z/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso/providers/Microsoft.Authorization/roleAssignments/189cblll-12fb-406e-8699-4eef8b2b9ecz
Scope              : /subscriptions/03f0blll-ce69-483a-a092-d06ea46dfb8z/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso
DisplayName        : Azure Key Vault
SignInName         :
RoleDefinitionName : storage account Key Operator Service Role
RoleDefinitionId   : 81a9662b-bebf-436f-a333-f67b29880f12
ObjectId           : 93c27d83-f79b-4cb2-8dd4-4aa716542e74
ObjectType         : ServicePrincipal
CanDelegate        : False

Key Vault が既にストレージ アカウントのロールに追加されている場合は、"ロールの割り当ては既に存在します" エラーを受け取ります。 Azure portal でストレージ アカウントの [アクセス制御 (IAM)] ページを使用して、ロールの割り当てを確認することもできます。

マネージド ストレージ アカウントにユーザー アカウントのアクセス許可を与える

Azure PowerShell の Set-AzKeyVaultAccessPolicy コマンドレットを使用して、Key Vault アクセス ポリシーを更新し、ストレージ アカウントのアクセス許可をユーザー アカウントに付与します。

# Give your user principal access to all storage account permissions, on your Key Vault instance

Set-AzKeyVaultAccessPolicy -VaultName $keyVaultName -UserPrincipalName $userId -PermissionsToStorage get, list, delete, set, update, regeneratekey, getsas, listsas, deletesas, setsas, recover, backup, restore, purge

ストレージ アカウントのアクセス許可は、Azure portal のストレージ アカウントの [アクセス ポリシー] ページでは使用できません。

Key Vault インスタンスにマネージド ストレージ アカウントを追加する

Azure PowerShell の Add-AzKeyVaultManagedStorageAccount コマンドレットを使用して、Key Vault インスタンスにマネージド ストレージ アカウントを作成します。 -DisableAutoRegenerateKey スイッチには、ストレージ アカウント キーを再生成しないことを指定します。

# Add your storage account to your Key Vault's managed storage accounts

Add-AzKeyVaultManagedStorageAccount -VaultName $keyVaultName -AccountName $storageAccountName -AccountResourceId $storageAccount.Id -ActiveKeyName $storageAccountKey -DisableAutoRegenerateKey

キーの再生成を行わないストレージ アカウントの追加に成功すると、次の例のような出力が表示されます。

Id                  : https://kvcontoso.vault.azure.net:443/storage/sacontoso
Vault Name          : kvcontoso
AccountName         : sacontoso
Account Resource Id : /subscriptions/03f0blll-ce69-483a-a092-d06ea46dfb8z/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso
Active Key Name     : key1
Auto Regenerate Key : False
Regeneration Period : 90.00:00:00
Enabled             : True
Created             : 11/19/2018 11:54:47 PM
Updated             : 11/19/2018 11:54:47 PM
Tags                :

キーの再生成を有効にする

Key Vault でストレージ アカウント キーを定期的に再生成する場合は、Azure PowerShell の Add-AzKeyVaultManagedStorageAccount コマンドレットを使用して、再生成期間を設定できます。 この例では、30 日間の再生成期間を設定します。 ローテーションする時間になると、Key Vault はアクティブでないキーを再生成し、新しく作成されたキーをアクティブとして設定します。 SAS トークンの発行に使われるキーはアクティブなキーです。

$regenPeriod = [System.Timespan]::FromDays(30)

Add-AzKeyVaultManagedStorageAccount -VaultName $keyVaultName -AccountName $storageAccountName -AccountResourceId $storageAccount.Id -ActiveKeyName $storageAccountKey -RegenerationPeriod $regenPeriod

キーの再生成を行うストレージ アカウントの追加に成功すると、次の例のような出力が表示されます。

Id                  : https://kvcontoso.vault.azure.net:443/storage/sacontoso
Vault Name          : kvcontoso
AccountName         : sacontoso
Account Resource Id : /subscriptions/03f0blll-ce69-483a-a092-d06ea46dfb8z/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso
Active Key Name     : key1
Auto Regenerate Key : True
Regeneration Period : 30.00:00:00
Enabled             : True
Created             : 11/19/2018 11:54:47 PM
Updated             : 11/19/2018 11:54:47 PM
Tags                :

Shared Access Signature トークン

Shared Access Signature トークンを生成するように Key Vault に指示することもできます。 Shared Access Signature を使用すると、ストレージ アカウント内のリソースへの委任アクセスが可能になります。 アカウント キーを共有することなく、ストレージ アカウント内のリソースへのアクセス権をクライアントに付与できます。 Shared Access Signature により、アカウント キーを侵害されることなくストレージ リソースを安全に共有することができます。

このセクションのコマンドは、次の操作を実行します。

  • アカウントの Shared Access Signature 定義を設定します。
  • Key Vault マネージド ストレージの Shared Access Signature 定義をコンテナーに設定します。 この定義には、作成された Sared Access Signature トークンのテンプレート URI があります。 この定義は、Shared Access Signature の種類 account を持っており、N 日間有効です。
  • Shared Access Signature がキー コンテナーにシークレットとして保存されていることを確認します。

変数の設定

まず、次の手順で、PowerShell コマンドレットによって使用される変数を設定します。 プレースホルダー <YourStorageAccountName> と <YourKeyVaultName> を更新してください。

$storageAccountName = <YourStorageAccountName>
$keyVaultName = <YourKeyVaultName>

共有アクセス署名定義テンプレートを定義する

Key Vault は、SAS 定義テンプレートを使用して、クライアント アプリケーションのトークンを生成します。

SAS 定義テンプレートの例:

$sasTemplate="sv=2018-03-28&ss=bfqt&srt=sco&sp=rw&spr=https"

Key Vault の SAS 定義テンプレートで必要なアカウント SAS パラメーター

SAS クエリ パラメーター 説明
SignedVersion (sv) 必須。 このアカウント SAS で行われる要求を承認するために使用する署名付きストレージ サービスのバージョンを指定します。 バージョン 2015-04-05 以降に設定する必要があります。 Key Vault では、2018-03-28 までのバージョンがサポートされます
SignedServices (ss) 必須。 アカウント SAS でアクセス可能な署名付きサービスを指定します。 次の値を指定できます。

- BLOB (b)
- キュー (q)
- テーブル (t)
- ファイル (f)

値を組み合わせて、複数のサービスへのアクセスを提供できます。 たとえば、ss=bf は BLOB エンドポイントとファイル エンドポイントへのアクセスを指定します。
SignedResourceTypes (srt) 必須。 アカウント SAS でアクセスできる署名付きリソース タイプを指定します。

- サービス (s): サービス レベル API へのアクセス ("たとえば"、サービス プロパティの取得/設定、サービス統計の取得、コンテナー/キュー/テーブル/共有のリストなど)
- コンテナー (c): コンテナー レベル API へのアクセス("たとえば"、コンテナーの作成/削除、キューの作成/削除、テーブルの作成/削除、共有の作成/削除、BLOB/ファイルとディレクトリのリストなど)
- オブジェクト (o): BLOB、キュー メッセージ、テーブル エンティティ、ファイル用のオブジェクト レベル API へのアクセス ("たとえば"、BLOB の配置、エンティティの照会、メッセージの取得、ファイルの作成など)

値を組み合わせて、複数のリソース タイプへのアクセスを提供できます。 たとえば、srt=sc は、サービス リソースとコンテナー リソースへのアクセスを指定します。
SignedPermission (sp) 必須。 アカウント SAS の署名付きアクセス許可を指定します。 アクセス許可は、指定された署名付きリソースの種類と一致する場合にのみ有効です。それ以外の場合は無視されます。

- 読み取り (r): すべての署名付きリソースの種類 (サービス、コンテナー、オブジェクト) に有効です。 指定されたリソース タイプに対する読み取りアクセス許可を付与します。
- 書き込み (w): すべての署名付きリソース タイプ (サービス、コンテナー、オブジェクト) に有効です。 指定されたリソース タイプに対する書き込みアクセス許可を付与します。
- 削除 (d): キュー メッセージを除く、コンテナーおよびオブジェクト リソース タイプに有効です。
- 永久削除 (y): BLOB オブジェクト リソース タイプに対してのみ有効です。
- リスト (l): サービスおよびコンテナー リソース タイプに対してのみ有効です。
- 追加 (a): 次のオブジェクト リソース タイプに対してのみ有効です: キュー メッセージ、テーブル エンティティ、追加 BLOB。
- 作成 (c): 次のオブジェクト リソース タイプに対してのみ有効です: BLOB とファイル。 ユーザーは新しい BLOB またはファイルを作成できますが、既存の BLOB またはファイルを上書きすることはできません。
- 更新 (u): 次のオブジェクト リソース タイプに対してのみ有効です: キュー メッセージとテーブル エンティティ。
- プロセス (p): 次のオブジェクト リソース タイプに対してのみ有効です: キュー メッセージ。
- タグ (t): 次のオブジェクト リソース タイプに対してのみ有効です: BLOB。 BLOB タグ操作を許可します。
- フィルター (f): 次のオブジェクト リソース タイプに対してのみ有効です: BLOB。 BLOB タグによるフィルター処理を許可します。
- 不変ポリシーの設定 (i): 次のオブジェクト リソース タイプに対してのみ有効です: BLOB。 BLOB の不変性ポリシーと訴訟ホールドの設定/削除を許可します。
SignedProtocol (spr) 任意。 アカウント SAS で行われる要求に対して許可するプロトコルを指定します。 使用可能な値は、HTTPS と HTTP の両方 (https,http) または HTTPS のみ (https) です。 既定値は https,http です。

HTTP のみの値は許可されません。

アカウント SAS の詳細については、「アカウント SAS を作成する」を参照してください

注意

Key Vault は、'Signed Expiry'、'Signed Start' などの有効期間パラメーターや、2018-03-28 バージョン以降に導入されたパラメーターを無視します

Key Vault で Shared Access Signature 定義を設定する

Azure PowerShell の Set-AzKeyVaultManagedStorageSasDefinition コマンドレットを使って、Shared Access Signature 定義を作成します。 -Name パラメーターには任意の名前を指定できます。

Set-AzKeyVaultManagedStorageSasDefinition -AccountName $storageAccountName -VaultName $keyVaultName -Name <YourSASDefinitionName> -TemplateUri $sasTemplate -SasType 'account' -ValidityPeriod ([System.Timespan]::FromDays(1))

Shared Access Signature 定義の検証

Shared Access Signature 定義がキー コンテナーに格納されていることを確認するには、Azure PowerShell の Get-AzKeyVaultSecret コマンドレットを使用します。

最初に、キー コンテナーで Shared Access Signature 定義を見つけます。

Get-AzKeyVaultSecret -VaultName <YourKeyVaultName>

SAS 定義に対応するシークレットには、次のプロパティがあります。

Vault Name   : <YourKeyVaultName>
Name         : <SecretName>
...
Content Type : application/vnd.ms-sastoken-storage
Tags         :

Get-AzKeyVaultSecret コマンドレットと、VaultName および Name プロパティを使用して、そのシークレットの内容を表示できます。

$secretValueText = Get-AzKeyVaultSecret -VaultName <YourKeyVaultName> -Name <SecretName> -AsPlainText
Write-Output $secretValueText

このコマンドの出力で SAS 定義文字列が表示されます。

次のステップ