Azure 監視器中的角色、權限與安全性

本文會說明如何套用角色型存取控制 (RBAC) 監視角色來授與或限制存取權,並討論 Azure 監視器相關資源的安全性考量。

內建的監視角色

Azure 角色基礎存取控制(Azure RBAC)內建監控角色,可指派給使用者、群組、服務主體及受管理身份。 最常見的角色是 監控讀者(Monitoring Reader )和監控貢獻者( Monitoring Contributor ),分別負責讀取和寫入權限。 指派角色時,請指定角色指派的範圍。 您可以在訂用帳戶、資源群組或資源層級指派角色。 範圍越廣,角色指派所套用的資源越多。 在適當的範圍內指派角色,限制只存取使用者所需的資源。

如需監視角色的詳細資訊,請參閱 RBAC 監視角色

監控讀者與監控貢獻者

監控貢獻者是監控讀取器的超集。 下表將簡要比較這兩個角色。 完整功能清單請參見以下章節。

Capability 監視讀取器 觀察參與者
查看監控數據、儀表板、指標與警示 是的 是的
查詢活動日誌與 Log Analytics 工作區資料 是的 是的
檢視診斷設定、自動縮放設定及 Application Insights 資料 是的 是的
建立私人監控儀表板 No 是的
建立與編輯診斷設定 No 1
設定警報規則與警報設定 No 是的
列出 Log Analytics 工作區的共用金鑰 No 是的
建立、刪除及執行已儲存的搜尋 No 是的
建立應用程式洞察的網頁測試與元件 No 是的

1ListKeys 的先決條件: 建立或編輯一個診斷設定,將資料傳送到儲存帳號或串流到事件樞紐,除了監控貢獻者角色外,還需要對目標資源(儲存帳號或事件中心命名空間)取得 ListKeys 權限。 在資源或資源群組範圍內授予 ListKeys ,絕不在訂閱範圍內,讓只需監控存取權限的使用者使用。 詳情請參見 監控資料的安全考量

這兩個角色都不會授予對串流到事件集線器或儲存帳號中的日誌資料的讀取權限。 要設定對該資料的存取,請參閱 監控資料的安全考量

監視讀取器

受指派監視讀者角色的人員可以檢視訂閱中所有的監視資料,但無法修改任何資源或編輯與監視資源相關的任何設定。 這個職務適合於組織中的成員,例如支援或作業工程師,這些人員需要執行以下任務︰

  • 在Azure 入口網站中檢視監視儀表板。
  • 檢視 Azure 警示中定義的警示規則。
  • 使用 Azure 監視器 REST APIPowerShell cmdletsAzure CLI 查詢 Azure 監視器 Metrics。
  • 透過入口網站、Azure 監視器 REST API、PowerShell cmdlets 或 Azure CLI 查詢活動日誌。
  • 檢視用於資源的 診斷設定
  • 檢視用於訂用帳戶的 記錄檔設定檔 。 日誌設定檔是舊有的功能,用於路由活動日誌。 不要在它們上建立新的依賴。
  • 檢視自動調整設定。
  • 檢視警示活動和設定。
  • 搜尋 Log Analytics 工作區資料,包括工作區的使用狀況資料。
  • 擷取 Log Analytics 工作區中的資料表結構描述。
  • 在 Log Analytics 工作區中擷取和執行記錄查詢。
  • 存取 Application Insights 資料。

觀察參與者

受指派監視參與者角色的人員可以檢視訂閱中所有的監視資料。 他們也可以建立或修改監視設定,但無法修改任何其他資源。

此角色是監視讀取者角色的超集, 此角色適用於組織的監視團隊成員,或受管理的服務提供者;且除了上述權限外,這些對象必須:

  • 在入口網站中檢視監視儀表板,並建立自己的私人監視儀表板。
  • 建立和編輯資源的診斷設定。 建立或編輯診斷設定也需要 ListKeys 的先決條件
  • 透過 Azure 警示設定警示規則活動和設定。
  • 列出 Log Analytics 工作區的共用金鑰。
  • 建立、刪除並執行 Log Analytics 工作區中已儲存的搜尋。
  • 建立及刪除 Log Analytics 工作區儲存體設定。
  • 為 Application Insights 建立 web 測試和元件。

監視權限和 Azure 自訂角色

