使用 Key Vault 和 Azure PowerShell 管理儲存體帳戶金鑰 (舊版)

重要

Key Vault 受控儲存體帳戶金鑰 (舊版) 會依現狀支援,且不會再規劃任何更新。 只有帳戶 SAS 支援 SAS 定義簽署的儲存體服務版本 (2018-03-28 以前的版本)。

重要

建議使用 Azure 儲存體與 Microsoft Entra ID 整合,這是 Microsoft 的雲端式身分識別和存取管理服務。 Microsoft Entra 整合適用於 Azure Blob 和佇列,並提供對 Azure 儲存體的 OAuth2 權杖型存取 (如同 Azure Key Vault)。 Microsoft Entra ID 可讓您使用應用程式或使用者身分識別來驗證用戶端應用程式,而非使用儲存體帳戶認證。 在 Azure 上執行時,可以使用 Microsoft Entra 受控識別。 受控識別能移除用戶端驗證,以及使用應用程式儲存認證或將認證儲存於應用程式中的需求。 只有在無法進行 Microsoft Entra 驗證時,才使用此解決方案。

Azure 儲存體帳戶會使用由帳戶名稱和金鑰組成的認證。 該金鑰是由系統自動產生,並作為密碼使用,比單純的密碼編譯金鑰具有更多功能。 Key Vault 會在儲存體帳戶中定期重新產生儲存體帳戶金鑰,並提供共用存取簽章權杖,以便委派存取您儲存體帳戶中的資源。

您可以使用 Key Vault 受控儲存體帳戶金鑰功能列出 (同步) 金鑰與 Azure 儲存體帳戶,以及定期重新產生 (輪替) 金鑰。 您可以管理儲存體帳戶和傳統儲存體帳戶的金鑰。

使用受控儲存體帳戶金鑰功能時,請考慮以下幾點:

  • 系統永遠不會傳回金鑰值以回應呼叫者。
  • 只能允許 Key Vault 管理您的儲存體帳戶金鑰。 請勿自行管理金鑰,並避免干擾 Key Vault 程序。
  • 只有單一 Key Vault 物件方能管理儲存體帳戶金鑰。 不允許從多個物件進行金鑰管理。
  • 只能使用 Key Vault 重新產生金鑰。 不要手動重新產生儲存體帳戶金鑰。

重要

直接在儲存體帳戶中重新產生金鑰會中斷受管理的儲存體帳戶設定,且可能會讓使用中的 SAS 權杖失效,並導致中斷。

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

服務主體的應用程式識別碼

Microsoft Entra 租用戶會為每個已註冊的應用程式提供一個服務主體。 服務主體會作為應用程式識別碼,在授權設定期間用來透過 Azure RBAC 存取其他 Azure 資源。

Key Vault 是 Microsoft 應用程式,已在所有 Microsoft Entra 租用戶中預先註冊。 Key Vault 會在每個 Azure 雲端中的相同應用程式識別碼下註冊。

租用戶 雲端 Application ID
Microsoft Entra ID Azure Government 7e7c393b-45d0-48b1-a35e-2905ddf8183c
Microsoft Entra ID Azure 公用 cfa8b339-82a2-471a-a3c9-0fc0be7a4093
其他 任意 cfa8b339-82a2-471a-a3c9-0fc0be7a4093

必要條件

若要完成本指南,您必須:

管理儲存體帳戶金鑰

連線至您的 Azure 帳戶

使用 Connect-AzAccount Cmdlet 來驗證您的 PowerShell 工作階段。

Connect-AzAccount

如果您有多個 Azure 訂用帳戶,可以使用 Get-AzSubscription Cmdlet 列出,並使用 Set-AzContext Cmdlet 指定要使用的訂用帳戶。

Set-AzContext -SubscriptionId <subscriptionId>

設定變數

