使用 Bicep 建立 Azure RBAC 資源
Azure 有一個強大的角色型存取控制 (RBAC) 系統。 如需有關 Azure RBAC 的詳細資訊,請參閱什麼是 Azure 角色型存取控制 (Azure RBAC)?(部分機器翻譯)。藉由使用 Bicep,您可以利用程式設計方式定義您的 RBAC 角色指派和角色定義。
角色指派
角色指派可讓您授與主體 (例如使用者、群組或服務主體) 對於特定 Azure 資源的存取權。
若要定義角色指派,請建立具有類型Microsoft.Authorization/roleAssignments
的資源。 角色定義具有多個屬性,包括範圍、名稱、角色定義識別碼、主體識別碼以及主體類型。
範圍
角色指派適用於特定範圍,其會定義您要授與存取權的資源或資源集。 如需詳細資訊,請參閱了解 Azure RBAC 的範圍。
角色指派是延伸資源,這表示其會套用至另一個資源。 下列範例示範如何建立儲存體帳戶,以及範圍限定於該儲存體帳戶的角色指派:
param location string = resourceGroup().location
param storageAccountName string = 'stor${uniqueString(resourceGroup().id)}'
param storageSkuName string = 'Standard_LRS'
param roleDefinitionResourceId string
param principalId string
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
kind: 'StorageV2'
sku: {
name: storageSkuName
}
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
scope: storageAccount
name: guid(storageAccount.id, principalId, roleDefinitionResourceId)
properties: {
roleDefinitionId: roleDefinitionResourceId
principalId: principalId
principalType: 'ServicePrincipal'
}
}
如果您未明確指定範圍,Bicep 會使用檔案的 targetScope
。 在下列範例中,沒有指定任何 scope
屬性,因此角色指派的範圍是訂用帳戶:
param roleDefinitionResourceId string
param principalId string
targetScope = 'subscription'
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(subscription().id, principalId, roleDefinitionResourceId)
properties: {
roleDefinitionId: roleDefinitionResourceId
principalId: principalId
principalType: 'ServicePrincipal'
}
}
提示
使用符合您需求所需的最小範圍。
例如,如果您需要授與受控識別存取權給單一儲存體帳戶,好的安全性作法是在儲存體帳戶範圍建立角色指派,而不是資源群組或訂用帳戶範圍。
名稱
角色指派的資源名稱必須是全域唯一識別碼 (GUID)。
Microsoft Entra 租用戶內的角色指派資源名稱必須是唯一的,即使範圍較狹窄也一樣。
若要讓 Bicep 部署可重複,請務必確定名稱是否具確定性,換句話說,每次您進行部署時都要使用相同的名稱。 最好建立一個使用範圍、主體識別碼和角色識別碼的 GUID。 使用 guid()
函數可協助您替角色指派名稱建立具確定性的 GUID 為適當的作法,如下列範例所示:
name: guid(subscription().id, principalId, roleDefinitionResourceId)
角色定義識別碼
您指派的角色可以是內建角色定義或自訂角色定義。 若要使用內建角色定義,請尋找適當的角色定義識別碼。 例如,參與者角色具有 b24988ac-6180-42a0-ab88-20f7382dd24c
的角色定義識別碼。
建立角色指派資源時,必須指定完整的資源識別碼。 內建角色定義識別碼為訂用帳戶範圍的資源。 使用 existing
資源來參考內建角色,以及使用 .id
屬性存取其完整資源識別碼是很好的作法:
param principalId string
@description('This is the built-in Contributor role. See https://docs.microsoft.com/azure/role-based-access-control/built-in-roles#contributor')
resource contributorRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
scope: subscription()
name: 'b24988ac-6180-42a0-ab88-20f7382dd24c'
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(resourceGroup().id, principalId, contributorRoleDefinition.id)
properties: {
roleDefinitionId: contributorRoleDefinition.id
principalId: principalId
principalType: 'ServicePrincipal'
}
}
主體
principalId
屬性必須設定為代表主體 Microsoft Entra 識別碼的 GUID。 在 Microsoft Entra ID 中,這有時候稱為「物件識別碼」。
principalType
屬性會指定主體為使用者、群組或服務主體。 受控身分識別是一種服務主體形式。
提示
在 Bicep 中建立角色指派時,請務必設定 principalType
屬性。 否則您可能會收到間歇性的部署錯誤,尤其是當您使用服務主體和受控身分識別時。
下列範例示範如何建立使用者指派的受控身分識別和角色指派:
param location string = resourceGroup().location
param roleDefinitionResourceId string
var managedIdentityName = 'MyManagedIdentity'
resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
name: managedIdentityName
location: location
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(resourceGroup().id, managedIdentity.id, roleDefinitionResourceId)
properties: {
roleDefinitionId: roleDefinitionResourceId
principalId: managedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
刪除資源行為
當您從 Microsoft Entra ID 刪除使用者、群組、服務主體或受控識別時,刪除任何角色指派是個良好的習慣做法。 角色指派不會自動刪除。
任何參考已刪除主體識別碼的角色指派都會失效。 如果您嘗試將角色指派的名稱重複用於另一個角色指派,部署將會失敗。 若要因應這個行為,您應該先移除舊的角色指派再重新建立,或確定您在部署新的角色指派時使用唯一名稱。 本快速入門範本說明如何在 Bicep 模組中定義角色指派,並使用主體識別碼作為角色指派名稱的種子值。
自訂角色定義
自訂角色定義可讓您定義一組存取權限,可以接著使用角色指派,指派給主體。 如需角色定義的詳細資訊,請參閱了解 Azure 角色定義。
若要建立自訂角色定義,請定義類型 Microsoft.Authorization/roleDefinitions
的資源。 如需範例,請參閱透過訂用帳戶層級部署建立新的角色定義的快速入門。
Microsoft Entra 租用戶內的角色定義資源名稱必須是唯一的,即使可指派的範圍較窄也一樣。
注意
有些服務會管理自己的角色定義和指派。 例如,Azure Cosmos DB 會維護自有的 Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments
及 Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions
資源。 如需詳細資訊,請參閱特定服務的文件。
相關資源
- 資源文件
- 延伸模組資源
- 範圍
- 快速入門範本
- 社群部落格文章
- 使用 Bicep 建立不同範圍的角色指派,作者:Barbara Forbes