Pular para o conteúdo principal

Desafio 45: Defender for Cloud DevOps Security

Habilidades do exame abordadas

  • Configurar Microsoft Defender for Cloud DevOps Security
  • Integrar GitHub Advanced Security com Microsoft Defender for Cloud

Cenário

A CISO da Contoso Ltd quer um painel único para todas as descobertas de segurança em seus 30 repositórios GitHub e 15 repositórios Azure DevOps. Atualmente, cada plataforma tem seu próprio painel de segurança, tornando impossível obter uma visão agregada de risco ou impor políticas de segurança consistentes. Você deve implementar o Microsoft Defender for Cloud DevOps Security para unificar o gerenciamento de postura de segurança em ambas as plataformas.

Pré-requisitos

  • Assinatura Azure com acesso de Contributor
  • Microsoft Defender for Cloud habilitado (plano Defender CSPM ou Defender for DevOps)
  • Organização GitHub com acesso de administrador
  • Organização Azure DevOps com acesso de Project Collection Administrator
  • Azure CLI instalado

Tarefas

Tarefa 1: Conectar organização GitHub ao Microsoft Defender for Cloud

# Ensure Microsoft Defender for Cloud is registered
az provider register --namespace Microsoft.Security

# Create a resource group for the DevOps connector
az group create --name rg-contoso-defender-devops --location eastus

# Navigate to Azure Portal:
# 1. Microsoft Defender for Cloud > Environment settings
# 2. Add environment > GitHub
# 3. Connector name: contoso-github-connector
# 4. Subscription: Select your subscription
# 5. Resource group: rg-contoso-defender-devops
# 6. Region: East US

# Authorize the connection:
# - Click "Authorize" to install the Microsoft Defender for Cloud GitHub App
# - Select the contoso organization
# - Choose repositories: All repositories (or select specific ones)

# Verify the connector via CLI
az security security-connector list \
--query "[?environmentName=='GitHub']" -o table

# Check connector health
az security security-connector show \
--name contoso-github-connector \
--resource-group rg-contoso-defender-devops \
--query "{name:name, state:properties.hierarchyIdentifier, health:properties.environmentData}"

Tarefa 2: Conectar organização Azure DevOps ao Defender for Cloud

# Navigate to Azure Portal:
# 1. Microsoft Defender for Cloud > Environment settings
# 2. Add environment > Azure DevOps
# 3. Connector name: contoso-azdo-connector
# 4. Subscription: Select your subscription
# 5. Resource group: rg-contoso-defender-devops
# 6. Region: East US

# Authorize the connection:
# - Sign in with Azure DevOps admin account
# - Select the contoso Azure DevOps organization
# - Choose projects: All projects (or select specific ones)
# - Grant consent to the Microsoft Defender for DevOps app

# Verify the connector
az security security-connector list \
--query "[?environmentName=='AzureDevOps']" -o table

# Alternative: Create connector via CLI (ARM template deployment)
az deployment group create \
--resource-group rg-contoso-defender-devops \
--template-file defender-devops-connector.json \
--parameters organizationName=contoso

Template ARM para o conector:

{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Security/securityConnectors",
"apiVersion": "2023-09-01-preview",
"name": "contoso-azdo-connector",
"location": "eastus",
"properties": {
"environmentName": "AzureDevOps",
"environmentData": {
"environmentType": "AzureDevOpsScope"
},
"hierarchyIdentifier": "<azdo-org-id>",
"offerings": [
{
"offeringType": "CspmMonitorAzureDevOps"
}
]
}
}
]
}

Tarefa 3: Configurar gerenciamento de postura de segurança DevOps

Após os conectores serem estabelecidos, configure o que será verificado:

# View DevOps security posture recommendations
az security assessment list \
--query "[?contains(resourceDetails.source, 'DevOps')]" -o table

# Configure auto-discovery of new repos (default is enabled)
# In Defender for Cloud > Environment settings > GitHub connector:
# - Auto-discovery: On (new repos automatically scanned)
# - Scanning frequency: Every 24 hours (default)

Verificações de postura de segurança que o Defender realiza automaticamente:

VerificaçãoDescriçãoPlataforma
Code scanning não habilitadoRepositórios sem CodeQL ou equivalenteGitHub, Azure DevOps
Secret scanning não habilitadoRepositórios sem varredura de segredosGitHub
Dependabot não habilitadoRepositórios sem alertas de dependênciaGitHub
Proteção de branch ausenteBranch padrão desprotegidoGitHub, Azure DevOps
Permissões excessivasConexões de serviço com permissões excessivasAzure DevOps
Sem revisores obrigatóriosPRs podem fazer merge sem revisãoGitHub, Azure DevOps
Repositórios inativos com acessoRepositórios obsoletos ainda acessíveisGitHub

Tarefa 4: Visualizar e classificar descobertas de segurança no painel do Defender

# Get all DevOps security recommendations
az security assessment list \
--query "[?contains(resourceDetails.source, 'DevOps')].{name:displayName, status:status.code, resource:resourceDetails.id}" -o table

# Get specific recommendation details
az security assessment show \
--name "<assessment-id>" \
--resource-group rg-contoso-defender-devops

# List all security alerts from DevOps sources
az security alert list \
--query "[?alertType=='DevOps']" -o table

No Portal do Azure:

  1. Microsoft Defender for Cloud > DevOps Security
  2. Visualize o inventário unificado de todos os repositórios conectados
  3. Filtre por: Severidade (Crítica/Alta/Média/Baixa), Tipo de descoberta, Repositório
  4. Para cada descoberta:
    • Visualize o código/configuração afetado
    • Veja a orientação de remediação
    • Atribua a um membro da equipe
    • Defina substituição de severidade se necessário

Tarefa 5: Configurar anotações de pull request do Defender

Habilite anotações de PR para que os desenvolvedores vejam as descobertas de segurança diretamente em seus pull requests:

Para GitHub:

  1. Defender for Cloud > Environment settings > GitHub connector
  2. Configure > Pull request annotations: Habilitar
  3. Limite de severidade: Alta e Crítica (ignorar Média/Baixa em PRs)
  4. Comportamento da anotação: Apenas comentário (não bloquear merge)

Para Azure DevOps:

  1. Defender for Cloud > Environment settings > Azure DevOps connector
  2. Configure > Pull request annotations: Habilitar
  3. Configure a extensão Microsoft Security DevOps Azure DevOps

Instale a extensão no Azure Pipelines:

# azure-pipelines.yml - Add security scanning with PR annotations
trigger:
- main

pool:
vmImage: 'ubuntu-latest'

steps:
- task: MicrosoftSecurityDevOps@1
displayName: 'Run Microsoft Security DevOps'
inputs:
categories: 'code,artifacts,IaC,containers'
# Tools included: Bandit, BinSkim, ESlint, Template Analyzer,
# Terrascan, Trivy, AntiMalware

Para GitHub Actions:

# .github/workflows/defender-scan.yml
name: Microsoft Defender for DevOps
on:
push:
branches: [main]
pull_request:
branches: [main]

permissions:
contents: read
security-events: write
id-token: write

jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Run Microsoft Security DevOps
uses: microsoft/security-devops-action@v1
id: msdo
with:
categories: 'code,artifacts,IaC,containers'

- name: Upload results to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: ${{ steps.msdo.outputs.sarifFile }}

Tarefa 6: Configurar alertas e políticas de segurança

Configure regras de alerta para descobertas de segurança críticas:

# Create an action group for security notifications
az monitor action-group create \
--name ag-security-critical \
--resource-group rg-contoso-defender-devops \
--short-name SecCritical \
--action email security-team security-team@contoso.com \
--action webhook security-webhook "https://contoso.webhook.office.com/webhookb2/..."

# Configure Defender for Cloud alert notifications
# Azure Portal > Defender for Cloud > Environment settings > Email notifications:
# - Recipients: security-team@contoso.com
# - Notification types: High and Critical severity
# - Alert types: All alert types
# - Frequency: Real-time for Critical, Daily digest for High

Crie uma Azure Policy para governança de segurança DevOps:

# Assign built-in policy: "GitHub repositories should have code scanning enabled"
az policy assignment create \
--name "require-code-scanning" \
--display-name "Require code scanning on all GitHub repos" \
--policy "/providers/Microsoft.Authorization/policyDefinitions/built-in-id" \
--scope "/subscriptions/<sub-id>/resourceGroups/rg-contoso-defender-devops"

# Assign built-in policy: "Azure DevOps repositories should have secret scanning enabled"
az policy assignment create \
--name "require-secret-scanning" \
--display-name "Require secret scanning on ADO repos" \
--policy "/providers/Microsoft.Authorization/policyDefinitions/built-in-id" \
--scope "/subscriptions/<sub-id>/resourceGroups/rg-contoso-defender-devops"

