使用 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 PowerShell 模組。
- 建立金鑰保存庫
- 建立 Azure 儲存體帳戶。 儲存體帳戶名稱必須只能使用小寫字母和數字。 名稱長度必須介於 3 到 24 個字元之間。
管理儲存體帳戶金鑰
連線至您的 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-AzContext 和 Get-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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000000
Scope : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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 : aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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 定義字串。