Pular para o conteúdo principal

Auditoria de WebApps com Banco de Dados no Azure: Automatizando a Descoberta com PowerShell

 Recentemente, me deparei com uma demanda desafiadora: identificar todas as WebApps em diversas assinaturas do Azure que utilizam banco de dados. O cenário era comum — parte da equipe já havia saído da empresa, e não havia documentação consolidada. Foi aí que resolvi desenvolver um script PowerShell que pudesse me ajudar (e, futuramente, outros profissionais) a realizar essa auditoria de forma rápida e eficaz

- Objetivo

Automatizar o mapeamento de WebApps que utilizam banco de dados, identificando:

  • Nome da aplicação

  • Grupo de recursos

  • Tipo de banco utilizado (SQL Server, MySQL, PostgreSQL, Cosmos DB, MongoDB)

  • Origem da configuração (Connection String ou App Settings)

  • Nome da base de dados e usuário, se disponíveis

  • Stack (tecnologia usada na WebApp)

  • E tudo isso separado por assinatura

- Por que isso é importante?

  •  Facilita auditorias de segurança e conformidade

  • Ajuda na gestão de recursos e planejamento de custos

  • Fundamental para times de infraestrutura, governança e FinOps

  • Evita a dependência de conhecimento tácito de ex-funcionários

- O Script

Aqui está o script completo em PowerShell utilizando a CLI do Azure. Ele percorre todas as assinaturas, coleta informações de cada WebApp e gera um relatório em CSV com os dados mais relevantes:

=========================================================================

# Nome do arquivo de saída

$OutputFile = "webapps_database_auditoria.csv"


# Cabeçalho do CSV

"SubscriptionID,SubscriptionName,WebApp,ResourceGroup,UsaBancoDados,TipoBanco,Origem,NomeBase,Usuario,Stack" | Out-File -FilePath $OutputFile -Encoding utf8


# Login no Azure

Write-Host " Fazendo login no Azure..." -ForegroundColor Cyan

az login | Out-Null


# Lista todas as assinaturas

$subscriptions = az account list --query "[].{id:id, name:name}" -o json | ConvertFrom-Json


foreach ($sub in $subscriptions) {

    $subId = $sub.id

    $subName = $sub.name


    Write-Host " Assinatura: $subName ($subId)" -ForegroundColor Yellow

    az account set --subscription $subId | Out-Null


    # Lista Web Apps

    $webApps = az webapp list --subscription $subId --query "[].{Name:name, ResourceGroup:resourceGroup}" -o json | ConvertFrom-Json


    foreach ($app in $webApps) {

        $appName = $app.Name

        $resourceGroup = $app.ResourceGroup

        $usaBanco = "NÃO"

        $tipoBanco = ""

        $origem = ""

        $nomeBase = ""

        $usuario = ""

        $stack = ""


        # Tenta pegar o stack do app

        $appInfoRaw = az webapp show --name $appName --resource-group $resourceGroup -o json

        if ($appInfoRaw) {

            $appInfo = $appInfoRaw | ConvertFrom-Json

            if ($appInfo.siteConfig -ne $null) {

                $stack = $appInfo.siteConfig.linuxFxVersion

            }

        }


        # Verifica connection strings

        $connStrings = az webapp config connection-string list --name $appName --resource-group $resourceGroup -o json | ConvertFrom-Json

        foreach ($conn in $connStrings) {

            $valor = $conn.value.ToLower()


            if ($valor -match "database.windows.net") { $tipoBanco = "SQL Server" }

            elseif ($valor -match "postgres.database.azure.com") { $tipoBanco = "PostgreSQL" }

            elseif ($valor -match "mysql.database.azure.com") { $tipoBanco = "MySQL" }

            elseif ($valor -match "documents.azure.com" -or $valor -match "cosmos") { $tipoBanco = "Cosmos DB" }

            elseif ($valor -match "mongodb") { $tipoBanco = "MongoDB" }


            if ($tipoBanco -ne "") {

                $usaBanco = "SIM"

                $origem = "Connection Strings"


                if ($conn.value -match "initial catalog=([^;]+)") {

                    $nomeBase = $Matches[1]

                } elseif ($conn.value -match "database=([^;]+)") {

                    $nomeBase = $Matches[1]

                }


                if ($conn.value -match "user id=([^;]+)") {

                    $usuario = $Matches[1]

                } elseif ($conn.value -match "uid=([^;]+)") {

                    $usuario = $Matches[1]

                }


                break

            }

        }


        # Verifica app settings

        $appSettings = az webapp config appsettings list --name $appName --resource-group $resourceGroup -o json | ConvertFrom-Json

        foreach ($setting in $appSettings) {

            $valor = $setting.value.ToLower()


            if ($valor -match "database.windows.net") { $tipoBanco = "SQL Server" }

            elseif ($valor -match "postgres.database.azure.com") { $tipoBanco = "PostgreSQL" }

            elseif ($valor -match "mysql.database.azure.com") { $tipoBanco = "MySQL" }

            elseif ($valor -match "documents.azure.com" -or $valor -match "cosmos") { $tipoBanco = "Cosmos DB" }

            elseif ($valor -match "mongodb") { $tipoBanco = "MongoDB" }


            if ($tipoBanco -ne "") {

                $usaBanco = "SIM"

                if ($origem -eq "") { $origem = "Application Settings" }


                if ($setting.value -match "initial catalog=([^;]+)") {

                    $nomeBase = $Matches[1]

                } elseif ($setting.value -match "database=([^;]+)") {

                    $nomeBase = $Matches[1]

                }


                if ($setting.value -match "user id=([^;]+)") {

                    $usuario = $Matches[1]

                } elseif ($setting.value -match "uid=([^;]+)") {

                    $usuario = $Matches[1]

                }


                break

            }

        }


        # Linha do CSV

        "$subId,$subName,$appName,$resourceGroup,$usaBanco,$tipoBanco,$origem,$nomeBase,$usuario,$stack" | Out-File -FilePath $OutputFile -Append -Encoding utf8

    }

}


