Azure SDK för Go-autentisering med tjänstens huvudnamn

I den här självstudien använder du Azure SDK för Go för att autentisera till Azure med ett Huvudnamn för Azure-tjänsten med hjälp av antingen en hemlighet eller ett certifikat.

Azure-tjänstens huvudnamn definierar åtkomstprincipen och behörigheterna i en Microsoft Entra-klientorganisation, vilket aktiverar grundläggande funktioner som autentisering vid inloggning och auktorisering under resursåtkomst. De tar bort behovet av att använda personliga konton för att komma åt Azure-resurser. Du kan tilldela tjänstens huvudnamn de exakta behörigheter som krävs för din app och utveckla mot dessa behörigheter, i stället för att använda ett personligt konto, som kan ha fler behörigheter i klientorganisationen än vad appen kräver. Du kan också använda tjänstens huvudnamn för appar som finns lokalt och som behöver använda Azure-resurser. Azure SDK for Go Azure Identity-modulen är ett bekvämt sätt att autentisera till Azure med ett huvudnamn för tjänsten med hjälp av miljövariabler och en hemlighet eller ett certifikat.

Följ den här självstudien för att skapa och autentisera med Azure SDK för Go med hjälp av tjänstens huvudnamn.

Förutsättningar

  • Azure-prenumeration: Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

1. Skapa Azure-resurser

Innan du börjar skapar du en ny resursgrupp och key vault-instans.

az group create --name go-on-azure --location eastus

az keyvault create --location eastus --name <keyVaultName> --resource-group go-on-azure --enable-rbac-authorization

Ersätt <keyVaultName> med ett globalt unikt namn.

Anteckna egenskapen id från kommandots az keyvault create utdata. Du använder den i nästa avsnitt för att definiera omfånget för auktoriseringen för tjänstens huvudnamn. Värdet id har följande formulär: /subscriptions/<subscriptionId>/resourceGroups/go-on-azure/providers/Microsoft.KeyVault/vaults/<keyVaultName>.

2. Skapa ett Huvudnamn för Azure-tjänsten

Använd någon av följande tekniker för att skapa ett Huvudnamn för Azure-tjänsten och tilldela den rollen "Key Vault Secrets Officer" i nyckelvalvet:

Mer information om Azure-tjänstens huvudnamn finns i Objektet För tjänstens huvudnamn.

Tilldela rollen "Key Vault Secrets Officer" till tjänstens huvudnamn, ge den behörighet att skapa, läsa, uppdatera och ta bort hemligheter i nyckelvalvet. Mer information om inbyggda roller för Azure Key Vault finns i Ge åtkomst till Key Vault-nycklar, certifikat och hemligheter med en rollbaserad åtkomstkontroll i Azure. Mer information om inbyggda roller i Azure finns i Inbyggda Azure-roller.

Alternativ 1: Skapa ett Huvudnamn för Azure-tjänsten med en hemlighet

Kör följande kommandon för att skapa ett Huvudnamn för Azure-tjänsten och tilldela den rollen "Key Vault Secrets Officer" i nyckelvalvet.

az ad sp create-for-rbac --name <servicePrincipalName> --role "Key Vault Secrets Officer" --scope <keyVaultId>

Ersätt <servicePrincipalName> och <keyVaultId> med lämpliga värden.

passwordAnteckna egenskaperna , tenantoch appId från utdata. Du behöver dem i nästa avsnitt.

Det går inte att hämta lösenordet för tjänstens huvudnamn när det har skapats. Om du glömmer lösenordet kan du återställa autentiseringsuppgifterna för tjänstens huvudnamn.

Alternativ 2: Skapa ett Huvudnamn för Azure-tjänsten med ett certifikat

Kör följande kommandon för att skapa ett Azure-tjänsthuvudnamn som använder ett certifikat och tilldela det rollen "Key Vault Secrets Officer" i nyckelvalvet.

az ad sp create-for-rbac --name <servicePrincipalName> --create-cert --role "Key Vault Secrets Officer" --scope <keyVaultId>

Ersätt <servicePrincipalName> och <keyVaultId> med lämpliga värden.

fileWithCertAndPrivateKeyAnteckna egenskaperna , tenantIdoch appId från utdata. Du behöver dem i nästa avsnitt.

3. Autentisera till Azure med tjänstens huvudnamn

