[v10.0.x] Azure: Add support for Workload Identity authentication (#75732)
* Azure: Add support for Workload Identity authentication (#75681)
* Update Azure Monitor
* Update Prometheus
* Update README
* Update docs/sources/datasources/azure-monitor/_index.md
Co-authored-by: Andrew Hackmann <5140848+bossinc@users.noreply.github.com>
* Update docs/sources/datasources/azure-monitor/_index.md
Co-authored-by: Beverly <131809838+BeverlyJaneJ@users.noreply.github.com>
* Update docs/sources/datasources/azure-monitor/_index.md
Co-authored-by: Beverly <131809838+BeverlyJaneJ@users.noreply.github.com>
* Update docs/sources/datasources/azure-monitor/_index.md
Co-authored-by: Beverly <131809838+BeverlyJaneJ@users.noreply.github.com>
* README updates
* Fix prettier
* memoize options
---------
Co-authored-by: Andrew Hackmann <5140848+bossinc@users.noreply.github.com>
Co-authored-by: Beverly <131809838+BeverlyJaneJ@users.noreply.github.com>
(cherry picked from commit 5796836662)
# Conflicts:
# public/app/plugins/datasource/azuremonitor/components/AzureCredentialsForm.tsx
# public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.tsx
* Fix types
This commit is contained in:
@@ -31,10 +31,14 @@ func getAuthType(cfg *setting.Cfg, jsonData *simplejson.Json) string {
|
||||
return azcredentials.AzureAuthClientSecret
|
||||
}
|
||||
|
||||
// For newly created datasource with no configuration, managed identity is the default authentication type
|
||||
// if they are enabled in Grafana config
|
||||
// For newly created datasource with no configuration the order is as follows:
|
||||
// Managed identity is the default if enabled
|
||||
// Workload identity is the next option if enabled
|
||||
// Client secret is the final fallback
|
||||
if cfg.Azure.ManagedIdentityEnabled {
|
||||
return azcredentials.AzureAuthManagedIdentity
|
||||
} else if cfg.Azure.WorkloadIdentityEnabled {
|
||||
return azcredentials.AzureAuthWorkloadIdentity
|
||||
} else {
|
||||
return azcredentials.AzureAuthClientSecret
|
||||
}
|
||||
@@ -84,8 +88,8 @@ func normalizeAzureCloud(cloudName string) (string, error) {
|
||||
func getAzureCloud(cfg *setting.Cfg, jsonData *simplejson.Json) (string, error) {
|
||||
authType := getAuthType(cfg, jsonData)
|
||||
switch authType {
|
||||
case azcredentials.AzureAuthManagedIdentity:
|
||||
// In case of managed identity, the cloud is always same as where Grafana is hosted
|
||||
case azcredentials.AzureAuthManagedIdentity, azcredentials.AzureAuthWorkloadIdentity:
|
||||
// In case of managed identity and workload identity, the cloud is always same as where Grafana is hosted
|
||||
return getDefaultAzureCloud(cfg)
|
||||
case azcredentials.AzureAuthClientSecret:
|
||||
if cloud := jsonData.Get("cloudName").MustString(); cloud != "" {
|
||||
@@ -106,7 +110,9 @@ func getAzureCredentials(cfg *setting.Cfg, jsonData *simplejson.Json, secureJson
|
||||
case azcredentials.AzureAuthManagedIdentity:
|
||||
credentials := &azcredentials.AzureManagedIdentityCredentials{}
|
||||
return credentials, nil
|
||||
|
||||
case azcredentials.AzureAuthWorkloadIdentity:
|
||||
credentials := &azcredentials.AzureWorkloadIdentityCredentials{}
|
||||
return credentials, nil
|
||||
case azcredentials.AzureAuthClientSecret:
|
||||
cloud, err := getAzureCloud(cfg, jsonData)
|
||||
if err != nil {
|
||||
|
||||
@@ -76,6 +76,66 @@ func TestCredentials_getAuthType(t *testing.T) {
|
||||
assert.Equal(t, azcredentials.AzureAuthClientSecret, authType)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("when workload identities enabled", func(t *testing.T) {
|
||||
cfg.Azure.WorkloadIdentityEnabled = true
|
||||
|
||||
t.Run("should be client secret if auth type is set to client secret", func(t *testing.T) {
|
||||
jsonData := simplejson.NewFromAny(map[string]interface{}{
|
||||
"azureAuthType": azcredentials.AzureAuthClientSecret,
|
||||
})
|
||||
|
||||
authType := getAuthType(cfg, jsonData)
|
||||
|
||||
assert.Equal(t, azcredentials.AzureAuthClientSecret, authType)
|
||||
})
|
||||
|
||||
t.Run("should be workload identity if datasource not configured and managed identity is disabled", func(t *testing.T) {
|
||||
jsonData := simplejson.NewFromAny(map[string]interface{}{
|
||||
"azureAuthType": "",
|
||||
})
|
||||
|
||||
authType := getAuthType(cfg, jsonData)
|
||||
|
||||
assert.Equal(t, azcredentials.AzureAuthWorkloadIdentity, authType)
|
||||
})
|
||||
|
||||
t.Run("should be client secret if auth type not specified but credentials configured", func(t *testing.T) {
|
||||
jsonData := simplejson.NewFromAny(map[string]interface{}{
|
||||
"azureAuthType": "",
|
||||
"tenantId": "9b9d90ee-a5cc-49c2-b97e-0d1b0f086b5c",
|
||||
"clientId": "849ccbb0-92eb-4226-b228-ef391abd8fe6",
|
||||
})
|
||||
|
||||
authType := getAuthType(cfg, jsonData)
|
||||
|
||||
assert.Equal(t, azcredentials.AzureAuthClientSecret, authType)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("when workload identities disabled", func(t *testing.T) {
|
||||
cfg.Azure.WorkloadIdentityEnabled = false
|
||||
|
||||
t.Run("should be workload identity if auth type is set to workload identity", func(t *testing.T) {
|
||||
jsonData := simplejson.NewFromAny(map[string]interface{}{
|
||||
"azureAuthType": azcredentials.AzureAuthWorkloadIdentity,
|
||||
})
|
||||
|
||||
authType := getAuthType(cfg, jsonData)
|
||||
|
||||
assert.Equal(t, azcredentials.AzureAuthWorkloadIdentity, authType)
|
||||
})
|
||||
|
||||
t.Run("should be client secret if datasource not configured", func(t *testing.T) {
|
||||
jsonData := simplejson.NewFromAny(map[string]interface{}{
|
||||
"azureAuthType": "",
|
||||
})
|
||||
|
||||
authType := getAuthType(cfg, jsonData)
|
||||
|
||||
assert.Equal(t, azcredentials.AzureAuthClientSecret, authType)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestCredentials_getAzureCloud(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user