deploy-a-managed-storage-account-in-microsoft-azure

Microsoft Azure でマネージドストレージアカウントを展開する

Microsoft Azure でマネージドストレージアカウントを展開する

Microsoft がマネージドストレージアカウントと呼んでいるストレージアカウントを作成する方法を紹介します。ご存知かもしれませんが、各ストレージアカウントには、汎用ストレージアカウントの4つのサービスに対してプログラムで認証するために使用できる2つの交換可能な秘密キーがあります。

  • blob
  • file
  • table
  • queue

図1は私の ipstorage704 汎用 v2 ストレージアカウントですが、これはマネージドでないストレージアカウントです。つまり、Azure が管理するのではなく、これら2つの秘密キーを自分で管理することになります。

figure01

図1:マネージドでない Azure ストレージアカウント

キーの再生成とローテーションを忘れた場合、もしくは、さらに悪いことに、ソースコードにプレーンテキストキーを残した場合などはまさしく、Azure データのセキュリティ侵害を求めるようなものです。

 

では、マネージドストレージアカウントとはどういうものでしょうか?

マネージドストレージアカウントは、セキュリティが Azure によって管理される汎用ストレージアカウントです。次の2つの目的があります。

  • 2つのアクセスキーを Azure Key Vault に保存する
  • キーを定期的に再生成するよう Azure に指示する

この演習用に Azure 環境をセットアップするには、次の3つのタスクを実行する必要があります。

Azure ポータルでは現在この機能を使用できないため、Azure PowerShell または Azure コマンドラインインタフェース(CLI)を使用してプログラムでマネージドストレージアカウントを定義する必要があります。コードは、「Key Vault と Azure PowerShell を使用してストレージアカウントキーを管理する」というタイトルの Microsoft Azure の記事を参照しました。では始めましょう。

Azure PowerShell 環境をセットアップ

PowerShell コンソール、または Visual Studio Code インスタンスを起動し、Azure サブスクリプションに対して認証します。

Connect-AzAccount

複数の Azure サブスクリプションがある場合、デフォルトのコンテキストを指定する必要があります。

Set-AzContext -SubscriptionName 'MySub'

次に、ストレージアカウントと Key Vault を簡単に参照できるよう、変数を定義します。自分で試す場合は、筆者用の値を自分の値に置き換える必要があることに注意してください。

$resourceGroupName = "ipswitch"

$storageAccountName = "ipstorage704"

$storageAccountKey = "aUQBMQFMnnk2fBNsv2K49mqW31Vc0nHjMDGJm4HAZId+5PgBYfKbrZMippBaTGjlGOsg+EovpVYKwhBCIT0eSA=="

$keyVaultName = "ipswitch-keyvault"

$keyVaultSpAppId = "cfa8b339-82a2-471a-a3c9-0fc0be7a4093"

上記のコードに関する注意事項:

  • ストレージアカウントのアクセスキーブレードから Azure ポータルでストレージアカウントキー ($storageAccountKey) を取得できます(図1を参照)。key1 を使用するか key2 を使用するかは関係ありません。
  • Azure Key Vault のアプリケーション ID ($keyVaultSpAppId) は固定されており、マイクロソフトから提供されます。Azure パブリッククラウドの場合、上記の値を使用します。 

また、ユーザー ID を取得し、ターゲットのストレージアカウントのリファレンスを獲得する必要があります。

$userId = (Get-AzContext).Account.Id

$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccountName

Key Vault によるストレージアカウントキー管理

Azure のロールベース・アクセスコントロール(RBAC)の、「Storage Account Key Operator Service Role」というロールを、最小特権アクセス(範囲をストレージアカウントに限定)で、Key Vault に割り当てます。これで、Key Vault は、ストレージアカウントキーのみを管理し、他の Key Vault シークレットまたはリソースは管理できません。

New-AzRoleAssignment -ApplicationId $keyVaultSpAppId -RoleDefinitionName 'Storage Account Key Operator Service Role' -Scope $storageAccount.Id

図2を見ると、Key Vault に適切なRBACのロールが正しいスコープで割り当てられていることがわかります。

figure02

図2:Key Vault はストレージアカウントのスコープでアクセス可能

Azure Key Vaultは、ユーザーまたはサービスプリンシパルに、Azure Key Vault シークレットへの特定のアクセス許可を付与するのに、アクセスポリシーを使用します。ユーザーIDにプリンシパルのアクセス許可を付与する必要があります。

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

図3に、Key Vault アクセス許可の Azure ポータルのビューを示します。

figure03

図3:ユーザーアカウントは Key Vault シークレットへのフルコントロールを所有

設定を完了

最後に、ターゲットのストレージアカウントを Key Vault のマネージドストレージアカウントのリストに追加します。

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

上記のコードに関する注意事項:

  • ActiveKeyName パラメータの値は、値自体ではなく、キーの文字列名 ‘key1’(または ‘key2’)であることに注意してください。
  • DisableAutoRegenerateKey スイッチパラメータは、Key Vault がキーを定期的に再生成しないように指示するものです。

もし、Key Vault で、たとえば90日間ごとに再生成するように設定したい場合は、まず、再生成期間の変数を次のように設定します。

$regenerationPeriod = [System.Timespan]::FromDays(90)

そして、-DisableAutoRegenerateKey スイッチの代わりに、次のパラメータ/値のペアで置き換えます。

-RegenerationPeriod $regenerationPeriod

エラーの場合に備えて、プランB

Add-AzKeyVaultManagedStorageAccount を実行すると、「BadRequest」エラーが表示される場合があります。これは、既知の問題で、少なくとも1つの GitHub バグレポートが存在します。

このエラーが発生しても、すべてが失われるわけではありません。Azure Cloud Shell を開いて、サブスクリプションに対して認証を行い、次の Azure CLI コマンドを、リソース名と ID を自分のものに置き換えて実行してください。

az keyvault storage add --vault-name ipswitch-keyvault -n ipstorage704 --active-key-name key1 --auto-regenerate-key --regeneration-period P90D --resource-id "/subscriptions/2fbf906e-1101-4bc0-b64f-adc44e462fff/resourceGroups/ipswitch/providers/Microsoft.Storage/storageAccounts/ipstorage704"

上記のコードは筆者のシステムで正常に完了しました。ここでは、90日間のキー再生成期間を指定していることに注意してください。

信頼しても検証

残念ながら、Azure ポータルには、Key Vault にもストレージアカウントにも、マネージドストレージアカウントに関する情報がまったく表示されません。ですが、Get-AzKeyVaultManagedStorageAccount を実行すれば検証できます。

Get-AzKeyVaultManagedStorageAccount -VaultName 'ipswitch-keyvault' -Name 'ipstorage704'

Id                  : https://ipswitch-keyvault.vault.azure.net:443/storage/ipstorage704

Vault Name          : ipswitch-keyvault

AccountName         : ipstorage704

Account Resource Id : /subscriptions/2fbf906e-1101-4bc0-b64f-adc44e462fff/resourceGroups/ipswitch/providers/Microsoft.Storage/
storageAccounts/ipstorage704

Active Key Name     : key1

Auto Regenerate Key : True

Regeneration Period : 90.00:00:00

Enabled             : True

Created             : 9/30/19 8:25:18 PM

Updated             : 9/30/19 8:25:18 PM

Tags                :

これで確認できました。マネージドストレージアカウントを作成する手順は非常にやっかいで面倒ですが、ストレージアカウントのアクセスキーを手作業で管理する必要がないというメリットは面倒さを凌ぐものがあるので、設定する価値はあると思います。

関連ブログ


Comments
Comments are disabled in preview mode.
Loading animation