Authentifizierung per Azure SDK für Go mit einem Dienstprinzipal

In diesem Tutorial verwenden Sie das Azure SDK für Go, um sich mit einem Azure-Dienstprinzipal unter Verwendung eines Geheimnisses oder Zertifikats bei Azure zu authentifizieren.

Azure-Dienstprinzipale definieren die Zugriffsrichtlinie und -berechtigungen in einem Microsoft Entra-Mandanten. Dadurch werden die Kernfunktionen wie die Authentifizierung während der Anmeldung und die Autorisierung beim Zugriff auf Ressourcen aktiviert. Persönliche Konten für den Zugriff auf Azure-Ressourcen müssen nicht mehr verwendet werden. Das Modul Azure-Identität des Azure SDK für Go bietet eine komfortable Möglichkeit, sich mithilfe eines Dienstprinzipals und mithilfe von Umgebungsvariablen, eines Geheimnisses oder Zertifikats bei Azure 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

1. Konfigurieren Ihrer Umgebung

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

Ersetzen Sie <keyVaultName> durch einen global eindeutigen Namen. Notieren Sie sich außerdem die Id Ausgabe, die Sie für den Bereich des Dienstkontos verwenden.

2. Erstellen eines Azure-Dienstprinzipals

Verwenden Sie eins der folgenden Verfahren, um einen Azure-Dienstprinzipal zu erstellen:

Weitere Informationen zu Azure-Dienstprinzipalen finden Sie unter Dienstprinzipalobjekt.

Option 1: Erstellen eines Azure-Dienstprinzipals mit einem Geheimnis

Führen Sie die folgenden Befehle aus, um einen Azure-Dienstprinzipal zu erstellen:

az ad sp create-for-rbac --name `<servicePrincipalName>` --role Contributor --scope <resourceGroupId>

Ersetzen Sie <servicePrincipalName> und <resourceGroupId> durch die entsprechenden Werte.

Denken Sie unbedingt daran, den Wert für Kennwort zu kopieren – er kann nicht abgerufen werden. Wenn Sie das Kennwort vergessen haben, setzen Sie die Anmeldeinformationen des Dienstprinzipals zurück.

Option 2: Erstellen eines Azure-Dienstprinzipals mit einem Zertifikat

az ad sp create-for-rbac --name <servicePrincipal> --create-cert --role Contributor --scope <resourceGroupId>

Ersetzen Sie <servicePrincipalName> und <resourceGroupId> durch die entsprechenden Werte.

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.

Verwenden Sie DefaultAzureCredential, um Ihre Dienstprinzipal-Anmeldeinformationen durch die Definition von Umgebungsvariablen zu konfigurieren.

Wählen Sie eine der folgenden Optionen aus, um die Anmeldeinformationen für Ihren Dienstprinzipal 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 Zertifikatdatei einschließlich privatem Schlüssel (ohne Kennwortschutz)
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 von ResourceClient

Verwenden Sie die Funktion NewDefaultAzureCredential des Azure-Identitätsmoduls, um einen Ressourcenclient (ResourceClient) zu authentifizieren.

cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    log.Fatalf("failed to obtain a credential: %v", err)
}

4. Beispielcode

Verwenden Sie das folgende Codebeispiel, um zu überprüfen, ob sich Ihr Dienstprinzipal bei Azure authentifiziert und über die entsprechenden Berechtigungen für die Ressourcengruppe 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/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/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)
    	}
    
    	resp, err := client.SetSecret(context.TODO(), name, value, 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 mit dem Namen 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
    

Nächste Schritte