如果內建的角色無法滿足團隊需求,請建立一個帶有細緻權限Azure 自訂角色

例如,使用細緻權限,利用以下 PowerShell 腳本建立 Azure 活動日誌閱讀器的自訂角色。

$role = Get-AzRoleDefinition "Reader"
$role.Id = $null
$role.Name = "Activity Log Reader"
$role.Description = "Can view activity logs."
$role.Actions.Clear()
$role.Actions.Add("Microsoft.Insights/eventtypes/*")
$role.AssignableScopes.Clear()
$role.AssignableScopes.Add("/subscriptions/<SubscriptionId>")
New-AzRoleDefinition -Role $role 

存取資源的警示、診斷設定及指標,需讀取該資源的資源類型與範圍。 建立一個診斷設定,將資料傳送到儲存帳號或串流到事件中心,也需要 ListKeys 的先決條件

指派角色

如需指派角色,請參閱使用 Azure PowerShell 指派 Azure 角色

例如,下列 PowerShell 指令碼會將角色指派給指定的使用者。

<RoleId> 取代為您想要指派的 RBAC 監視角色識別碼。

<SubscriptionID><ResourceGroupName><UserPrincipalName> 取代為您環境適用的值。

# Define variables
$SubscriptionId = "<SubscriptionID>"
$ResourceGroupName = "<ResourceGroupName>"
$UserPrincipalName = "<UserPrincipalName>"  # The UPN of the user to whom you want to assign the role
$RoleId = "<RoleId>"  # The ID of the role

# Get the user object
$User = Get-AzADUser -UserPrincipalName $UserPrincipalName

# Define the scope (e.g., subscription or resource group level)
$Scope = "/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName"

# Assign the role
New-AzRoleAssignment -ObjectId $User.Id -RoleDefinitionId $RoleId -Scope $Scope

若要改用 portal,請參考「使用 Azure portal 指派 Azure 角色」。

這很重要

  • 要指派角色,你需要擁有角色基礎存取控制管理員(Leader)、基於角色的存取控制管理員(Role Based 存取控制 Administrator)、使用者存取管理員(User Access Administrator)角色,或是擁有Microsoft.Authorization/roleAssignments/write目標範圍權限的自訂角色。
  • 在訂閱、資源群組或資源範圍分配存取權限。 選擇最符合你需求的範圍。

用於判斷角色成員資格的 PowerShell 查詢

產生屬於指定角色的使用者清單會很有幫助。 為了協助產生這些類型的清單,您可以調整下列範例查詢來符合自己的特定需求。

查詢整個訂用帳戶以尋找系統管理員角色 + 參與者角色

-IncludeClassicAdministrators參數和經典ServiceAdministratorCoAdministrator角色都是傳承。 Azure 於 2024 年 8 月退休了經典管理員角色,因此此查詢通常不會回傳經典管理員條目。 它只保留在仍與這些角色相關的環境。

