在 Azure 角色型存取控制 (Azure RBAC) 中,若要授與存取 Azure 資源的權利,您必須指派 Azure 角色。 例如,如果使用者需要在訂用帳戶中建立及管理網站,您可以指派網站參與者角色。
指派 Azure 角色以授與 Azure 資源的權利是常見的工作。 身為系統管理員,您可能會收到數個要求,以授與您想要委派給其他人的存取權。 不過,您需要確定委派只有執行其工作所需的權限。 本文說明將角色指派管理委派給貴組織中其他使用者更安全的方式。
為什麼要委派角色指派管理?
以下是您可能需要將角色指派管理委派給其他人的一些原因:
- 您會收到數個在貴組織中指派角色的要求。
- 使用者會遭封鎖,無法等候所需的角色指派。
- 各自部門、小組或專案內的使用者更清楚知道需要存取權的人員。
- 使用者具有建立 Azure 資源的權限,但需要額外的角色指派才能完整使用該資源。 例如:
- 具有建立虛擬機器權限的使用者,在沒有虛擬機器系統管理員登入或虛擬機器使用者登入角色的情況下,無法立即登入虛擬機器。 如果使用者可以將登入角色指派給自己,而不是追蹤系統管理員來為其指派登入角色,則會更有效率。
- 開發人員有權限可建立 Azure Kubernetes Service (AKS) 叢集和 Azure Container Registry (ACR),但必須將 AcrPull 角色指派給受控識別,以便從 ACR 提取映像。 如果開發人員可以將角色指派給自己,而不是追蹤系統管理員來指派 AcrPull 角色,則會更有效率。
您目前委派角色指派管理的方式
擁有者和使用者存取系統管理員角色為內建角色,可讓使用者建立角色指派。 這些角色的成員可以決定能擁有訂用帳戶中任何資源寫入、讀取及刪除權限的人員。 若要將角色指派管理委派給其他使用者,您可以將擁有者或使用者存取系統管理員角色指派給使用者。
下圖顯示 Alice 如何將角色指派責任委派給 Dara。 如需特定步驟,請參閱將使用者指派為 Azure 訂用帳戶的管理員。
- Alice 會將使用者存取系統管理員角色指派給 Dara。
- Dara 現在可以將任何角色指派給相同範圍中的任何使用者、群組或服務主體。
圖表顯示 Dara 可以將任何角色指派給任何使用者的範例。
目前委派方法的問題為何?
以下是目前將角色指派管理委派給貴組織中其他人所用方法的主要問題。
- 委派在角色指派範圍中具有不受限制的存取權。 這違反了最低權限原則,如此會讓您面臨更廣泛的攻擊面。
- 委派可以將任何角色指派給其範圍內的任何使用者,包括其本身。
- 委派可以將擁有者或使用者存取系統管理員角色指派給其他使用者,然後可將角色指派給其他使用者。
屏除指派擁有者或使用者存取系統管理員角色,更安全的方法是限制代理人建立角色指派的能力。
更安全的方法:有條件地委派角色指派管理
有條件地委派角色指派管理這個方法能限制使用者可以建立的角色指派。 在上述範例中,Alice 可以允許 Dara 代表她建立一些角色指派,但並非建立所有角色指派。 例如,Alice 可以限制 Dara 能夠指派的角色,並限制 Dara 能夠指派角色的主體。 這種有條件的委派有時稱為限制委派,並使用 Azure 屬性型存取控制 (Azure ABAC) 條件來實作。
這段影片提供有條件地委派角色指派管理的概觀。
為何要有條件地委派角色指派管理?
以下這些原因說明為何有條件地將角色指派管理委派給其他人會較為安全:
- 您可以限制允許委派建立的角色指派。
- 您可以使委派無法允許其他使用者指派角色。
- 您可以強制執行貴組織最低權限原則的合規性。
- 您不必將完整權限授與服務帳戶,即可將 Azure 資源的管理自動化。
條件範例
假設 Alice 是系統管理員,且具有訂用帳戶的使用者存取管理員角色。 Alice 想要授與 Dara 為特定群組指派特定角色的能力。 Alice 不希望 Dara 擁有任何其他角色指派權限。 下圖顯示 Alice 如何有條件地將角色指派責任委派給 Dara。
- Alice 會將角色型存取控制管理員角色指派給 Dara。 Alice 新增條件,使 Dara 只能將備份參與者或備份讀取者角色指派給行銷與銷售群組。
- Dara 現在可將備份參與者或備份讀取者角色指派給行銷與銷售群組。
- 如果 Dara 嘗試指派其他角色,或將任何角色指派給不同的主體 (例如使用者或受控識別),角色指派就會失敗。
圖表顯示的範例中,Dara 只能將備份參與者或備份讀取者角色指派給行銷與銷售群組。
角色型存取控制管理員角色
角色型存取控制系統管理員角色是內建角色,旨在將角色指派管理委派給其他人。 其權限少於使用者存取系統管理員 (遵循最低權限最佳做法)。 角色型存取控制管理員角色具有下列權限:
- 建立指定範圍的角色指派
- 刪除指定範圍內的角色指派
- 讀取密碼以外的所有類型的資源
- 建立和更新支援票證
限制角色指派的方式
以下是可以有條件地限制角色指派的方式。 您也可以結合這些條件來符合您的案例。
有條件地委派角色指派管理的方式
若要有條件地委派角色指派管理,您可以如同目前方式指派角色,但也要將條件新增至角色指派。
判斷委派所需的權限
- 委派可以指派哪些角色?
- 委派可將角色指派給哪些類型?
- 委派可將角色指派給哪些主體?
- 委派是否可以移除任何角色指派?
開始新的角色指派
選取角色型存取控制管理員角色
您可以選取包含 Microsoft.Authorization/roleAssignments/write 動作的任何角色,但角色型存取控制系統管理員的權限較少。
選取委派
選取您要委派角色指派管理的使用者。
新增條件
您可以利用多種方式新增條件。 例如,您可以在 Azure 入口網站中使用條件範本,這是 Azure 入口網站、Azure PowerShell、Azure CLI、Bicep 或 REST API 中的進階條件編輯器。
New-AzRoleAssignment
$roleDefinitionId = "f58310d9-a9f6-439a-9e8d-f62e7b41a168"
$principalId = "<principalId>"
$scope = "/subscriptions/<subscriptionId>"
$condition = "((!(ActionMatches{'Microsoft.Authorization/roleAssignments/write'})) OR (@Request[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {5e467623-bb1f-42f4-a55d-6e525e11384b, a795c7a0-d4a2-40c1-ae25-d81f01202912} AND @Request[Microsoft.Authorization/roleAssignments:PrincipalType] ForAnyOfAnyValues:StringEqualsIgnoreCase {'User'})) AND ((!(ActionMatches{'Microsoft.Authorization/roleAssignments/delete'})) OR (@Resource[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {5e467623-bb1f-42f4-a55d-6e525e11384b, a795c7a0-d4a2-40c1-ae25-d81f01202912} AND @Resource[Microsoft.Authorization/roleAssignments:PrincipalType] ForAnyOfAnyValues:StringEqualsIgnoreCase {'User'}))"
$conditionVersion = "2.0"
New-AzRoleAssignment -ObjectId $principalId -Scope $scope -RoleDefinitionId $roleDefinitionId -Condition $condition -ConditionVersion $conditionVersion
az role assignment create
set roleDefinitionId="f58310d9-a9f6-439a-9e8d-f62e7b41a168"
set principalId="{principalId}"
set principalType="User"
set scope="/subscriptions/{subscriptionId}"
set condition="((!(ActionMatches{'Microsoft.Authorization/roleAssignments/write'})) OR (@Request[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {5e467623-bb1f-42f4-a55d-6e525e11384b, a795c7a0-d4a2-40c1-ae25-d81f01202912} AND @Request[Microsoft.Authorization/roleAssignments:PrincipalType] ForAnyOfAnyValues:StringEqualsIgnoreCase {'User'})) AND ((!(ActionMatches{'Microsoft.Authorization/roleAssignments/delete'})) OR (@Resource[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {5e467623-bb1f-42f4-a55d-6e525e11384b, a795c7a0-d4a2-40c1-ae25-d81f01202912} AND @Resource[Microsoft.Authorization/roleAssignments:PrincipalType] ForAnyOfAnyValues:StringEqualsIgnoreCase {'User'}))"
set conditionVersion="2.0"
az role assignment create --assignee-object-id %principalId% --assignee-principal-type %principalType% --scope %scope% --role %roleDefinitionId% --condition %condition% --condition-version %conditionVersion%
param roleDefinitionResourceId string
param principalId string
param condition string
targetScope = 'subscription'
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
name: guid(subscription().id, principalId, roleDefinitionResourceId)
properties: {
roleDefinitionId: roleDefinitionResourceId
principalId: principalId
principalType: 'User'
condition: condition
conditionVersion:'2.0'
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"roleDefinitionResourceId": {
"value": "providers/Microsoft.Authorization/roleDefinitions/f58310d9-a9f6-439a-9e8d-f62e7b41a168"
},
"principalId": {
"value": "{principalId}"
},
"condition": {
"value": "((!(ActionMatches{'Microsoft.Authorization/roleAssignments/write'})) OR (@Request[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {5e467623-bb1f-42f4-a55d-6e525e11384b, a795c7a0-d4a2-40c1-ae25-d81f01202912} AND @Request[Microsoft.Authorization/roleAssignments:PrincipalType] ForAnyOfAnyValues:StringEqualsIgnoreCase {'User'})) AND ((!(ActionMatches{'Microsoft.Authorization/roleAssignments/delete'})) OR (@Resource[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {5e467623-bb1f-42f4-a55d-6e525e11384b, a795c7a0-d4a2-40c1-ae25-d81f01202912} AND @Resource[Microsoft.Authorization/roleAssignments:PrincipalType] ForAnyOfAnyValues:StringEqualsIgnoreCase {'User'}))"
}
}
}
角色指派 - 建立
PUT https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleAssignments/f58310d9-a9f6-439a-9e8d-f62e7b41a168?api-version=2020-04-01-Preview
{
"properties": {
"roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/f58310d9-a9f6-439a-9e8d-f62e7b41a168",
"principalId": "{principalId}",
"condition": "((!(ActionMatches{'Microsoft.Authorization/roleAssignments/write'})) OR (@Request[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {5e467623-bb1f-42f4-a55d-6e525e11384b, a795c7a0-d4a2-40c1-ae25-d81f01202912} AND @Request[Microsoft.Authorization/roleAssignments:PrincipalType] ForAnyOfAnyValues:StringEqualsIgnoreCase {'User'})) AND ((!(ActionMatches{'Microsoft.Authorization/roleAssignments/delete'})) OR (@Resource[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {5e467623-bb1f-42f4-a55d-6e525e11384b, a795c7a0-d4a2-40c1-ae25-d81f01202912} AND @Resource[Microsoft.Authorization/roleAssignments:PrincipalType] ForAnyOfAnyValues:StringEqualsIgnoreCase {'User'}))",
"conditionVersion": "2.0"
}
}
有條件地將角色指派給委派
指定條件之後,請完成角色指派。
連絡委派
讓委派得知其現在可以有條件地指派角色。
有條件的內建角色
Key Vault 資料存取系統管理員和虛擬機器資料存取系統管理員 (預覽版) 角色已經有內建條件可限制角色指派。
Key Vault 資料存取系統管理員角色可讓您管理 Key Vault 秘密、憑證和金鑰的存取權。 其專屬著重於存取控制,無法指派特殊權限角色,例如擁有者或使用者存取系統管理員角色。 其可針對跨資料服務管理待用加密等案例進一步區分職責,以進一步遵守最低權限原則。 條件會將角色指派限制為下列 Azure Key Vault 角色:
受限於 Key Vault 角色的角色指派圖表。
如果您要進一步限制 Key Vault 資料存取管理員角色指派,您可以新增自己的條件來限制可以指派 Key Vault 角色的主體類型 (使用者、群組或服務主體) 或特定主體。
受限於 Key Vault 角色和使用者主體類型的角色指派圖表。
已知問題
以下是有條件地委派角色指派管理的已知問題:
授權需求
這項功能可免費使用,且包含在您的 Azure 訂用帳戶中。
下一步