IAM

App Registrations e Service Principals: identidade para aplicações no Azure

Quando uma aplicação precisa acessar recursos do Azure ou APIs da Microsoft, ela precisa de uma identidade. O Microsoft Entra ID oferece dois mecanismos relacionados: App Registration e Service Principal.

App Registration vs Service Principal

App Registration é o objeto global, o registro da aplicação no tenant. Define o que a aplicação é: nome, URLs de redirect, permissões necessárias, certificados e secrets.

Service Principal é a instância local. É o objeto que recebe permissões RBAC, aparece nos logs de auditoria e pode ser associado a Managed Identities.

A relação: um App Registration pode ter Service Principals em múltiplos tenants. Em um tenant single, geralmente um App Registration = um Service Principal.

Criando um App Registration

az ad app create \
  --display-name "minha-aplicacao-ia" \
  --sign-in-audience AzureADMyOrg

APP_ID=$(az ad app show --display-name "minha-aplicacao-ia" --query appId -o tsv)
az ad sp create --id $APP_ID

Client Secret vs Certificate

Client Secret: simples, menos seguro:

az ad app credential reset \
  --id $APP_ID \
  --append \
  --years 1

Certificate: recomendado para produção:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
az ad app credential reset \
  --id $APP_ID \
  --cert cert.pem \
  --append

Permissões de API

# Adicionar permissao para Microsoft Graph
az ad app permission add \
  --id $APP_ID \
  --api 00000003-0000-0000-c000-000000000000 \
  --api-permissions e1fe6dd8-ba31-4d61-89e7-88639da4683d=Role

az ad app permission admin-consent --id $APP_ID

Workload Identity Federation: sem secrets para CI/CD

Para GitHub Actions e outras plataformas CI/CD, use federação em vez de secrets:

az ad app federated-credential create \
  --id $APP_ID \
  --parameters '{
    "name": "github-actions-producao",
    "issuer": "https://token.actions.githubusercontent.com",
    "subject": "repo:empresa/repo:ref:refs/heads/main",
    "audiences": ["api://AzureADTokenExchange"]
  }'

No GitHub Actions:

- uses: azure/login@v1
  with:
    client-id: ${{ secrets.AZURE_CLIENT_ID }}
    tenant-id: ${{ secrets.AZURE_TENANT_ID }}
    subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    # Sem client-secret -- usa OIDC token do GitHub

Quando usar o que

CenárioRecomendação
App rodando no Azure (VM, App Service, AKS)Managed Identity
App rodando on-premisesApp Registration + Certificate
CI/CD pipeline (GitHub Actions, Azure DevOps)Workload Identity Federation
Integração com API de terceirosApp Registration + Secret/Certificate
Managed Identity é sempre preferível. Para qualquer recurso rodando no Azure, Managed Identity elimina a classe inteira de problemas de gestão de credenciais. Reserve App Registrations para o que genuinamente não pode usar Managed Identity.

Conclusão

App Registrations são necessários quando Managed Identity não é uma opção. Para tudo que roda no Azure, prefira sempre Managed Identity. Para pipelines CI/CD externos, Workload Identity Federation elimina secrets por completo. Client secrets devem ser o último recurso.