From 01c98af8dedda7c26e4d13d41c25f0546dd0b3ff Mon Sep 17 00:00:00 2001 From: Yuri Tseretyan Date: Mon, 13 May 2024 12:11:45 -0400 Subject: [PATCH] [v10.2.x] Alerting: Add two sets of provisioning actions for rules and notifications (#87666) Alerting: Add two sets of provisioning actions for rules and notifications (#87149) (cherry picked from commit 356a29592be6c5fe5de81138f6a55e03a8cdfac2) # Conflicts: # pkg/services/accesscontrol/models.go # pkg/services/ngalert/accesscontrol.go # pkg/services/ngalert/api/authorization.go # pkg/services/ngalert/provisioning/accesscontrol.go # pkg/services/ngalert/provisioning/accesscontrol_test.go --- pkg/services/accesscontrol/models.go | 10 +++++-- pkg/services/ngalert/accesscontrol.go | 18 ++++++++++++ pkg/services/ngalert/api/authorization.go | 35 +++++++++++++++++------ 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/pkg/services/accesscontrol/models.go b/pkg/services/accesscontrol/models.go index 14795734b73..ec8414910d3 100644 --- a/pkg/services/accesscontrol/models.go +++ b/pkg/services/accesscontrol/models.go @@ -442,9 +442,13 @@ const ( ActionAlertingNotificationsExternalRead = "alert.notifications.external:read" // Alerting provisioning actions - ActionAlertingProvisioningRead = "alert.provisioning:read" - ActionAlertingProvisioningReadSecrets = "alert.provisioning.secrets:read" - ActionAlertingProvisioningWrite = "alert.provisioning:write" + ActionAlertingProvisioningRead = "alert.provisioning:read" + ActionAlertingProvisioningReadSecrets = "alert.provisioning.secrets:read" + ActionAlertingProvisioningWrite = "alert.provisioning:write" + ActionAlertingRulesProvisioningRead = "alert.rules.provisioning:read" + ActionAlertingRulesProvisioningWrite = "alert.rules.provisioning:write" + ActionAlertingNotificationsProvisioningRead = "alert.notifications.provisioning:read" + ActionAlertingNotificationsProvisioningWrite = "alert.notifications.provisioning:write" // Feature Management actions ActionFeatureManagementRead = "featuremgmt.read" diff --git a/pkg/services/ngalert/accesscontrol.go b/pkg/services/ngalert/accesscontrol.go index 3e9ce4a3f73..df89d18af0e 100644 --- a/pkg/services/ngalert/accesscontrol.go +++ b/pkg/services/ngalert/accesscontrol.go @@ -166,6 +166,18 @@ var ( { Action: accesscontrol.ActionAlertingProvisioningWrite, // organization scope }, + { + Action: accesscontrol.ActionAlertingRulesProvisioningRead, // organization scope + }, + { + Action: accesscontrol.ActionAlertingRulesProvisioningWrite, // organization scope + }, + { + Action: accesscontrol.ActionAlertingNotificationsProvisioningRead, // organization scope + }, + { + Action: accesscontrol.ActionAlertingNotificationsProvisioningWrite, // organization scope + }, }, }, Grants: []string{string(org.RoleAdmin)}, @@ -184,6 +196,12 @@ var ( { Action: accesscontrol.ActionAlertingProvisioningRead, // organization scope }, + { + Action: accesscontrol.ActionAlertingRulesProvisioningRead, // organization scope + }, + { + Action: accesscontrol.ActionAlertingNotificationsProvisioningRead, // organization scope + }, }, }, Grants: []string{string(org.RoleAdmin)}, diff --git a/pkg/services/ngalert/api/authorization.go b/pkg/services/ngalert/api/authorization.go index 5b5a44a151d..743dce41e00 100644 --- a/pkg/services/ngalert/api/authorization.go +++ b/pkg/services/ngalert/api/authorization.go @@ -184,9 +184,10 @@ func (api *API) authorize(method, path string) web.Handler { case http.MethodGet + "/api/v1/provisioning/policies/export", http.MethodGet + "/api/v1/provisioning/contact-points/export": eval = ac.EvalAny( - ac.EvalPermission(ac.ActionAlertingNotificationsRead), // organization scope - ac.EvalPermission(ac.ActionAlertingProvisioningRead), // organization scope - ac.EvalPermission(ac.ActionAlertingProvisioningReadSecrets), // organization scope + ac.EvalPermission(ac.ActionAlertingNotificationsRead), // organization scope + ac.EvalPermission(ac.ActionAlertingProvisioningRead), // organization scope + ac.EvalPermission(ac.ActionAlertingProvisioningReadSecrets), // organization scope + ac.EvalPermission(ac.ActionAlertingNotificationsProvisioningRead), // organization scope ) case http.MethodGet + "/api/v1/provisioning/policies", @@ -194,14 +195,23 @@ func (api *API) authorize(method, path string) web.Handler { http.MethodGet + "/api/v1/provisioning/templates", http.MethodGet + "/api/v1/provisioning/templates/{name}", http.MethodGet + "/api/v1/provisioning/mute-timings", - http.MethodGet + "/api/v1/provisioning/mute-timings/{name}", - http.MethodGet + "/api/v1/provisioning/alert-rules", + http.MethodGet + "/api/v1/provisioning/mute-timings/{name}": + eval = ac.EvalAny( + ac.EvalPermission(ac.ActionAlertingProvisioningRead), + ac.EvalPermission(ac.ActionAlertingProvisioningReadSecrets), + ac.EvalPermission(ac.ActionAlertingNotificationsProvisioningRead), // organization scope + ) // organization scope + case http.MethodGet + "/api/v1/provisioning/alert-rules", http.MethodGet + "/api/v1/provisioning/alert-rules/{UID}", http.MethodGet + "/api/v1/provisioning/alert-rules/export", http.MethodGet + "/api/v1/provisioning/alert-rules/{UID}/export", http.MethodGet + "/api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}", http.MethodGet + "/api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}/export": - eval = ac.EvalAny(ac.EvalPermission(ac.ActionAlertingProvisioningRead), ac.EvalPermission(ac.ActionAlertingProvisioningReadSecrets)) // organization scope + eval = ac.EvalAny( + ac.EvalPermission(ac.ActionAlertingProvisioningRead), + ac.EvalPermission(ac.ActionAlertingProvisioningReadSecrets), + ac.EvalPermission(ac.ActionAlertingRulesProvisioningRead), + ) // organization scope case http.MethodPut + "/api/v1/provisioning/policies", http.MethodDelete + "/api/v1/provisioning/policies", @@ -212,12 +222,19 @@ func (api *API) authorize(method, path string) web.Handler { http.MethodDelete + "/api/v1/provisioning/templates/{name}", http.MethodPost + "/api/v1/provisioning/mute-timings", http.MethodPut + "/api/v1/provisioning/mute-timings/{name}", - http.MethodDelete + "/api/v1/provisioning/mute-timings/{name}", - http.MethodPost + "/api/v1/provisioning/alert-rules", + http.MethodDelete + "/api/v1/provisioning/mute-timings/{name}": + eval = ac.EvalAny( + ac.EvalPermission(ac.ActionAlertingProvisioningWrite), // organization scope + ac.EvalPermission(ac.ActionAlertingNotificationsProvisioningWrite), // organization scope + ) + case http.MethodPost + "/api/v1/provisioning/alert-rules", http.MethodPut + "/api/v1/provisioning/alert-rules/{UID}", http.MethodDelete + "/api/v1/provisioning/alert-rules/{UID}", http.MethodPut + "/api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}": - eval = ac.EvalPermission(ac.ActionAlertingProvisioningWrite) // organization scope + eval = ac.EvalAny( + ac.EvalPermission(ac.ActionAlertingProvisioningWrite), // organization scope + ac.EvalPermission(ac.ActionAlertingRulesProvisioningWrite), // organization scope + ) } if eval != nil {