Write-Host "`n Concluído! Verifique o relatório: $OutputFile" -ForegroundColor Green

==============================================================

- Saída do Relatório

O script gera um arquivo chamado webapps_database_auditoria.csv com o seguinte formato:

SubscriptionID - xxxxxxxx
SubscriptionName - Dev-Subscription
WebApp - mywebapp
ResourceGroup - rg-dev-apps
UsaBancoDados - SIM
TipoBanco - PostgreSQL
Origem - AppSettings db_myapp
NomeBase - user_admin
Usuario Stack - DOTNETCORE
- Considerações Finais

Esse script pode ser facilmente adaptado para incluir mais tipos de bancos ou outras informações específicas que seu ambiente precise. 

Se você trabalha com ambientes em Azure e já precisou mapear serviços sem documentação, espero que esse script te ajude tanto quanto me ajudou.























Comentários

Postagens mais visitadas deste blog

Microsoft Authenticator agora suporta Passkeys: Como ativar e testar

 A autenticação de dois fatores (MFA) sempre foi uma das melhores práticas para proteger contas online. Agora, a Microsoft deu um passo além ao adicionar suporte nativo para Passkeys no Microsoft Authenticator . Essa atualização, lançada em janeiro de 2025, permite que os usuários façam login sem precisar de senhas tradicionais, utilizando métodos resistentes a phishing e mais convenientes, como biometria ou PIN. Neste artigo, vamos explorar o que são Passkeys, os benefícios desse novo recurso e como ativá-lo e testá-lo no Microsoft Authenticator . O que são Passkeys? As Passkeys são um método moderno de autenticação baseado no padrão FIDO2/WebAuthn , que permite que os usuários façam login de maneira segura sem precisar inserir senhas. Em vez disso, eles usam biometria (impressão digital ou reconhecimento facial), um PIN ou outro fator local para validar a identidade. Principais benefícios das Passkeys - Resistência a phishing: Como não há senhas para serem roubadas, ataques d...

Mudança no Processo de Exclusão de Usuário no Microsoft 365

 A Microsoft fez uma atualização importante no processo de exclusão de usuários no Microsoft 365 . Agora, ao excluir um usuário, os delegados (pessoas que têm acesso à caixa de correio e aos arquivos) terão apenas 30 dias para acessar o OneDrive do usuário excluído. O que muda? Prazo reduzido : O tempo de acesso aos arquivos foi limitado a 30 dias após a exclusão do usuário, o que significa que os dados ficam acessíveis por um período mais curto. Impacto nos Delegados : Antes, os delegados podiam acessar os dados por mais tempo. Agora, a Microsoft reduziu esse prazo para evitar o armazenamento prolongado de dados de usuários excluídos. Ação Rápida Necessária : Caso seja necessário manter os arquivos por mais tempo, a organização deve tomar providências para transferir ou arquivar esses dados antes que o acesso expire. Por que isso é importante? Essa mudança reflete um esforço da Microsoft para alinhar a gestão de dados com práticas de segurança mais rígidas, incentivando as empre...

Microsoft está removendo as permissões "Todos, exceto usuários externos" no OneDrive

 Já encontrou arquivos no OneDrive acessíveis para toda a sua organização, mesmo sem ter compartilhado intencionalmente? Isso acontece por conta da permissão "Todos, exceto usuários externos" (EEEU) , que permite o acesso interno sem restrições. Mas isso está prestes a mudar. - A partir de 10 de abril de 2025 , a Microsoft removerá a permissão EEEU dos sites raiz do OneDrive e das bibliotecas de documentos padrão, reduzindo o risco de compartilhamento acidental de dados. - Se seus aplicativos, processos ou usuários dependem dessa permissão, eles perderão o acesso assim que a alteração for aplicada. - No entanto, permissões diretas de arquivos e pastas não serão afetadas – quem já tem acesso explícito continuará com permissão. Muitas organizações deixam conteúdos abertos para todos os usuários internos sem perceber. Apesar de parecer inofensivo, isso aumenta riscos de segurança e pode levar à exposição involuntária de dados. O que você deve fazer? ✅ Revisar as permissões ...