Tipos de Aplicações no Microsoft Entra ID
O Entra ID suporta diversos tipos de aplicações, cada um com características e fluxos de autenticação específicos:
Aplicações Confidenciais vs. Públicas
- Aplicações Confidenciais: Podem armazenar segredos e credenciais de forma segura (p.ex., apps web no servidor)
- Aplicações Públicas: Não podem armazenar segredos de forma segura (p.ex., apps móveis, desktop, SPAs)
Por Padrão de Arquitetura
- Aplicações Web: Executadas num servidor web, acessíveis via browser
- Aplicações SPA (Single-page): Executadas no browser usando JavaScript/frameworks modernos
- Aplicações Nativas: Instaladas em dispositivos (desktop/móvel)
- Aplicações Daemon/Serviço: Executadas em segundo plano sem interação do utilizador
Identificação via Microsoft Graph
Para listar e categorizar aplicações no diretório:
# Conectar ao Microsoft Graph
Connect-MgGraph -Scopes "Application.Read.All"
# Obter todas as aplicações
$apps = Get-MgApplication -All
# Classificar aplicações por tipo
$appTypes = @()
foreach ($app in $apps) {
# Determinar se é confidencial ou pública
$isConfidential = $false
if ($app.PasswordCredentials.Count -gt 0 -or $app.KeyCredentials.Count -gt 0) {
$isConfidential = $true
}
# Determinar o tipo de plataforma
$isSPA = $false
$isNative = $false
$isWeb = $false
$isDaemon = $false
# Verificar pela plataforma registada
foreach ($redirect in $app.Spa.RedirectUris) {
if (-not [string]::IsNullOrEmpty($redirect)) {
$isSPA = $true
break
}
}
foreach ($redirect in $app.PublicClient.RedirectUris) {
if (-not [string]::IsNullOrEmpty($redirect)) {
$isNative = $true
break
}
}
foreach ($redirect in $app.Web.RedirectUris) {
if (-not [string]::IsNullOrEmpty($redirect)) {
$isWeb = $true
break
}
}
# Identificar aplicações daemon pela permissão de aplicação
$appPermissions = $app.RequiredResourceAccess |
ForEach-Object { $_.ResourceAccess } |
Where-Object { $_.Type -eq "Role" }
if ($appPermissions.Count -gt 0 -and $isConfidential) {
$isDaemon = $true
}
# Determinar o tipo principal
$primaryType = "Indeterminado"
if ($isDaemon) { $primaryType = "Daemon/Serviço" }
elseif ($isSPA) { $primaryType = "SPA" }
elseif ($isNative) { $primaryType = "Nativa" }
elseif ($isWeb) { $primaryType = "Web" }
$appTypes += [PSCustomObject]@{
DisplayName = $app.DisplayName
AppId = $app.AppId
IsConfidential = $isConfidential
IsSPA = $isSPA
IsNative = $isNative
IsWeb = $isWeb
IsDaemon = $isDaemon
PrimaryType = $primaryType
CreatedDateTime = $app.CreatedDateTime
}
}
# Exibir aplicações por tipo
$appTypes | Format-Table DisplayName, AppId, PrimaryType, IsConfidential -AutoSize
Resumo de Tipos de Aplicações no Diretório
Para gerar um resumo dos tipos de aplicações:
# Contagem por tipo principal
$typeCounts = $appTypes | Group-Object -Property PrimaryType | Select-Object Name, Count
# Contagem por característica
$confidentialCount = ($appTypes | Where-Object { $_.IsConfidential }).Count
$publicCount = ($appTypes | Where-Object { -not $_.IsConfidential }).Count
# Exibir resumo
Write-Output "=== Resumo de Tipos de Aplicações ==="
Write-Output "Total de Aplicações: $($apps.Count)"
Write-Output ""
Write-Output "Por Categoria de Segurança:"
Write-Output "- Aplicações Confidenciais: $confidentialCount"
Write-Output "- Aplicações Públicas: $publicCount"
Write-Output ""
Write-Output "Por Tipo de Plataforma:"
foreach ($type in $typeCounts) {
Write-Output "- $($type.Name): $($type.Count)"
}
Boas Práticas por Tipo de Aplicação
Aplicações Web (Confidenciais)
- Use secrets ou certificados com rotação regular
- Armazene segredos em Azure Key Vault ou gestores de segredos
- Implemente PKCE mesmo em aplicações confidenciais
Aplicações SPA (Públicas)
- Use fluxo de código de autorização com PKCE
- Evite o uso do fluxo implícito (deprecated)
- Implemente verificação de nonce para tokens
- Considere autenticação BFF (Backend-for-Frontend) para SPAs
Aplicações Nativas (Públicas)
- Use fluxo de código de autorização com PKCE
- Utilize broker de autenticação quando disponível
- Implemente proteção para tokens de atualização
Aplicações Daemon/Serviço (Confidenciais)
- Use credenciais de cliente ou certificados
- Atribua apenas as permissões mínimas necessárias
- Considere Managed Identities para serviços Azure
- Implemente monitorização para uso anómalo
Recomendações de Governança de Aplicações
- Verifique regularmente secretos e certificados para evitar expirações
- Remova aplicações não utilizadas ou obsoletas
- Audite permissões de aplicações, especialmente admin consent
- Implemente ciclo de vida claro para aplicações
- Considere Azure AD Conditional Access para aplicações críticas
- Use Application Proxy para aplicações locais legadas