Partager via


Authentification Azure SDK pour Go avec un principal de service

Dans ce tutoriel, vous utilisez le Kit de développement logiciel (SDK) Azure pour Go pour vous authentifier auprès d’Azure avec un principal de service Azure à l’aide d’un secret ou d’un certificat.

Les principaux de service Azure définissent la stratégie d’accès et les autorisations dans un locataire Microsoft Entra, ce qui permet d’activer les fonctionnalités principales telles que l’authentification pendant l’authentification et l’autorisation pendant l’accès aux ressources. Ils suppriment la nécessité d’utiliser des compte personnel pour accéder aux ressources Azure. Vous pouvez affecter à un principal de service les autorisations exactes nécessaires à votre application et les développer par rapport à ces autorisations, plutôt que d’utiliser un compte personnel, qui peut avoir plus de privilèges dans votre locataire que l’application n’en a besoin. Vous pouvez également utiliser des principaux de service pour les applications hébergées localement qui doivent utiliser des ressources Azure. Le module Azure SDK pour Go Azure Identity offre un moyen pratique de s’authentifier auprès d’Azure avec un principal de service à l’aide de variables d’environnement et d’un secret ou d’un certificat.

Suivez ce tutoriel pour créer et vous authentifier avec Azure SDK pour Go en utilisant un principal de service.

Prérequis

  • Abonnement Azure : Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

1. Créer des ressources Azure

Avant de commencer, créez un groupe de ressources et une instance de coffre de clés.

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

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

Remplacez <keyVaultName> par un nom global unique.

Notez la id propriété à partir de la sortie de la az keyvault create commande. Vous l’utiliserez dans la section suivante pour définir l’étendue de l’autorisation pour le principal de service. La id valeur a la forme suivante : /subscriptions/<subscriptionId>/resourceGroups/go-on-azure/providers/Microsoft.KeyVault/vaults/<keyVaultName>.

2. Créer un principal de service Azure

Utilisez l’une des techniques suivantes pour créer un principal de service Azure et lui attribuer le rôle « Key Vault Secrets Bureau r » sur le coffre de clés :

Pour en savoir plus sur les principaux de service Azure, consultez Objet Principal de service.

L’attribution du rôle « Secrets key Vault Bureau r » au principal du service l’autorise à créer, lire, mettre à jour et supprimer des secrets dans le coffre de clés. Pour en savoir plus sur les rôles intégrés pour Azure Key Vault, consultez Fournir l’accès aux clés, certificats et secrets Key Vault avec un contrôle d’accès en fonction du rôle Azure. Pour en savoir plus sur les rôles intégrés dans Azure, consultez les rôles intégrés Azure.

Option 1 : Créer un principal de service Azure avec une clé secrète

Exécutez les commandes suivantes pour créer un principal de service Azure et lui attribuer le rôle « Key Vault Secrets Bureau r » sur le coffre de clés.

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

Remplacez <servicePrincipalName> et <keyVaultId> par les valeurs appropriées.

Notez les propriétés et tenantappId les passwordpropriétés de la sortie. Vous aurez besoin de ces informations dans la section suivante.

Après la création, le mot de passe du principal de service ne peut pas être récupéré. Si vous oubliez le mot de passe, vous pouvez réinitialiser les informations d’identification du principal de service.

Option 2 : Créer un principal de service Azure avec un certificat

Exécutez les commandes suivantes pour créer un principal de service Azure qui utilise un certificat et lui attribuer le rôle « Secrets key Vault Bureau r » sur le coffre de clés.

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

Remplacez <servicePrincipalName> et <keyVaultId> par les valeurs appropriées.

Notez les propriétés et tenantIdappId les fileWithCertAndPrivateKeypropriétés de la sortie. Vous aurez besoin de ces informations dans la section suivante.

3. S’authentifier auprès d’Azure avec un principal de service

En utilisant DefaultAzureCredential, vous pouvez éviter d’écrire du code spécifique à l’environnement pour l’authentification auprès d’Azure. Avec DefaultAzureCredential, vous pouvez configurer vos informations d’identification de principal de service en définissant des variables d’environnement.