Med hjälp av DefaultAzureCredentialkan du undvika att skriva miljöspecifik kod för att autentisera till Azure. Med DefaultAzureCredentialkan du konfigurera autentiseringsuppgifterna för tjänstens huvudnamn genom att definiera miljövariabler.

Välj något av följande alternativ för att konfigurera autentiseringsuppgifterna för tjänstens huvudnamn:

Mer information om finns i DefaultAzureCredentialAzure-autentisering med Azure SDK for Go

Alternativ 1: Autentisera med en hemlighet

Definiera följande miljövariabler:

Variabelnamn Värde
AZURE_CLIENT_ID Program-ID för ett Huvudnamn för Azure-tjänsten
AZURE_TENANT_ID ID för programmets Microsoft Entra-klientorganisation
AZURE_CLIENT_SECRET Lösenord för Azure-tjänstens huvudnamn
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

Alternativ 2: Autentisera med ett certifikat

Variabelnamn Värde
AZURE_CLIENT_ID Program-ID för ett Huvudnamn för Azure-tjänsten
AZURE_TENANT_ID ID för programmets Microsoft Entra-klientorganisation
AZURE_CLIENT_CERTIFICATE_PATH Sökväg till en PEM- eller PKCS12-certifikatfil inklusive privat nyckel. Om du har följt stegen för Azure CLI är filen inte lösenordsskyddad. Om du har följt stegen för Azure PowerShell är filen lösenordsskyddad och du måste också ange AZURE_CLIENT_CERTIFICATE_PASSWORD miljövariabeln.
AZURE_CLIENT_CERTIFICATE_PASSWORD Lösenordet du angav när du skapade tjänstens huvudnamn. Behövs bara om du har följt stegen för Azure PowerShell.
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

Använd DefaultAzureCredential för att autentisera en resursklient

När du har angett miljövariablerna kan du använda DefaultAzureCredential i Azure Identity-modulen för att autentisera en resursklient. Följande kod visar hur du hämtar en instans av DefaultAzureCredential.

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

4. Skapa en nyckelvalvshemlighet med Go

Använd följande kodexempel för att kontrollera att tjänstens huvudnamn autentiserar till Azure och har rätt behörigheter till nyckelvalvet.

  1. Skapa en ny katalog med namnet go-on-azure i din hemkatalog.

    mkdir ~/go-on-azure
    
  2. Ändra till go-on-azure katalogen.

    cd ~/go-on-azure
    
  3. Kör go mod init för att skapa go.mod filen.

    go mod init go-on-azure
    
  4. Kör go get för att installera nödvändiga Go-moduler.

    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. Skapa en fil med namnet main.go och lägg till följande kod.

    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. Skapa en miljövariabel med namnet KEY_VAULT_NAME. Ange miljövariabelns värde till namnet på det Azure Key Vault som skapades tidigare.

    export KEY_VAULT_NAME=<keyVaultName>
    

    Ersätt <keyVaultName> med namnet på din Azure Key Vault-instans.

  7. go run Kör kommandot för att skapa den nya nyckelvalvshemligheten.

     go run main.go
    

    Vid lyckat resultat liknar utdata följande:

    Name: https://<keyVaultName>.vault.azure.net/secrets/ExamplePassword/1e697f71d0014761a65641226f2f057b, Value: hVFkk965BuUv
    

5. Rensa resurser

Om du inte längre vill använda de Azure-resurser som du skapade i den här artikeln är det bra att ta bort dem. Om du tar bort oanvända resurser kan du undvika löpande avgifter och hålla prenumerationen rensad. Det enklaste sättet att ta bort de resurser som du använde i den här självstudien är att ta bort resursgruppen.

az group delete --name go-on-azure --yes

Argumentet --yes instruerar kommandot att inte be om bekräftelse.

Föregående kommando utför en mjuk borttagning av nyckelvalvet i resursgruppen. Om du vill ta bort den permanent från din prenumeration anger du följande kommando:

az keyvault purge --name <keyVaultName> --no-wait

Ersätt <keyVaultName> med namnet på ditt nyckelvalv.

Slutligen bör du ta bort appregistreringen och tjänstens huvudnamn.

az ad app delete --id <servicePrincipalAppId>

Ersätt <servicePrincipalAppId> med app-ID:t för tjänstens huvudnamn.

Nästa steg