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ção | Descrição | Plataforma |
|---|---|---|
| Code scanning não habilitado | Repositórios sem CodeQL ou equivalente | GitHub, Azure DevOps |
| Secret scanning não habilitado | Repositórios sem varredura de segredos | GitHub |
| Dependabot não habilitado | Repositórios sem alertas de dependência | GitHub |
| Proteção de branch ausente | Branch padrão desprotegido | GitHub, Azure DevOps |
| Permissões excessivas | Conexões de serviço com permissões excessivas | Azure DevOps |
| Sem revisores obrigatórios | PRs podem fazer merge sem revisão | GitHub, Azure DevOps |
| Repositórios inativos com acesso | Repositórios obsoletos ainda acessíveis | GitHub |
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:
- Microsoft Defender for Cloud > DevOps Security
- Visualize o inventário unificado de todos os repositórios conectados
- Filtre por: Severidade (Crítica/Alta/Média/Baixa), Tipo de descoberta, Repositório
- 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:
- Defender for Cloud > Environment settings > GitHub connector
- Configure > Pull request annotations: Habilitar
- Limite de severidade: Alta e Crítica (ignorar Média/Baixa em PRs)
- Comportamento da anotação: Apenas comentário (não bloquear merge)
Para Azure DevOps:
- Defender for Cloud > Environment settings > Azure DevOps connector
- Configure > Pull request annotations: Habilitar
- 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:
- Defender for Cloud > Environment settings > Governance rules
- 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:
- Navegue até Defender for Cloud > Environment settings > GitHub connector
- Clique em "Reauthorize"
- Reinstale o Microsoft Defender for Cloud GitHub App se ele foi removido
- 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