Authentifizierung per Azure SDK für Go mit einem Dienstprinzipal
In diesem Lernprogramm verwenden Sie das Azure SDK für go, um sich bei Azure mit einem Azure-Dienstprinzipal mit einem Geheimschlüssel oder einem Zertifikat zu authentifizieren.
Azure-Dienstprinzipale definieren die Zugriffsrichtlinie und -berechtigungen in einem Microsoft Entra-Mandanten, wodurch kerne Features wie Authentifizierung während der Anmeldung und Autorisierung während des Ressourcenzugriffs aktiviert werden. Sie entfernen die Notwendigkeit, persönliches Konto für den Zugriff auf Azure-Ressourcen zu verwenden. Sie können einem Dienstprinzipal die genauen Berechtigungen zuweisen, die für Ihre App erforderlich sind, und für diese Berechtigungen entwickeln, anstatt eine persönliches Konto zu verwenden, die möglicherweise mehr Berechtigungen in Ihrem Mandanten haben, als für die App erforderlich ist. Sie können auch Dienstprinzipale für Apps verwenden, die lokal gehostet werden, die Azure-Ressourcen verwenden müssen. Das Azure SDK für Go Azure Identity-Modul bietet eine bequeme Möglichkeit, sich bei Azure mit einem Dienstprinzipal mithilfe von Umgebungsvariablen und einem geheimen Schlüssel oder einem Zertifikat zu authentifizieren.
Befolgen Sie dieses Tutorial zum Erstellen und Authentifizieren mit dem Azure SDK für Go unter Verwendung eines Dienstprinzipals.
Voraussetzungen
- Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
Installation von Go: Version 1.18 oder höher
Wenn Sie die Azure CLI verwenden möchten, um die Schritte in diesem Artikel auszuführen:
Verwenden Sie die Bash-Umgebung in Azure Cloud Shell. Weitere Informationen finden Sie unter Schnellstart für Bash in Azure Cloud Shell.
Wenn Sie CLI-Referenzbefehle lieber lokal ausführen, installieren Sie die Azure CLI. Wenn Sie Windows oder macOS ausführen, sollten Sie die Azure CLI in einem Docker-Container ausführen. Weitere Informationen finden Sie unter Ausführen der Azure CLI in einem Docker-Container.
Wenn Sie eine lokale Installation verwenden, melden Sie sich mithilfe des Befehls az login bei der Azure CLI an. Führen Sie die in Ihrem Terminal angezeigten Schritte aus, um den Authentifizierungsprozess abzuschließen. Informationen zu anderen Anmeldeoptionen finden Sie unter Anmelden mit der Azure CLI.
Installieren Sie die Azure CLI-Erweiterung beim ersten Einsatz, wenn Sie dazu aufgefordert werden. Weitere Informationen zu Erweiterungen finden Sie unter Verwenden von Erweiterungen mit der Azure CLI.
Führen Sie az version aus, um die installierte Version und die abhängigen Bibliotheken zu ermitteln. Führen Sie az upgrade aus, um das Upgrade auf die aktuelle Version durchzuführen.
Wenn Sie Azure PowerShell verwenden möchten, um die Schritte in diesem Artikel auszuführen:
- Bei lokaler Verwendung von Azure PowerShell:
- Installieren der aktuellen Version des Az PowerShell-Moduls.
- Stellen Sie eine Verbindung mit Ihrem Azure-Konto mit dem Cmdlet Connect-AzAccount her.
- Bei Verwendung von Azure Cloud Shell:
- Weitere Informationen finden Sie in der Übersicht über Azure Cloud Shell.
- Bei lokaler Verwendung von Azure PowerShell:
1. Erstellen von Azure-Ressourcen
Bevor Sie beginnen, erstellen Sie eine neue Ressourcengruppe und eine Key Vault-Instanz.
az group create --name go-on-azure --location eastus
az keyvault create --location eastus --name <keyVaultName> --resource-group go-on-azure --enable-rbac-authorization
Ersetzen Sie <keyVaultName>
durch einen global eindeutigen Namen.
Notieren Sie sich die id
Eigenschaft aus der Ausgabe des az keyvault create
Befehls. Sie verwenden es im nächsten Abschnitt, um den Gültigkeitsbereich der Autorisierung für den Dienstprinzipal zu definieren. Der id
Wert weist das folgende Format auf: /subscriptions/<subscriptionId>/resourceGroups/go-on-azure/providers/Microsoft.KeyVault/vaults/<keyVaultName>
.
2. Erstellen eines Azure-Dienstprinzipals
Verwenden Sie eine der folgenden Techniken, um einen Azure-Dienstprinzipal zu erstellen und ihm die Rolle "Key Vault Secrets Officer" im Schlüsseltresor zuzuweisen:
- Option 1: Erstellen eines Azure-Dienstprinzipals mit einem Geheimnis
- Option 2: Erstellen eines Azure-Dienstprinzipals mit einem Zertifikat
Weitere Informationen zu Azure-Dienstprinzipalen finden Sie unter Dienstprinzipalobjekt.
Durch Zuweisen der Rolle "Key Vault Secrets Officer" zum Dienstprinzipal autorisiert sie, geheime Schlüssel im Schlüsseltresor zu erstellen, zu lesen, zu aktualisieren und zu löschen. Weitere Informationen zu integrierten Rollen für Azure Key Vault finden Sie unter Bereitstellen des Zugriffs auf Schlüsseltresorschlüssel, Zertifikate und geheime Schlüssel mit einer rollenbasierten Azure-Zugriffssteuerung. Weitere Informationen zu integrierten Rollen in Azure finden Sie in den integrierten Azure-Rollen.
Option 1: Erstellen eines Azure-Dienstprinzipals mit einem Geheimnis
Führen Sie die folgenden Befehle aus, um einen Azure-Dienstprinzipal zu erstellen und ihm die Rolle "Key Vault Secrets Officer" im Schlüsseltresor zuzuweisen.
az ad sp create-for-rbac --name <servicePrincipalName> --role "Key Vault Secrets Officer" --scope <keyVaultId>
Ersetzen Sie <servicePrincipalName>
und <keyVaultId>
durch die entsprechenden Werte.
Notieren Sie sich die password
Eigenschaften tenant
und Eigenschaften appId
aus der Ausgabe. Sie benötigen diese Angaben im nächsten Abschnitt.
Nach der Erstellung kann das Dienstprinzipalkennwort nicht abgerufen werden. Wenn Sie das Kennwort vergessen haben, können Sie die Dienstprinzipalanmeldeinformationen zurücksetzen.
Option 2: Erstellen eines Azure-Dienstprinzipals mit einem Zertifikat
Führen Sie die folgenden Befehle aus, um einen Azure-Dienstprinzipal zu erstellen, der ein Zertifikat verwendet, und weisen Sie ihm die Rolle "Key Vault Secrets Officer" im Schlüsseltresor zu.
az ad sp create-for-rbac --name <servicePrincipalName> --create-cert --role "Key Vault Secrets Officer" --scope <keyVaultId>
Ersetzen Sie <servicePrincipalName>
und <keyVaultId>
durch die entsprechenden Werte.
Notieren Sie sich die fileWithCertAndPrivateKey
Eigenschaften tenantId
und Eigenschaften appId
aus der Ausgabe. Sie benötigen diese Angaben im nächsten Abschnitt.
3. Authentifizieren bei Azure mit einem Dienstprinzipal
Mithilfe von DefaultAzureCredential
" können Sie das Schreiben von umgebungsspezifischem Code für die Authentifizierung bei Azure vermeiden. Mit DefaultAzureCredential
, können Sie Ihre Dienstprinzipalanmeldeinformationen konfigurieren, indem Sie Umgebungsvariablen definieren.
Wählen Sie eine der folgenden Optionen aus, um Ihre Dienstprinzipalanmeldeinformationen zu konfigurieren:
Weitere Informationen zu DefaultAzureCredential
finden Sie unter Azure-Authentifizierung mit Azure SDK für Go.
Option 1: Authentifizieren mit einem Geheimnis
Definieren Sie die folgenden Umgebungsvariablen:
Variablenname | Wert |
---|---|
AZURE_CLIENT_ID |
Anwendungs-ID eines Azure-Dienstprinzipals |
AZURE_TENANT_ID |
ID des Microsoft Entra-Mandanten der Anwendung |
AZURE_CLIENT_SECRET |
Kennwort des Azure-Dienstprinzipals |
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"
Option 2: Authentifizieren mit einem Zertifikat
Variablenname | Wert |
---|---|
AZURE_CLIENT_ID |
Anwendungs-ID eines Azure-Dienstprinzipals |
AZURE_TENANT_ID |
ID des Microsoft Entra-Mandanten der Anwendung |
AZURE_CLIENT_CERTIFICATE_PATH |
Pfad zu einer PEM- oder PKCS12-Zertifikatdatei einschließlich privatem Schlüssel. Wenn Sie die Schritte für die Azure CLI ausgeführt haben, ist die Datei nicht kennwortgeschützter. Wenn Sie die Schritte für Azure PowerShell ausgeführt haben, ist die Datei kennwort geschützt, und Sie müssen auch die AZURE_CLIENT_CERTIFICATE_PASSWORD Umgebungsvariable festlegen. |
AZURE_CLIENT_CERTIFICATE_PASSWORD |
Das Kennwort, das Sie beim Erstellen des Dienstprinzipals eingegeben haben. Nur erforderlich, wenn Sie die Schritte für Azure PowerShell befolgt haben. |
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"
Verwenden von DefaultAzureCredential zum Authentifizieren eines Ressourcenclients
Nachdem Sie die Umgebungsvariablen festgelegt haben, können Sie im Azure Identity-Modul zum Authentifizieren eines Ressourcenclients verwenden DefaultAzureCredential
. Der folgende Code zeigt, wie eine Instanz von DefaultAzureCredential
.
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("failed to obtain a credential: %v", err)
}
4. Erstellen eines Schlüsseltresorgeheimnisses mit Go
Verwenden Sie das folgende Codebeispiel, um zu überprüfen, ob Sich Ihr Dienstprinzipal bei Azure authentifiziert und über die entsprechenden Berechtigungen für den Schlüsseltresor verfügt.
Erstellen Sie ein neues Verzeichnis namens
go-on-azure
in Ihrem Basisverzeichnis.mkdir ~/go-on-azure
Wechseln Sie in das Verzeichnis
go-on-azure
.cd ~/go-on-azure
Führen Sie
go mod init
aus, um die Dateigo.mod
zu erstellen.go mod init go-on-azure
Führen Sie
go get
aus, um die erforderlichen Go-Module zu installieren.go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity" go get "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets"
Erstellen Sie eine Datei namens
main.go
, und fügen Sie den folgenden Code hinzu.package main import ( "context" "fmt" "log" "os" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets" ) func createSecret(name, value string) { keyVaultName := os.Getenv("KEY_VAULT_NAME") keyVaultUrl := fmt.Sprintf("https://%s.vault.azure.net/", keyVaultName) cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { log.Fatalf("failed to obtain a credential: %v", err) } client, err := azsecrets.NewClient(keyVaultUrl, cred, nil) if err != nil { log.Fatalf("failed to create a client: %v", err) } params := azsecrets.SetSecretParameters{Value: &value} resp, err := client.SetSecret(context.TODO(), name, params, nil) if err != nil { log.Fatalf("failed to create a secret: %v", err) } fmt.Printf("Name: %s, Value: %s\n", *resp.ID, *resp.Value) } func main() { createSecret("ExamplePassword", "hVFkk965BuUv") }
Erstellen Sie eine Umgebungsvariable namens
KEY_VAULT_NAME
. Legen Sie den Wert der Umgebungsvariablen auf den Namen der zuvor erstellten Azure Key Vault-Instanz fest.export KEY_VAULT_NAME=<keyVaultName>
Ersetzen Sie den
<keyVaultName>
Namen Ihrer Azure Key Vault-Instanz.Führen Sie den
go run
Befehl aus, um den neuen Schlüsseltresorschlüssel zu erstellen.go run main.go
Bei Erfolg ähnelt die Ausgabe folgendem:
Name: https://<keyVaultName>.vault.azure.net/secrets/ExamplePassword/1e697f71d0014761a65641226f2f057b, Value: hVFkk965BuUv
5. Bereinigen von Ressourcen
Wenn Sie die azure-Ressourcen, die Sie in diesem Artikel erstellt haben, nicht mehr verwenden möchten, empfiehlt es sich, sie zu löschen. Das Löschen nicht verwendeter Ressourcen hilft Ihnen, laufende Gebühren zu vermeiden und Ihr Abonnement übersichtlich zu halten. Die einfachste Möglichkeit zum Löschen der in diesem Lernprogramm verwendeten Ressourcen besteht darin, die Ressourcengruppe zu löschen.
az group delete --name go-on-azure --yes
Das --yes
Argument weist den Befehl an, keine Bestätigung zu verlangen.
Der vorstehende Befehl führt einen vorläufigen Löschvorgang im Schlüsseltresor in der Ressourcengruppe aus. Um es endgültig aus Ihrem Abonnement zu entfernen, geben Sie den folgenden Befehl ein:
az keyvault purge --name <keyVaultName> --no-wait
Ersetzen Sie <keyVaultName>
durch den Namen Ihres Schlüsseltresors.
Schließlich sollten Sie die App-Registrierung und den Dienstprinzipal entfernen.
az ad app delete --id <servicePrincipalAppId>
Ersetzen Sie sie <servicePrincipalAppId>
durch die App-ID Ihres Dienstprinzipals.