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.
- da CLI do Azure
- Portal 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.
- da CLI do Azure
- portal do Azure
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
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_ID
e 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:
- Importe o pacote
azidentity
. - Crie uma instância do tipo
DefaultAzureCredential
. - 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_ID
e AZURE_CLIENT_SECRET
para obter as informações do principal de serviço da aplicação necessárias para conectar-se ao Azure.