Teilen über


Authentifizieren von Go-Apps bei Azure-Diensten während der lokalen Entwicklung mithilfe von Dienstprinzipalen

Während der lokalen Entwicklung müssen sich Anwendungen bei Azure authentifizieren, um auf verschiedene Azure-Dienste zuzugreifen. Zwei gängige Ansätze für die lokale Authentifizierung sind die Verwendung eines Entwicklerkontos oder eines Dienstprinzipals. Dieser Artikel erklärt, wie Sie einen Anwendungsdienstprinzipal verwenden. In den folgenden Abschnitten lernen Sie:

  • So registrieren Sie eine Anwendung in Microsoft Entra, um einen Service Principal zu erstellen
  • Verwenden von Microsoft Entra-Gruppen zum effizienten Verwalten von Berechtigungen
  • Zuweisung von Rollen zu Bereichsberechtigungen
  • So authentifizieren Sie sich über einen Dienstprinzipal von Ihrem Anwendungscode aus

Mithilfe dedizierter Anwendungsdienstprinzipale können Sie das Prinzip der geringsten Rechte beim Zugriff auf Azure-Ressourcen einhalten. Beschränken Sie die Berechtigungen auf die spezifischen Anforderungen der App während der Entwicklung, und verhindern Sie versehentlichen Zugriff auf Azure-Ressourcen, die für andere Apps oder Dienste vorgesehen sind. Dieser Ansatz hilft auch, Probleme zu vermeiden, wenn die App in die Produktion verschoben wird, indem sichergestellt wird, dass sie in der Entwicklungsumgebung nicht überprivilegiert ist.

Ein Diagramm, das zeigt, wie eine lokale Go-App einen Dienstprinzipal zum Herstellen einer Verbindung mit Azure-Ressourcen verwendet.

Wenn Sie die App in Azure registrieren, erstellen Sie einen Anwendungsdienstprinzipal. Für die lokale Entwicklung:

  • Erstellen Sie eine separate App-Registrierung für jeden Entwickler, der an der App arbeitet, sodass jeder Entwickler einen eigenen Anwendungsdienstprinzipal hat und keine Zugangsdaten freigeben muss.
  • Erstellen Sie eine separate App-Registrierung für jede App, um die Berechtigungen der App nur auf die erforderlichen Elemente zu beschränken.

Legen Sie während der lokalen Entwicklung Umgebungsvariablen mit der Identität des Anwendungsdienstprinzipals fest. Die Azure Identity-Bibliothek liest diese Umgebungsvariablen vor, um die App bei den erforderlichen Azure-Ressourcen zu authentifizieren.

Registrieren der App in Azure

Anwendungsdienstprinzipalobjekte werden über eine App-Registrierung in Azure mithilfe des Azure-Portals oder der Azure CLI erstellt.

  1. Verwenden Sie im Azure-Portal die Suchleiste, um zur App-Registrierungen Seite zu navigieren.

  2. Wählen Sie auf der Seite App-Registrierungen die Option + Neue Registrierung aus.

  3. Gehen Sie auf der Seite Registrieren einer Anwendung folgendermaßen vor:

    • Geben Sie für das Feld Name einen beschreibenden Wert ein, der den App-Namen und die Zielumgebung enthält.
    • Wählen Sie unter Unterstützte Kontotypendie Option Nur Konten in diesem Organisationsverzeichnis (nur Microsoft Customer Led - Single Tenant)oder die Option, die Ihren Anforderungen am besten entspricht.
  4. Wählen Sie Registrieren , um Ihre App zu registrieren und den Dienstprinzipal zu erstellen.

    Ein Screenshot, der zeigt, wie Sie eine App-Registrierung im Azure-Portal erstellen.

  5. Kopieren Sie auf der Seite App-Registrierung Ihrer App die Anwendungs-ID (Client-ID) und Verzeichnis-ID (Mandanten-ID) und fügen Sie sie an einem temporären Speicherort ein, um sie später in Ihren App-Codekonfigurationen zu verwenden.

  6. Wählen Sie Zertifikat oder Geheimnis hinzufügen , um Anmeldedaten für Ihre App einzurichten.

  7. Auf der Seite Zertifikate & Geheimnisse wählen Sie + Neues Client-Geheimnis.

  8. In dem Hinzufügen eines Client-Geheimnisses Flyout-Panel, das sich öffnet:

    • Für die Beschreibunggeben Sie den Wert Current ein.
    • Für den Wert Expires belassen Sie den empfohlenen Standardwert von 180 Tagen.
    • Wählen Sie Hinzufügen aus, um das Geheimnis hinzuzufügen.
  9. Kopieren Sie auf der Seite Zertifikate & Geheimnisse die Eigenschaft Wert des Client-Geheimnisses zur Verwendung in einem späteren Schritt.

    Anmerkung

    Der Wert des geheimen Clientschlüssels wird nur einmal angezeigt, nachdem die App-Registrierung erstellt wurde. Sie können weitere geheime Clientschlüssel hinzufügen, ohne diesen geheimen Clientschlüssel ungültig zu machen, aber es gibt keine Möglichkeit, diesen Wert erneut anzuzeigen.

