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ário | Recomendação |
|---|---|
| App rodando no Azure (VM, App Service, AKS) | Managed Identity |
| App rodando on-premises | App Registration + Certificate |
| CI/CD pipeline (GitHub Actions, Azure DevOps) | Workload Identity Federation |
| Integração com API de terceiros | App Registration + Secret/Certificate |
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.