Tarefa 7: Integrar com Azure Policy para governança

Crie uma regra de governança para atribuir automaticamente as descobertas:

  1. Defender for Cloud > Environment settings > Governance rules
  2. Crie a regra:
    • Nome: "DevOps Critical Findings"
    • Escopo: Todos os conectores DevOps
    • Prioridade: 1
    • Condições: Severidade = Crítica
    • Proprietário: security-team@contoso.com
    • Prazo de remediação: 7 dias
    • Período de carência: 3 dias
    • Notificações: Email semanal
# View compliance status across all DevOps resources
az security regulatory-compliance-assessments list \
--query "[?contains(id, 'DevOps')]" -o table

# Export security posture data for reporting
az security assessment list \
--query "[?contains(resourceDetails.source, 'DevOps')]" \
-o json > devops-security-posture.json

Construa um painel de segurança no Azure Workbooks:

// KQL query for DevOps security findings over time
SecurityRecommendation
| where RecommendationName contains "DevOps" or RecommendationName contains "GitHub" or RecommendationName contains "Azure DevOps"
| summarize count() by RecommendationName, RecommendationState, bin(TimeGenerated, 1d)
| render timechart

Exercícios de quebra e conserto

Cenário de quebra 1: Conector GitHub mostra status "Disconnected"

O conector GitHub do Defender for Cloud mostra status não saudável e nenhuma nova descoberta está sendo coletada.

Causa: A autorização do GitHub App foi revogada por um administrador da organização, ou o aplicativo foi desinstalado da organização.

Diagnóstico:

# Check connector status
az security security-connector show \
--name contoso-github-connector \
--resource-group rg-contoso-defender-devops \
--query "properties.environmentData"
Mostrar solução

Correção:

  1. Navegue até Defender for Cloud > Environment settings > GitHub connector
  2. Clique em "Reauthorize"
  3. Reinstale o Microsoft Defender for Cloud GitHub App se ele foi removido
  4. Verifique no GitHub: Organization Settings > Installed GitHub Apps > Microsoft Defender for Cloud

Cenário de quebra 2: Anotações de PR não aparecem no Azure DevOps

A tarefa MicrosoftSecurityDevOps@1 executa com sucesso, mas nenhuma anotação aparece nos pull requests.

Causa: O pipeline está executando no push para main (não no trigger de PR), ou os resultados SARIF não estão sendo publicados corretamente.

Mostrar solução

Correção: Garanta que o pipeline é acionado em pull requests e publica os resultados:

trigger: none # Do not run on push
pr:
branches:
include:
- main

steps:
- task: MicrosoftSecurityDevOps@1
inputs:
categories: 'code,IaC'

# Results must be published for PR annotations to appear
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: '$(System.DefaultWorkingDirectory)/.gdn'
artifactName: 'SecurityResults'

Verificação de conhecimento

1. A Contoso quer visualizar descobertas de segurança de repositórios GitHub e Azure DevOps em um único painel. O que eles devem configurar?

2. Após conectar o GitHub ao Defender for Cloud, qual descoberta de postura de segurança o Defender detectaria automaticamente?

3. A Contoso quer que descobertas de segurança críticas em pull requests bloqueiem o merge. Qual configuração alcança isso para repositórios GitHub?

4. Qual é o principal benefício de conectar o Azure DevOps ao Microsoft Defender for Cloud comparado a usar apenas o GHAzDO (GitHub Advanced Security for Azure DevOps)?

Limpeza

# Remove the security connectors
az security security-connector delete \
--name contoso-github-connector \
--resource-group rg-contoso-defender-devops

az security security-connector delete \
--name contoso-azdo-connector \
--resource-group rg-contoso-defender-devops

# Delete resource group
az group delete --name rg-contoso-defender-devops --yes --no-wait

# Remove the GitHub App (Organization Settings > Installed GitHub Apps)
# Uninstall "Microsoft Defender for Cloud" app

# Remove the Azure DevOps extension
# Organization Settings > Extensions > Microsoft Security DevOps > Uninstall

# Clean up workflow files
rm -f .github/workflows/defender-scan.yml
git add -A && git commit -m "cleanup: remove challenge 45 Defender config" && git push