Compartilhar via


Autenticar em recursos do Azure a partir de aplicações Go alojadas no local

As aplicações hospedadas fora do Azure (por exemplo, no local ou num centro de dados de terceiros) devem utilizar um principal de serviço de aplicação para se autenticar no Azure ao aceder a recursos do Azure. Os objetos principais do serviço de aplicativo são criados usando o processo de registro do aplicativo no Azure. Quando uma entidade de serviço de aplicativo é criada, um ID de cliente e uma chave secreta de cliente serão gerados para seu aplicativo. A ID do cliente, o segredo do cliente e a ID do locatário são armazenados em variáveis de ambiente para que possam ser usados pelo SDK do Azure para Go para autenticar seu aplicativo no Azure em tempo de execução.

Um registro de aplicativo diferente deve ser criado para cada ambiente em que o aplicativo está hospedado. Isso permite que permissões de recursos específicos do ambiente sejam configuradas para cada entidade de serviço e garante que um aplicativo implantado em um ambiente não converse com os recursos do Azure que fazem parte de outro ambiente.

1 - Registar a aplicação no Azure

Um aplicativo pode ser registrado no Azure usando o portal do Azure ou a CLI do Azure.

az ad sp create-for-rbac --name <app-name>

A saída do comando será semelhante à seguinte. Anote esses valores ou mantenha essa janela aberta, pois você precisará desses valores nas próximas etapas e não poderá visualizar o valor da senha (segredo do cliente) novamente.

{
  "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
  "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

2 - Atribuir funções à entidade de serviço do aplicativo

Em seguida, você precisa determinar quais funções (permissões) seu aplicativo precisa em quais recursos e atribuir essas funções ao seu aplicativo. As funções podem ser atribuídas num recurso, grupo de recursos ou no âmbito de uma subscrição. Este exemplo mostra como atribuir funções para a entidade de serviço no escopo do grupo de recursos, já que a maioria dos aplicativos agrupa todos os seus recursos do Azure em um único grupo de recursos.

Uma principal de serviço recebe uma função no Azure usando o comando az role assignment create.

az role assignment create --assignee {appId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

Para obter o nome de função ao qual uma entidade de serviço pode ser atribuída, use o comando az role definition list.

az role definition list \
    --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
    --output table

Por exemplo, para permitir que a entidade de serviço com o appId de leia, escreva e elimine o acesso a contentores e dados de blob de Armazenamento do Azure em todas as contas de armazenamento no grupo de recursos de msdocs-go-sdk-auth-example na subscrição com ID , deve atribuir a entidade de serviço de aplicação à função de Contribuidor de Dados de Blob de Armazenamento utilizando o comando seguinte.

az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-go-sdk-auth-example \
    --role "Storage Blob Data Contributor"

Para obter informações sobre como atribuir permissões no nível de recurso ou assinatura usando a CLI do Azure, consulte o artigo Atribuir funções do Azure usando a CLI do Azure.

3 - Configurar variáveis de ambiente para aplicação

Você deve definir as variáveis de ambiente AZURE_CLIENT_ID, AZURE_TENANT_IDe AZURE_CLIENT_SECRET para o processo que executa seu aplicativo Go, a fim de disponibilizar as credenciais de serviço ao seu aplicativo em tempo de execução. O objeto DefaultAzureCredential procura as informações do principal do serviço nessas variáveis de ambiente.

Nome da variável Valor
AZURE_CLIENT_ID ID do aplicativo de uma entidade de serviço do Azure
AZURE_TENANT_ID ID do inquilino da aplicação do Microsoft Entra
AZURE_CLIENT_SECRET Senha da entidade de serviço do Azure
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

4 - Implementar DefaultAzureCredential no aplicativo

Para autenticar objetos de cliente do SDK do Azure para o Azure, a sua aplicação deve usar o tipo de DefaultAzureCredential do pacote azidentity.

Comece adicionando o pacote azidentity ao seu aplicativo.

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

Em seguida, para qualquer código Go que instancie um cliente SDK do Azure em seu aplicativo, você deseja:

  1. Importe o pacote azidentity.
  2. Crie uma instância do tipo DefaultAzureCredential.
  3. Passe a instância do tipo DefaultAzureCredential para o construtor do cliente do SDK do Azure.

Um exemplo disso é mostrado no segmento de código a seguir.

import (
	"context"

	"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.NewDefaultAzureCredential(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>)
}

Quando o código acima instancia DefaultAzureCredential, DefaultAzureCredential lê as variáveis de ambiente AZURE_TENANT_ID, AZURE_CLIENT_IDe AZURE_CLIENT_SECRET para obter as informações do principal de serviço da aplicação necessárias para conectar-se ao Azure.