Autenticarsi alle risorse di Azure dalle app Go ospitate in sede
Le app ospitate al di fuori di Azure (ad esempio in locale o in un data center di terze parti) dovrebbero utilizzare un principal del servizio dell'applicazione per autenticarsi ad Azure quando accedono alle risorse di Azure. Gli oggetti principali del servizio dell'applicazione vengono creati utilizzando il processo di registrazione dell'applicazione in Azure. Quando viene creata un'entità servizio applicativa, verranno generati un ID client e un segreto del client per l'applicazione. L'ID client, il segreto client e l'ID tenant vengono quindi archiviati in variabili di ambiente in modo che possano essere usati da Azure SDK per Go per autenticare l'app in Azure in fase di esecuzione.
È necessario creare una registrazione dell'app diversa per ogni ambiente in cui l'app è ospitata. In questo modo è possibile configurare autorizzazioni di risorse specifiche dell'ambiente per ogni entità servizio e assicurarsi che un'app distribuita in un ambiente non parli con le risorse di Azure che fanno parte di un altro ambiente.
1 - Registrare l'applicazione in Azure
Un'app può essere registrata con Azure usando il portale di Azure o l'interfaccia della riga di comando di Azure.
- Azure CLI
- del portale di Azure
az ad sp create-for-rbac --name <app-name>
L'output del comando sarà simile al seguente. Prendere nota di questi valori o mantenere aperta questa finestra perché questi valori saranno necessari nei passaggi successivi e non sarà più possibile visualizzare di nuovo il valore della password (segreto del client).
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
2 - Assegnare ruoli al principale del servizio dell'applicazione
Successivamente, è necessario determinare i ruoli (autorizzazioni) necessari per l'app in base alle risorse e assegnare tali ruoli all'app. Ai ruoli può essere assegnato un ruolo in un ambito di risorsa, gruppo di risorse o sottoscrizione. Questo esempio illustra come assegnare ruoli per l'entità servizio nell'ambito del gruppo di risorse perché la maggior parte delle applicazioni raggruppa tutte le risorse di Azure in un singolo gruppo di risorse.
A un'entità servizio viene assegnata un ruolo in Azure usando il comando az role assignment create.
az role assignment create --assignee {appId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
Per ottenere i nomi di ruolo a cui è possibile assegnare un'entità servizio, usare il comando az role definition list.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Ad esempio, per consentire all'entità servizio con il valore appId di 00001111-aaaa-2222-bbbb-3333cccc4444
di leggere, scrivere ed eliminare contenitori BLOB e dati di Archiviazione di Azure in tutti gli account di archiviazione nel gruppo di risorse msdocs-go-sdk-auth-example nella sottoscrizione con ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, si deve assegnare l'entità servizio dell'applicazione al ruolo di Collaboratore ai dati blob di archiviazione utilizzando il comando seguente.
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"
Per informazioni sull'assegnazione di autorizzazioni a livello di risorsa o sottoscrizione tramite l'interfaccia della riga di comando di Azure, vedere l'articolo Assegnare ruoli di Azure usando l'interfaccia della riga di comando di Azure.
3 - Configurare le variabili di ambiente per l'applicazione
È necessario impostare le variabili di ambiente AZURE_CLIENT_ID
, AZURE_TENANT_ID
e AZURE_CLIENT_SECRET
per il processo che esegue l'app Go per rendere le credenziali dell'entità servizio dell'applicazione disponibili per l'app in fase di esecuzione. L'oggetto DefaultAzureCredential
cerca le informazioni sull'entità servizio in queste variabili di ambiente.
Nome variabile | Valore |
---|---|
AZURE_CLIENT_ID |
ID applicazione di un principale del servizio di Azure |
AZURE_TENANT_ID |
ID del tenant Microsoft Entra dell'applicazione |
AZURE_CLIENT_SECRET |
Password del principale del servizio di Azure |
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"
4 - Implementare DefaultAzureCredential nell'applicazione
Per autenticare gli oggetti client di Azure SDK su Azure, l'applicazione deve usare il tipo DefaultAzureCredential
del pacchetto azidentity
.
Per iniziare, aggiungere il pacchetto azidentity
all'applicazione.
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Successivamente, per tutto il codice Go che istanzia un client Azure SDK nella tua app, dovrai:
- Importare il pacchetto
azidentity
. - Creare un'istanza di tipo
DefaultAzureCredential
. - Passare l'istanza di tipo
DefaultAzureCredential
al costruttore del client Azure SDK.
Un esempio è illustrato nel segmento di codice seguente.
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 il codice precedente crea un'istanza di DefaultAzureCredential
, DefaultAzureCredential
legge le variabili di ambiente AZURE_TENANT_ID
, AZURE_CLIENT_ID
e AZURE_CLIENT_SECRET
per ottenere le informazioni sul principal del servizio applicativo necessarie per connettersi ad Azure.