Ověřování k prostředkům Azure z aplikací Go hostovaných v místním prostředí
Aplikace hostované mimo Azure (například místně nebo v datacentru třetí strany) by měly při přístupu k prostředkům Azure používat instanční objekt aplikace k ověřování v Azure. Objekty hlavního objektu služby aplikace se vytvářejí pomocí procesu registrace aplikace v Azure. Po vytvoření aplikačního principálu se pro vaši aplikaci vygeneruje ID klienta a klientský tajný klíč. ID klienta, tajný klíč klienta a ID vašeho tenanta se pak ukládají do proměnných prostředí, aby je mohli použít sada Azure SDK for Go k ověření aplikace v Azure za běhu.
Pro každé prostředí, ve které je aplikace hostovaná, by se měla vytvořit jiná registrace aplikace. To umožňuje nakonfigurovat pro každý instanční objekt oprávnění pro konkrétní prostředí a zajistit, aby aplikace nasazená do jednoho prostředí nemluvila s prostředky Azure, které jsou součástí jiného prostředí.
1. Registrace aplikace v Azure
Aplikaci je možné zaregistrovat v Azure pomocí webu Azure Portal nebo Azure CLI.
az ad sp create-for-rbac --name <app-name>
Výstup příkazu bude podobný následujícímu. Poznamenejte si tyto hodnoty nebo nechte toto okno otevřené, protože je budete potřebovat v dalších krocích a nebudete moct znovu zobrazit hodnotu hesla (tajný klíč klienta).
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
2. Přiřazení rolí k instančnímu objektu aplikace
Dále musíte určit, jaké role (oprávnění) vaše aplikace potřebuje k jakým prostředkům, a přiřadit tyto role k aplikaci. Role lze přiřadit na úrovni prostředku, skupiny prostředků nebo rozsahu předplatného. Tento příklad ukazuje, jak přiřadit role služebního hlavního objektu v rámci skupiny prostředků, protože většina aplikací seskupí všechny prostředky Azure do jedné skupiny prostředků.
Instančnímu objektu se přiřadí role v Azure pomocí příkazu az role assignment create.
az role assignment create --assignee {appId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
Pokud chcete získat názvy rolí, ke kterým je možné instanční objekt přiřadit, použijte příkaz az role definition list.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Pokud například chcete aplikačnímu objektu služby s appId 00001111-aaaa-2222-bbbb-3333cccc4444
povolit čtení, zápis a odstranění přístupu ke kontejnerům objektů blob a datům v Azure Storage ve všech účtech úložiště ve skupině prostředků msdocs-go-sdk-auth-example v předplatném s ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, přiřadili byste ho k roli Přispěvatel dat objektů blob úložiště pomocí následujícího příkazu.
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"
Informace o přiřazování oprávnění na úrovni prostředku nebo předplatného pomocí Azure CLI najdete v článku Přiřazení rolí Azure pomocí azure CLI.
3. Konfigurace proměnných prostředí pro aplikaci
Aby byly přihlašovací údaje hlavního objektu služby aplikace vašeho Go programu dostupné během běhu aplikace, musíte nastavit proměnné prostředí AZURE_CLIENT_ID
, AZURE_TENANT_ID
a AZURE_CLIENT_SECRET
pro proces, který vaši aplikaci spouští. Objekt DefaultAzureCredential
hledá informace o hlavním objektu služby v těchto proměnných prostředí.
Název proměnné | Hodnota |
---|---|
AZURE_CLIENT_ID |
ID aplikace hlavního objektu služby Azure |
AZURE_TENANT_ID |
ID tenanta aplikace Microsoft Entra |
AZURE_CLIENT_SECRET |
Heslo služebního účtu Azure |
- Bash
- PowerShell
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"
4. Implementace DefaultAzureCredential v aplikaci
K ověřování klientských objektů sady Azure SDK v Azure by vaše aplikace měla použít typ DefaultAzureCredential
z balíčku azidentity
.
Začněte tím, že do aplikace přidáte balíček azidentity
.
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Dále budete chtít pro jakýkoli kód v jazyce Go, který ve vaší aplikaci vytvoří instanci klienta Azure SDK:
- Importujte balíček
azidentity
. - Vytvořte instanci typu
DefaultAzureCredential
. - Předejte instanci typu
DefaultAzureCredential
do konstruktoru klienta sady Azure SDK.
Příklad je znázorněn v následujícím segmentu kódu.
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>)
}
Když výše uvedený kód vytvoří instanci DefaultAzureCredential
, potom DefaultAzureCredential
přečte proměnné prostředí AZURE_TENANT_ID
, AZURE_CLIENT_ID
a AZURE_CLIENT_SECRET
pro získání informací o aplikačním service principalu potřebném pro připojení k Azure.