Erstellen einer Microsoft Entra-Gruppe für die lokale Entwicklung

Erstellen Sie eine Microsoft Entra-Gruppe, um die Rollen (Berechtigungen) zu kapseln, die die App in der lokalen Entwicklung benötigt, anstatt die Rollen einzelnen Dienstprinzipalobjekten zuzuweisen. Dieser Ansatz bietet die folgenden Vorteile:

  • Jeder Entwickler hat die gleichen Rollen auf Gruppenebene zugewiesen.
  • Wenn eine neue Rolle für die App erforderlich ist, muss sie nur der Gruppe für die App hinzugefügt werden.
  • Wenn ein neuer Entwickler dem Team beitritt, wird ein neuer Anwendungsdienstprinzipal für den Entwickler erstellt und der Gruppe hinzugefügt, um sicherzustellen, dass der Entwickler über die richtigen Berechtigungen für die Arbeit an der App verfügt.
  1. Navigieren Sie zur Microsoft Entra ID Übersichtsseite im Azure-Portal.

  2. Wählen Sie im linken Menü "Alle Gruppen " aus.

  3. Wählen Sie auf der Seite "Gruppen " die Option "Neue Gruppe" aus.

  4. Füllen Sie auf der Seite "Neue Gruppe " die folgenden Formularfelder aus:

    • Gruppentyp: Wählen Sie Sicherheits-aus.
    • Gruppenname: Geben Sie einen Namen für die Gruppe ein, die einen Verweis auf den App- oder Umgebungsnamen enthält.
    • Gruppenbeschreibung: Geben Sie eine Beschreibung ein, die den Zweck der Gruppe erläutert.

    Ein Screenshot, der zeigt, wie eine Gruppe im Azure-Portal erstellt wird.

  5. Wählen Sie unter Mitglieder den Link Keine Mitglieder ausgewählt aus, um der Gruppe Mitglieder hinzuzufügen.

  6. Suchen Sie im daraufhin geöffneten Flyoutbereich nach dem zuvor erstellten Dienstprinzipal, und wählen Sie ihn aus den gefilterten Ergebnissen aus. Wählen Sie unten im Bereich die Schaltfläche "Auswählen " aus, um Ihre Auswahl zu bestätigen.

  7. Wählen Sie unten auf der Seite "Neue Gruppe erstellen" aus, um die Gruppe zu erstellen und zur Seite "Alle Gruppen" zurückzukehren. Wenn die neue Gruppe nicht aufgeführt ist, warten Sie einen Moment, und aktualisieren Sie die Seite.

Weisen Sie der Gruppe Rollen zu

Ermitteln Sie als Nächstes, welche Rollen (Berechtigungen) Ihre App für welche Ressourcen benötigt, und weisen Sie diese Rollen der von Ihnen erstellten Microsoft Entra-Gruppe zu. Gruppen können einer Rolle im Ressourcen-, Ressourcengruppen- oder Abonnementbereich zugewiesen werden. In diesem Beispiel wird gezeigt, wie Rollen im Ressourcengruppenbereich zugewiesen werden, da die meisten Apps alle ihre Azure-Ressourcen in einer einzelnen Ressourcengruppe gruppieren.

  1. Navigieren Sie im Azure-Portal zur Seite "Übersicht" der Ressourcengruppe, die Ihre App enthält.

  2. Wählen Sie im linken Navigationsbereich die Option Zugriffssteuerung (IAM).

  3. Wählen Sie auf der Seite access control (IAM)+ Hinzufügen und dann im Dropdownmenü " Rollenzuweisung hinzufügen " aus. Die Seite " Rollenzuweisung hinzufügen " bietet mehrere Registerkarten zum Konfigurieren und Zuweisen von Rollen.

  4. Verwenden Sie auf der Registerkarte " Rolle " das Suchfeld, um die Rolle zu suchen, die Sie zuweisen möchten. Wählen Sie die Rolle und dann "Weiter" aus.

  5. Auf der Registerkarte „Mitglieder“

    • Wählen Sie für den Wert "Zugriff zuweisen""Benutzer", "Gruppe" oder "Dienstprinzipal" aus.
    • Wählen Sie für den Wert " Mitglieder " die Option "Mitglieder auswählen " aus, um den Flyoutbereich " Mitglieder auswählen " zu öffnen.
    • Suchen Sie nach der Zuvor erstellten Microsoft Entra-Gruppe, und wählen Sie sie aus den gefilterten Ergebnissen aus. Wählen Sie Auswählen aus, um die Gruppe auszuwählen und das Flyout-Panel zu schließen.
    • Wählen Sie "Überprüfen" und "Zuweisen " am unteren Rand der Registerkarte " Mitglieder " aus.

    Ein Screenshot, der zeigt, wie Sie der Microsoft Entra-Gruppe eine Rolle zuweisen.

  6. Wählen Sie auf der Registerkarte " Überprüfen+ Zuweisen " die Option "Überprüfen" und "Zuweisen " am unteren Rand der Seite aus.

