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.

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:

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 passwordEigenschaften tenantund 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 fileWithCertAndPrivateKeyEigenschaften tenantIdund 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.

  1. Erstellen Sie ein neues Verzeichnis namens go-on-azure in Ihrem Basisverzeichnis.

    mkdir ~/go-on-azure
    
  2. Wechseln Sie in das Verzeichnis go-on-azure.

    cd ~/go-on-azure
    
  3. Führen Sie go mod init aus, um die Datei go.mod zu erstellen.

    go mod init go-on-azure
    
  4. 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"
    
  5. 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")
    }
    
    
  6. 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.

  7. 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.

Nächste Schritte