(Get-AzRoleAssignment -IncludeClassicAdministrators | Where-Object {$_.RoleDefinitionName -in @('ServiceAdministrator', 'CoAdministrator', 'Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "

在特定 Application Insights 資源的範圍中查詢,以尋找擁有者與參與者

$resourceGroup = "ResourceGroupName"
$resourceName = "AppInsightsName"
$resourceType = "microsoft.insights/components"
(Get-AzRoleAssignment -ResourceGroup $resourceGroup -ResourceType $resourceType -ResourceName $resourceName | Where-Object {$_.RoleDefinitionName -in @('Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "

在特定資源群組的範圍中查詢,以尋找擁有者與參與者

$resourceGroup = "ResourceGroupName"
(Get-AzRoleAssignment -ResourceGroup $resourceGroup | Where-Object {$_.RoleDefinitionName -in @('Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "

監視資料的安全性考量

Azure 監視器中的資料都可以傳送至儲存體帳戶或串流到事件中樞,兩者都是一般用途的 Azure 資源。 它們是一般用途的資源,因此建立、刪除及存取這些資源是保留給系統管理員的特殊權限作業。 由於此資料可以包含 IP 位址或使用者名稱等敏感性資訊,因此請使用下列做法來監視相關資源,以防止誤用:

  • 針對監視資料使用單一、專用的儲存體帳戶。 如果您需要將監視數據分成多個記憶體帳戶,則記憶體帳戶應該只用於監視數據。 如果監視資料和其他類型的資料共用同一個儲存體帳戶,您可能會不小心將其他資料的存取權授與只應存取監視資料的組織。 例如,非 Microsoft 的組織在安全性資訊和事件管理方面應該只需要存取監視資料。
  • 以上述相同的原因在所有的診斷設定中使用單一、專用的服務匯流排或事件中樞命名空間。
  • 透過將監視相關的儲存體帳戶或事件中心保存在不同的資源群組中來限制其存取。 在監視角色上使用範圍,以限制只能存取該資源群組。
  • 當使用者只需要存取監視資料時,您絕不應該在訂用帳戶範圍內授與儲存體帳戶或事件中樞的 ListKeys 權限。 反之,對資源或資源群組 (如果您有專用的監視資源群組) 範圍內的使用者授與這些權限。

當使用者或應用程式須存取儲存體帳戶中的監視資料時,請針對包含監視資料的儲存體帳戶 (具有 Blob 儲存體服務層級的唯讀存取權) 產生共用存取簽章 (SAS)。 在 PowerShell 中,帳戶的 SAS 可能類似下列程式碼:

$context = New-AzStorageContext -ConnectionString "[connection string for your monitoring Storage Account]"
$token = New-AzStorageAccountSASToken -ResourceType Service -Service Blob -Permission "rl" -Context $context

把代幣給需要從該儲存帳號讀取的實體。 該實體可以列出和讀取該儲存體帳戶中的所有 Blob。

或者,要用 Azure RBAC 控制這個權限,可以授權該實體Microsoft.Storage/storageAccounts/listkeys/action在該特定儲存帳號上取得權限。 若使用者必須設定診斷設定以將資料傳送至儲存體帳戶,則此為必要權限。 例如,為一個只需從一個儲存帳號讀取的使用者或應用程式建立以下 Azure 自訂角色:

$role = Get-AzRoleDefinition "Reader"
$role.Id = $null
$role.Name = "Monitoring Storage Account Reader"
$role.Description = "Can get the storage account keys for a monitoring storage account."
$role.Actions.Clear()
$role.Actions.Add("Microsoft.Storage/storageAccounts/listkeys/action")
$role.Actions.Add("Microsoft.Storage/storageAccounts/Read")
$role.AssignableScopes.Clear()
$role.AssignableScopes.Add("/subscriptions/<SubscriptionId>/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/myMonitoringStorageAccount")
New-AzRoleDefinition -Role $role 

警告

ListKeys 權限可讓使用者列出主要和次要的儲存體帳戶金鑰。 在該儲存體帳戶中所有已簽署的服務 (blob、佇列、資料表、檔案) 中,這些金鑰會授予使用者所有已簽署的權限 (例如讀取、寫入、建立 blob、刪除 blob 等)。 我們建議盡可能使用帳戶 SAS。

在事件集線器上也可以遵循類似的模式,但首先要建立一個專門的監聽授權規則。 若要授權只需監聽與監控相關的事件樞紐的應用程式存取權,請依照以下步驟操作:

  1. 在入口網站裡,針對只有接聽宣告的串流監視資料所建立的事件中樞建立共用存取原則。 例如,您可能會將其稱為 “monitoringReadOnly”。可能的話,直接將該金鑰提供給取用者,並略過下一步。

  2. 如果消費者需要按需取得金鑰,就授權使用者在該事件樞紐執行 ListKeys 該動作。 此步驟對於需要設定診斷設定以串流至活動中心的使用者來說也是必要的。 例如,您可能會建立 Azure RBAC 規則︰

    $role = Get-AzRoleDefinition "Reader"
    $role.Id = $null
    $role.Name = "Monitoring Event Hub Listener"
    $role.Description = "Can get the key to listen to an event hub streaming monitoring data."
    $role.Actions.Clear()
    $role.Actions.Add("Microsoft.EventHub/namespaces/authorizationrules/listkeys/action")
    $role.Actions.Add("Microsoft.EventHub/namespaces/Read")
    $role.AssignableScopes.Clear()
    $role.AssignableScopes.Add("/subscriptions/<SubscriptionId>/resourceGroups/myResourceGroup/providers/Microsoft.EventHub/namespaces/myEventHubNamespace")
    New-AzRoleDefinition -Role $role 
    

後續步驟