Festlegen der App-Umgebungsvariablen

Zur Laufzeit suchen bestimmte Anmeldeinformationen aus der Azure Identity-Bibliothek, wie z. B. DefaultAzureCredential, EnvironmentCredential und ClientSecretCredential, nach Dienstprinzipal-Informationen gemäß den Konventionen in den Umgebungsvariablen. Sie können Umgebungsvariablen je nach Tool und Umgebung auf mehrere Arten konfigurieren. Sie können eine .env Datei erstellen oder Systemumgebungsvariablen verwenden, um diese Anmeldeinformationen während der Entwicklung lokal zu speichern. Da die meisten Entwickler an mehreren Anwendungen arbeiten, verwenden Sie ein Paket wie godotenv, um auf Umgebungsvariablen aus einer .env-Datei zuzugreifen, die während der Entwicklung im Verzeichnis der Anwendung gespeichert wird. Bei diesem Ansatz wird der Gültigkeitsbereich der Umgebungsvariablen festgelegt, die zur Authentifizierung der Anwendung bei Azure verwendet werden, sodass nur diese Anwendung darauf zugreifen kann. Überprüfen Sie die Datei nie in die .env Quellcodeverwaltung, da sie den geheimen Anwendungsschlüssel für Azure enthält. Die standardmäßige .gitignore-Datei für Go schließt die .env-Datei automatisch vom Einchecken aus.

Um das godotenv Paket zu verwenden, installieren Sie zuerst das Paket in Ihrer Anwendung.

go get github.com/joho/godotenv

Erstellen Sie dann eine .env Datei in Ihrem Anwendungsstammverzeichnis. Legen Sie die Werte der Umgebungsvariable mit Werten fest, die aus dem App-Registrierungsprozess für einen Dienstprinzipal abgerufen wurden:

  • AZURE_CLIENT_ID: Wird verwendet, um die registrierte App in Azure zu identifizieren.
  • AZURE_TENANT_ID: Die ID des Microsoft Entra-Mandanten.
  • AZURE_CLIENT_SECRET: Die geheimen Anmeldeinformationen, die für die App generiert wurden.
AZURE_CLIENT_ID=<your-client-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_SECRET=<your-client-secret>

Verwenden Sie schließlich im Startcode für Ihre Anwendung die godotenv Bibliothek, um die Umgebungsvariablen aus der .env Datei beim Start zu lesen.

// Imports of fmt, log, and os omitted for brevity 
import "github.com/joho/godotenv"

environment := os.Getenv("ENVIRONMENT")

if environment == "development" {
	fmt.Println("Loading environment variables from .env file")

	// Load the .env file
	err := godotenv.Load(".env")
	if err != nil {
	    log.Fatalf("Error loading .env file: %v", err)
	}
}

Wenn Sie die Umgebungsvariablen in Ihrer Systemumgebung festlegen möchten, anstatt eine .env Datei zu verwenden, können Sie dies je nach Betriebssystem und Shell auf verschiedene Arten tun. Die folgenden Beispiele zeigen, wie Die Umgebungsvariablen in verschiedenen Shells festgelegt werden:

export AZURE_CLIENT_ID=<your-client-id>
export AZURE_TENANT_ID=<your-tenant-id>
export AZURE_CLIENT_SECRET=<your-client-secret>

Authentifizieren von Azure-Diensten aus Ihrer App

Die Azure Identity-Bibliothek bietet unterschiedliche TokenCredential Implementierungen für verschiedene Szenarien und Microsoft Entra-Authentifizierungsflüsse. Verwenden Sie EnvironmentCredential, wenn Sie lokal und in der Produktion mit Dienstprinzipalen arbeiten. Lesen Sie in diesem Szenario die Umgebungsvariablen EnvironmentCredential, AZURE_CLIENT_ID, AZURE_TENANT_ID und AZURE_CLIENT_SECRET, um die Anwendungsdienst-Prinzipal-Informationen abzurufen und eine Verbindung mit Azure herzustellen.

  1. Fügen Sie das azidentity Paket zu Ihrer Anwendung hinzu.

    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
    
  2. Für jeden Go-Code, der ein Azure SDK-Clientobjekt in Ihrer App erstellt, möchten Sie:

    1. Importieren Sie das azidentity-Paket.
    2. Erstellen Sie eine EnvironmentCredential Instanz.
    3. Übergeben Sie die Instanz an den Azure SDK-Clientkonstruktor.

    Das folgende Codesegment zeigt ein Beispiel:

    import (
    	"context"
    	"os"
    
    	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
    )
    
    const (
    	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
    	containerName = "sample-container"
    	blobName      = "sample-blob"
    	sampleFile    = "path/to/sample/file"
    )
    
    func main() {
    	// create a credential
    	cred, err := azidentity.NewEnvironmentCredential(nil)
    	if err != nil {
    	  // TODO: handle error
    	}
    
    	// create a client for the specified storage account
    	client, err := azblob.NewClient(account, cred, nil)
    	if err != nil {
    	  // TODO: handle error
    	}
    
    	// TODO: perform some action with the azblob Client
    	// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
    }