首先,在下列步驟中設定 PowerShell Cmdlet 所要使用的變數。 請務必更新 "YourResourceGroupName", "YourStorageAccountName", and "YourKeyVaultName" 預留位置,並將 $keyVaultSpAppId 設定為 cfa8b339-82a2-471a-a3c9-0fc0be7a4093 (如服務主體應用程式識別碼中所指定)。

我們也會使用 Azure PowerShell Get-AzContextGet-AzStorageAccount Cmdlet 取得您的使用者識別碼和 Azure 儲存體帳戶的內容。

$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

注意

對於傳統儲存體帳戶,請針對 $storageAccountKey 使用「主要」和「次要」
針對傳統儲存體帳戶,請使用 'Get-AzResource -Name "ClassicStorageAccountName" -ResourceGroupName $resourceGroupName',而不要使用 'Get-AzStorageAccount'

對儲存體帳戶提供 Key Vault 存取權

在 Key Vault 可以存取並管理您的儲存體帳戶金鑰之前,您必須為它授權以存取您的儲存體帳戶。 Key Vault 應用程式需要「列出」及「重新產生」儲存體帳戶金鑰的使用權限。 這些使用權限是透過 Azure 內建的角色儲存體帳戶金鑰操作員服務角色來啟用。

使用 Azure PowerShell New-AzRoleAssignment Cmdlet,將此角色指派給 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 入口網站中該儲存體帳戶的 [存取控制 (IAM)] 頁面來驗證角色指派。

將使用者帳戶使用權限授與受控儲存體帳戶

使用 Azure PowerShell Set-AzKeyVaultAccessPolicy Cmdlet 來更新 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 入口網站中的 [存取原則] 頁面上提供。

將受控儲存體帳戶新增到您的 Key Vault 執行個體

使用 Azure PowerShell Add-AzKeyVaultManagedStorageAccoun Cmdlet,在您的 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 Cmdlet 來設定重新產生期間。 在此範例中,我們會設定為期 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                :

共用存取簽章權杖

您也可以要求 Key Vault 產生共用存取簽章權杖。 共用存取簽章可提供您儲存體帳戶中資源的委派存取。 您可以對用戶端授與儲存體帳戶中資源的存取權,而不必共用帳戶金鑰。 共用存取簽章可讓您安全地共用儲存體資源,而不會將帳戶金鑰外洩。

本節中的命令會完成下列動作:

  • 設定帳戶共用存取簽章定義。
  • 在保存庫中設定 Key Vault 受控儲存體共用存取簽章定義。 定義具有已建立的共用存取簽章權杖的範本 URI。 定義的共用存取簽章類型為 account,且有效期為 N 天。
  • 確認已將共用存取簽章儲存在金鑰保存庫中作為祕密。

設定變數

首先,在下列步驟中設定 PowerShell Cmdlet 所要使用的變數。 請務必更新 <YourStorageAccountName> 與 <YourKeyVaultName> 預留位置。

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

定義共用存取簽章定義範本

Key Vault 會使用 SAS 定義範本來產生用戶端應用程式的權杖。

SAS 定義範本範例:

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

金鑰保存庫的 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 中設定共用存取簽章定義

使用 Azure PowerShell Set-AzKeyVaultManagedStorageSasDefinition Cmdlet 來建立共用存取簽章定義。 您可以將選擇的名稱提供給 -Name 參數。

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

驗證共用存取簽章定義

您可以使用 Azure PowerShell Get-AzKeyVaultSecret 命令,確認共用存取簽章定義已儲存在金鑰保存庫中。

首先,在金鑰保存庫中尋找共用存取簽章定義。

Get-AzKeyVaultSecret -VaultName <YourKeyVaultName>

對應至您 SAS 定義的祕密將具有下列屬性:

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

您現在可以使用 Get-AzKeyVaultSecret Cmdlet 和 VaultName 以及 Name 屬性來檢視祕密的內容。

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

此命令的輸出會顯示您的 SAS 定義字串。

下一步