我們建議使用Azure 儲存體與 Microsoft Entra ID、Microsoft 雲端式身分識別和存取管理服務整合。 Microsoft Entra 整合適用于 Azure Blob 和佇列 ,並提供 OAuth2 權杖型存取Azure 儲存體(就像 Azure 金鑰保存庫一樣)。 Microsoft Entra ID 可讓您使用應用程式或使用者身分識別來驗證用戶端應用程式,而不是儲存體帳號憑證。 您可以在 Azure 上執行時使用 Microsoft Entra 受控識別 。 受控識別會移除用戶端驗證和將認證儲存在應用程式或應用程式中的需求。 只有在無法進行 Microsoft Entra 驗證時,才使用此解決方案。

Azure 儲存體帳戶會使用包含帳戶名稱和金鑰的認證。 金鑰會自動產生,並做為密碼,而不是作為密碼編譯金鑰。 金鑰保存庫藉由定期在儲存體帳戶中重新產生金鑰來管理儲存體帳戶金鑰,並提供共用存取簽章權杖,以委派存取儲存體帳戶中的資源。

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

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

  • 索引鍵值永遠不會傳回,以回應呼叫端。
  • 只有金鑰保存庫才能管理儲存體帳戶金鑰。 請勿自行管理金鑰,並避免干擾金鑰保存庫程式。
  • 只有單一金鑰保存庫物件應該管理儲存體帳戶金鑰。 不允許來自多個物件的金鑰管理。
  • 僅使用金鑰保存庫重新產生金鑰。 請勿手動重新產生儲存體帳戶金鑰。
  • 直接在儲存體帳戶中重新產生金鑰會中斷受控儲存體帳戶設定,並會使使用中的 SAS 權杖失效,並造成中斷。

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

    服務主體應用程式識別碼

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

    金鑰保存庫是已在所有 Microsoft Entra 租使用者中預先註冊的 Microsoft 應用程式。 金鑰保存庫會在每個 Azure 雲端的相同應用程式識別碼下註冊。

    Application ID
  • 安裝 Azure PowerShell 模組
  • 建立金鑰保存庫
  • 建立 Azure 儲存體帳戶。 儲存體帳戶名稱只能使用小寫字母和數位。 名稱的長度必須介於 3 到 24 個字元之間。
  • 管理儲存體帳戶金鑰

    連線至您的 Azure 帳戶

    使用 連線-AzAccount Cmdlet 驗證 PowerShell 會話。

    Connect-AzAccount
    

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

    Set-AzContext -SubscriptionId <subscriptionId>
    

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

    我們也會使用 Azure PowerShell Get-AzCoNtext Get-Az儲存體Account 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 「Classic儲存體AccountName」 -ResourceGroupName $resourceGroupName' 而不是 'Get-Az儲存體Account'

    授與金鑰保存庫儲存體帳戶的存取權

    在金鑰保存庫可以存取和管理儲存體帳戶金鑰之前,您必須授權其存取儲存體帳戶。 金鑰保存庫應用程式需要許可權,才能 列出 重新產生 儲存體帳戶的金鑰。 這些許可權是透過 Azure 內建角色 來啟用,儲存體帳戶金鑰操作員服務角色

    使用 Azure PowerShell New-AzRoleAssignment Cmdlet,將此角色指派給金鑰保存庫服務主體,限制儲存體帳戶的範圍。

    # 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
    

    如果金鑰保存庫已新增至儲存體帳戶上的角色,您會收到「 角色指派已經存在」。 錯誤。 您也可以使用Azure 入口網站中的儲存體帳戶「存取控制(IAM)」頁面來驗證角色指派。

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

    使用 Azure PowerShell Set-AzKeyVaultAccessPolicy Cmdlet 來更新金鑰保存庫存取原則,並將儲存體帳戶許可權授與使用者帳戶。

    # 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 入口網站的儲存體帳戶 [存取原則] 頁面上取得。

    將受控儲存體帳戶新增至您的金鑰保存庫實例

    使用 Azure PowerShell Add-AzKeyVaultManaged儲存體Account Cmdlet 在您的 金鑰保存庫 實例中建立受控儲存體帳戶。 參數 -DisableAutoRegenerateKey 會指定 NOT 來重新產生儲存體帳戶金鑰。

    # 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                :
    

    啟用金鑰重新產生

    如果您想要金鑰保存庫定期重新產生儲存體帳戶金鑰,您可以使用 Azure PowerShell Add-AzKeyVaultManaged儲存體Account Cmdlet 來設定重新產生期間。 在此範例中,我們會設定 30 天的重新產生期間。 輪替時,金鑰保存庫重新產生非作用中的金鑰,然後將新建立的金鑰設定為作用中。 用來發出 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                :
    

    共用存取簽章權杖

    您也可以要求金鑰保存庫產生共用存取簽章權杖。 共用存取簽章提供儲存體帳戶中資源的委派存取權。 您可以授與用戶端存取儲存體帳戶中的資源,而不需共用您的帳戶金鑰。 共用存取簽章可讓您安全地共用儲存體資源,而不會影響您的帳戶金鑰。

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

  • 設定帳戶共用存取簽章定義。
  • 在保存庫中設定金鑰保存庫受控儲存體共用存取簽章定義。 定義具有已建立之共用存取簽章權杖的範本 URI。 定義具有共用存取簽章類型 account ,且有效期為 N 天。
  • 確認共用存取簽章已儲存在您的金鑰保存庫中做為秘密。
  • 首先,在下列步驟中設定 PowerShell Cmdlet 要使用的變數。 請務必更新 < Your儲存體AccountName > 和 < YourKeyVaultName > 預留位置。

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

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

    金鑰保存庫使用 SAS 定義範本來產生用戶端應用程式的權杖。

    SAS 定義範本範例:

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

    金鑰保存庫 SAS 定義範本中所需的帳戶 SAS 參數

    SAS 查詢參數 SignedVersion (sv) 必要。 指定用來授權使用此帳戶 SAS 提出要求之已簽署的儲存體服務版本。 必須設定為 2015-04-05 版或更新版本。 金鑰保存庫支援 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 ):適用于所有已簽署的資源類型 (Service、Container 和 Object)。 允許指定之資源類型的讀取權限。
    - 寫入 ( w ): 適用于所有已簽署的資源類型 (Service、Container 和 Object)。 允許指定之資源類型的寫入權限。
    - 刪除 ( 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

    金鑰保存庫忽略存留期參數,例如 'Signed Expiry'、'Signed Start' 和 2018-03-28 版本之後引進的參數

    在 金鑰保存庫 中設定共用存取簽章定義

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

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

    確認共用存取簽章定義

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

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

    Get-AzKeyVaultSecret -VaultName <YourKeyVaultName>
    

    對應至 SAS 定義的秘密會有下列屬性:

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

    您現在可以搭配 和 VaultNameName 參數使用 Get-AzKeyVaultSecret Cmdlet 來檢視該秘密的內容。

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

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

  • 受控儲存體帳戶金鑰範例
  • Key Vault PowerShell 參考
  •