Choisissez l’une des options suivantes pour configurer les informations d’identification de votre principal de service :

Pour plus d’informations sur DefaultAzureCredential, consultez Authentification Azure avec Azure SDK pour Go

Option 1 : S’authentifier avec une clé secrète

Définissez les variables d’environnement suivantes :

Nom de la variable Valeur
AZURE_CLIENT_ID ID d’application d’un principal de service Azure
AZURE_TENANT_ID ID du locataire Microsoft Entra de l’application
AZURE_CLIENT_SECRET Mot de passe du principal de service Azure
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

Option 2 : S’authentifier avec un certificat

Nom de la variable Valeur
AZURE_CLIENT_ID ID d’application d’un principal de service Azure
AZURE_TENANT_ID ID du locataire Microsoft Entra de l’application
AZURE_CLIENT_CERTIFICATE_PATH Chemin d’accès à un fichier de certificat PEM ou PKCS12, y compris une clé privée. Si vous avez suivi les étapes pour Azure CLI, le fichier n’est pas protégé par mot de passe. Si vous avez suivi les étapes d’Azure PowerShell, le fichier est protégé par mot de passe et vous devez également définir la AZURE_CLIENT_CERTIFICATE_PASSWORD variable d’environnement.
AZURE_CLIENT_CERTIFICATE_PASSWORD Mot de passe que vous avez entré lors de la création du principal de service. Nécessaire uniquement si vous avez suivi les étapes d’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>"

Utiliser DefaultAzureCredential pour authentifier un client de ressources

Après avoir défini les variables d’environnement, vous pouvez utiliser DefaultAzureCredential dans le module Azure Identity pour authentifier un client de ressources. Le code suivant montre comment obtenir une instance de DefaultAzureCredential.

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

4. Créer une clé secrète de coffre de clés avec Go

Utilisez l’exemple de code suivant pour vérifier que votre principal de service s’authentifie auprès d’Azure et dispose des autorisations appropriées pour le coffre de clés.

  1. Créez un répertoire appelé go-on-azure dans votre répertoire de base.

    mkdir ~/go-on-azure
    
  2. Accédez au répertoire go-on-azure.

    cd ~/go-on-azure
    
  3. Exécutez go mod init pour créer le fichier go.mod.

    go mod init go-on-azure
    
  4. Exécutez go get pour installer les modules Go nécessaires.

    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. Créez un fichier nommé main.go et ajoutez le code suivant.

    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. Créez une variable d’environnement nommée KEY_VAULT_NAME. Définissez la valeur de la variable d’environnement en spécifiant le nom du coffre Azure Key Vault créé précédemment.

    export KEY_VAULT_NAME=<keyVaultName>
    

    Remplacez <keyVaultName> par le nom de votre instance Azure Key Vault.

  7. Exécutez la go run commande pour créer le secret du coffre de clés.

     go run main.go
    

    En cas de réussite, la sortie est similaire à ce qui suit :

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

5. Nettoyer les ressources

Si vous ne souhaitez plus utiliser les ressources Azure que vous avez créées dans cet article, il est recommandé de les supprimer. La suppression de ressources inutilisées vous permet d’éviter d’entraîner des frais en cours et de conserver votre abonnement non limité. Le moyen le plus simple de supprimer les ressources que vous avez utilisées dans ce didacticiel consiste à supprimer le groupe de ressources.

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

L’argument --yes indique à la commande de ne pas demander de confirmation.

La commande précédente effectue une suppression réversible sur le coffre de clés dans le groupe de ressources. Pour le supprimer définitivement de votre abonnement, entrez la commande suivante :

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

Remplacez <keyVaultName> par le nom de votre coffre de clés.

Enfin, vous devez supprimer l’inscription de l’application et le principal de service.

az ad app delete --id <servicePrincipalAppId>

Remplacez <servicePrincipalAppId> par l’ID d’application de votre principal de service.

Étapes suivantes