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

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

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