Automatize a verificação de imagens de contêiner
As imagens de contêiner empacotam aplicativos juntamente com todas as suas dependências, tornando-os artefatos de implantação convenientes. No entanto, essa conveniência introduz desafios de segurança significativos — vulnerabilidades em imagens base, pacotes do sistema ou dependências de aplicativos podem comprometer contêineres implantados. A automatização da digitalização de imagens de contêiner durante todo o ciclo de vida de desenvolvimento e implantação garante que apenas imagens seguras e compatíveis cheguem aos ambientes de produção.
Noções básicas sobre os riscos de segurança do contêiner
As imagens de contêiner apresentam várias categorias de risco de segurança:
Vulnerabilidades de imagem de base
Pacotes do sistema operacional:
- Bibliotecas do sistema: As imagens base incluem bibliotecas do sistema operacional (glibc, OpenSSL, zlib) que podem conter vulnerabilidades.
- Gerenciadores de pacotes: Os gerenciadores de pacotes do sistema (apt, yum, apk) e seus pacotes frequentemente têm problemas de segurança.
- Utilitários Shell: Utilitários comuns (bash, curl, wget) em imagens de base podem ter vulnerabilidades.
- Atraso na atualização: As imagens de base oficiais podem incluir pacotes desatualizados entre lançamentos.
Impacto na seleção da imagem de base:
- Alpine vs Debian: As imagens de base do Alpine Linux são menores, mas usam bibliotecas diferentes (musl em vez de glibc), afetando os perfis de vulnerabilidade.
- Imagens distroless: As imagens distroless do Google contêm apenas as dependências de tempo de execução do aplicativo, reduzindo drasticamente a superfície de ataque.
- Variantes compactas: As variantes de imagem compactas excluem utilitários comuns, reduzindo o tamanho e a exposição a vulnerabilidades.
-
Moeda da versão: O uso de
latesttags pode introduzir alterações inesperadas, tags de versões específicas fornecem estabilidade, mas exigem atualizações manuais.
Vulnerabilidades de dependência de aplicativos
Pacotes específicos para cada idioma:
- Pacotes NPM: Node.js aplicativos trazem centenas de dependências do NPM que podem ter vulnerabilidades.
- Pacotes Python: Os aplicativos Python incluem pacotes PyPI com possíveis problemas de segurança.
- Dependências Java: As dependências Maven e Gradle incluem transitivamente muitos arquivos JAR.
- Pacotes .NET: Os pacotes NuGet em aplicativos .NET podem conter vulnerabilidades.
Dependências transitivas:
- Árvores de dependência profunda: As dependências de aplicativos têm suas próprias dependências, criando árvores de dependência profundas.
- Vulnerabilidades ocultas: As vulnerabilidades nas dependências transitivas são fáceis de ignorar sem verificação automatizada.
- Complexidade da atualização: A atualização de dependências transitivas requer a compreensão da compatibilidade em toda a cadeia de dependências.
Acumulação da camada de imagem
Sistema de arquivos em camadas:
- Herança de camadas: Cada instrução do Dockerfile cria uma nova camada, e vulnerabilidades em qualquer camada afetam a imagem final.
- Os arquivos excluídos persistem: Os arquivos excluídos em camadas posteriores ainda existem em camadas anteriores e contribuem para o tamanho da imagem e o perfil de segurança.
- Segredos na história: Segredos comprometidos acidentalmente com as camadas iniciais permanecem na história da imagem, mesmo que sejam removidos em camadas posteriores.
- Dependências em tempo de construção: As dependências necessárias apenas durante a compilação (compiladores, ferramentas de compilação) não devem aparecer nas imagens finais de tempo de execução.
Vulnerabilidades de configuração
Configurações incorretas do Dockerfile:
- Executando como root: Os contêineres executados como usuário raiz têm privilégios desnecessários.
- Portas expostas: As portas desnecessariamente expostas expandem a superfície de ataque.
- Binários SUID: Os binários SUID/SGID permitem ataques de escalonamento de privilégios.
- Padrões inseguros: As configurações padrão podem não seguir as práticas recomendadas de segurança.
Abordagens de varredura de contêineres
A segurança eficaz do contêiner requer a verificação em vários pontos do ciclo de vida:
Análise do registo
Monitorização contínua do registo: Os registros de contêiner fornecem locais centralizados para verificação e aplicação de políticas.
Análise do Registo de Contentores do Azure com o Microsoft Defender:
- Verificação automática: O Microsoft Defender for Containers verifica automaticamente as imagens enviadas por push para o Registro de Contêiner do Azure.
- Verificação baseada em gatilho: As varreduras são acionadas em operações push, import e pull.
- Revarredura contínua: As imagens são periodicamente verificadas em busca de vulnerabilidades recém-divulgadas.
- Recomendações: A Central de Segurança fornece recomendações de correção para vulnerabilidades descobertas.
Gatilhos de verificação do registro:
- Gatilhos de pressão: Novas imagens são verificadas automaticamente quando enviadas para o registro.
- Gatilhos de importação: As imagens importadas de registos externos são digitalizadas.
- Acionar gatilhos: As imagens são digitalizadas no prazo de 24 horas após serem extraídas.
- Reescan periódico: As imagens previamente verificadas são re-verificadas diariamente (últimos 90 dias para imagens enviadas, últimos 30 dias para imagens extraídas).
Verificação durante a construção
Integração de pipeline CI/CD: A varredura durante a criação das imagens identifica vulnerabilidades antes que as imagens cheguem aos registos.
Verificação de contêiner do Azure Pipelines:
trigger:
branches:
include:
- main
pool:
vmImage: "ubuntu-latest"
variables:
imageName: "myapp"
dockerfilePath: "$(Build.SourcesDirectory)/Dockerfile"
steps:
- task: Docker@2
displayName: "Build container image"
inputs:
command: "build"
repository: "$(imageName)"
dockerfile: "$(dockerfilePath)"
tags: "$(Build.BuildNumber)"
- task: AquaScannerCLI@4
displayName: "Scan image with Aqua Security"
inputs:
image: "$(imageName):$(Build.BuildNumber)"
scanType: "local"
register: false
hideBase: false
showNegligible: false
- script: |
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(Build.SourcesDirectory):/src \
aquasec/trivy image \
--severity HIGH,CRITICAL \
--exit-code 1 \
$(imageName):$(Build.BuildNumber)
displayName: "Scan with Trivy (fail on high/critical)"
- task: Docker@2
displayName: "Push image to registry"
condition: succeeded()
inputs:
command: "push"
repository: "$(imageName)"
tags: "$(Build.BuildNumber)"
Verificação de contentores do GitHub Actions:
name: Container Build and Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
IMAGE_NAME: myapp
REGISTRY: ghcr.io
jobs:
build-and-scan:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
security-events: write
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build container image
uses: docker/build-push-action@v4
with:
context: .
load: true
tags: ${{ env.IMAGE_NAME }}:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Scan image with Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: "${{ env.IMAGE_NAME }}:${{ github.sha }}"
format: "sarif"
output: "trivy-results.sarif"
severity: "CRITICAL,HIGH"
- name: Upload Trivy results to GitHub Security
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: "trivy-results.sarif"
- name: Scan with Snyk
uses: snyk/actions/docker@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
image: ${{ env.IMAGE_NAME }}:${{ github.sha }}
args: --severity-threshold=high --file=Dockerfile
- name: Log in to GitHub Container Registry
if: github.event_name == 'push'
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push image to registry
if: github.event_name == 'push'
run: |
docker tag ${{ env.IMAGE_NAME }}:${{ github.sha }} \
${{ env.REGISTRY }}/${{ github.repository }}:${{ github.sha }}
docker push ${{ env.REGISTRY }}/${{ github.repository }}:${{ github.sha }}
Verificação de contêiner do GitHub Advanced Security: O GitHub Advanced Security fornece recursos adicionais de segurança de contêiner por meio do CodeQL e da verificação de dependência.
name: Container Security with GitHub Advanced Security
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: "0 0 * * 0" # Weekly scheduled scan
env:
IMAGE_NAME: myapp
REGISTRY: ghcr.io
jobs:
build-and-scan:
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
packages: write
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: "javascript" # Adjust based on your language
- name: Build container image
run: |
docker build -t ${{ env.IMAGE_NAME }}:${{ github.sha }} .
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:javascript"
- name: Run CodeQL container scanning
uses: github/codeql-action/analyze@v2
with:
category: "/language:dockerfile"
- name: Scan container dependencies
uses: anchore/scan-action@v3
with:
image: ${{ env.IMAGE_NAME }}:${{ github.sha }}
fail-build: true
severity-cutoff: high
- name: Upload Anchore scan SARIF report
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: results.sarif
- name: Push image to registry
if: github.event_name == 'push'
run: |
echo ${{ secrets.GITHUB_TOKEN }} | docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin
docker tag ${{ env.IMAGE_NAME }}:${{ github.sha }} ${{ env.REGISTRY }}/${{ github.repository }}:${{ github.sha }}
docker push ${{ env.REGISTRY }}/${{ github.repository }}:${{ github.sha }}
Benefícios da verificação em tempo de construção:
- Falha rápida: Impeça que imagens vulneráveis sejam criadas e publicadas em repositórios.
- Comentários dos desenvolvedores: Forneça feedback imediato aos desenvolvedores durante o processo de compilação.
- Aplicação da política: Aplique políticas de segurança antes que as imagens cheguem aos registros ou à produção.
- Validação de artefato de construção: Garanta que apenas imagens compatíveis progridam através do pipeline de implantação.
Verificação em tempo de execução
Monitoramento de contêiner implantado: A verificação em tempo de execução deteta vulnerabilidades em contêineres realmente implantados.
Controladores de admissão do Kubernetes: Os controladores de admissão aplicam políticas antes que os contêineres sejam implantados em clusters do Kubernetes.
Exemplo de política do OPA Gatekeeper:
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredscanstatus
spec:
crd:
spec:
names:
kind: K8sRequiredScanStatus
validation:
openAPIV3Schema:
type: object
properties:
maxSeverity:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredscanstatus
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
not scan_clean(container.image)
msg := sprintf("Image %v has not been scanned or has vulnerabilities", [container.image])
}
scan_clean(image) {
# Query registry for scan status
# This is simplified; actual implementation queries scan results
scan_result := data.scans[image]
scan_result.status == "passed"
}
Proteção de tempo de execução do Serviço Kubernetes do Azure: O Microsoft Defender for Containers fornece deteção de ameaças em tempo de execução:
- Análise comportamental: Monitora o comportamento do contêiner para detetar atividades anômalas.
- Informações sobre ameaças: Compara comportamentos observados com padrões de ataque conhecidos.
- Mapeamento MITRE ATT&CK: Mapeia ameaças detetadas para a estrutura MITRE ATT&CK.
- Geração de alertas: Gera alertas de segurança para atividades suspeitas de contêineres.
Ferramentas de varredura de contêineres
Trivy (Aqua Security)
Trivy é um scanner de vulnerabilidade de contêiner de código aberto abrangente.
Principais funcionalidades:
- Varredura abrangente: Analisa pacotes de sistema operativo, dependências de aplicações, configurações de IaC e informações sigilosas.
- Suporte multi-formato: Analisa imagens de contentores, sistemas de ficheiros, repositórios git e clusters Kubernetes.
- Análise offline: Pode operar em ambientes isolados com bancos de dados de vulnerabilidade offline.
- Desempenho rápido: Scanner leve com tempos de verificação rápidos.
- Geração de SBOM: Gera lista de materiais de software nos formatos CycloneDX e SPDX.
Integração do Azure Pipelines Trivy:
- script: |
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
trivy image \
--severity HIGH,CRITICAL \
--exit-code 1 \
--no-progress \
--format json \
--output trivy-results.json \
$(imageName):$(Build.BuildNumber)
displayName: "Scan image with Trivy"
Snyk Container
Snyk Container fornece digitalização de imagens de container integrado na plataforma da Snyk focada em desenvolvedores.
Principais funcionalidades:
- Recomendações de imagem base: Sugere imagens de base alternativas com menos vulnerabilidades.
- Priorização: Prioriza vulnerabilidades com base na capacidade de exploração e no impacto nos negócios.
- Orientação de correção: Fornece etapas específicas de correção para vulnerabilidades descobertas.
- Integração com Kubernetes: Verifica imagens implantadas em clusters do Kubernetes.
Aqua Segurança
O Aqua Security oferece segurança de contentores de nível empresarial durante todo o ciclo de vida.
Principais funcionalidades:
- Garantia de imagem: Digitalização de imagens abrangente com políticas personalizáveis.
- Proteção de tempo de execução: Monitora a execução de contêineres em busca de comportamento suspeito.
- Verificação da conformidade: Valida imagens em relação ao CIS Docker Benchmark e políticas personalizadas.
- Segurança da cadeia de abastecimento: Verifica a proveniência da imagem e deteta ataques à cadeia de abastecimento.
Motor de ancoragem
O Anchore Engine é um scanner de imagem de contêiner de código aberto com análise baseada em políticas.
Principais funcionalidades:
- Orientado por políticas: Motor de políticas flexível para definir regras de segurança e conformidade.
- Inspeção profunda: Analisa camadas de imagem, pacotes e configuração.
- Políticas personalizadas: Defina políticas de segurança e conformidade específicas da organização.
- Orientado por API: API REST para integração com ferramentas personalizadas.
GitHub Advanced Security
O GitHub Advanced Security fornece recursos de segurança de nível empresarial para repositórios, incluindo recursos de verificação de contêineres.
Recursos de segurança do contêiner:
- Varredura de dependências: Deteta automaticamente dependências vulneráveis em imagens de contentores.
- Verificação de segredos: Identifica segredos expostos (chaves de API, tokens, credenciais) em camadas de contentor e ficheiros Docker.
- Verificação de código: Análise CodeQL de Dockerfiles e código de aplicação dentro de contêineres.
- Avisos de segurança: Integração com o GitHub Advisory Database para inteligência de vulnerabilidade.
- Segurança da cadeia de abastecimento: Gráfico de dependência e integração Dependabot para dependências de contêiner.
Executando CodeQL em contêineres: O GitHub Advanced Security suporta a execução da verificação de código CodeQL em ambientes de contêiner para uma análise abrangente:
Fluxo de trabalho de verificação de contêiner CodeQL:
name: CodeQL Container Analysis
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
analyze-container:
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ["javascript", "python"]
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
queries: security-extended,security-and-quality
- name: Build application in container
run: |
docker build -t app:latest .
docker create --name temp-container app:latest
docker cp temp-container:/app/built-artifacts ./artifacts
docker rm temp-container
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{ matrix.language }}"
- name: Scan Dockerfile
uses: github/codeql-action/analyze@v2
with:
category: "/language:dockerfile"
Varredura secreta para contêineres:
name: Container Secret Scanning
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
scan-secrets:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Build container image
run: docker build -t myapp:${{ github.sha }} .
- name: Scan image for secrets
uses: trufflesecurity/trufflehog@main
with:
path: ./
base: ${{ github.event.repository.default_branch }}
head: HEAD
- name: Scan container layers for secrets
run: |
docker save myapp:${{ github.sha }} -o image.tar
docker run --rm -v $(pwd):/scan \
trufflesecurity/trufflehog:latest \
filesystem /scan/image.tar \
--json > secrets-report.json
- name: Upload secret scan results
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: secrets-report.sarif
Benefícios do GitHub Advanced Security:
- Integração nativa: Profundamente integrado com fluxos de trabalho e recursos de segurança do GitHub.
- Painel unificado: Visão geral da segurança centralizada na guia Segurança do GitHub.
- Aplicação da política: As regras de proteção de sucursais podem exigir a aprovação em verificações de segurança.
- Relatórios de conformidade: Relatórios de conformidade integrados para SOC 2, ISO 27001 e outras estruturas.
- Colaboração em equipa: Descobertas de segurança integradas em revisões de solicitação pull e rastreamento de problemas.
Ativando a Segurança Avançada do GitHub:
Para as organizações:
- Navegue até Configurações da organização → Segurança e análise de código.
- Habilite a Segurança Avançada do GitHub para todos os repositórios ou para alguns repositórios.
- Configure alertas Dependabot, varredura secreta e verificação de código.
- Configure políticas de segurança e avisos de segurança.
Para repositórios:
- Vá para Configurações do repositório → Segurança e análise de código.
- Habilite o gráfico de dependência (gratuito para repositórios públicos).
- Habilite alertas eatualizações de segurança do Dependabot.
- Habilite a verificação secreta (requer licença de segurança avançada do GitHub para repositórios privados).
- Habilite a verificação de código com o CodeQL ou ferramentas de terceiros.
Segurança avançada para registos de contentores:
name: Registry Security Monitoring
on:
schedule:
- cron: "0 */6 * * *" # Every 6 hours
workflow_dispatch:
jobs:
scan-registry:
runs-on: ubuntu-latest
permissions:
packages: read
security-events: write
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull images from registry
run: |
docker pull ghcr.io/${{ github.repository }}/app:latest
docker pull ghcr.io/${{ github.repository }}/app:staging
- name: Scan registry images
uses: aquasecurity/trivy-action@master
with:
image-ref: "ghcr.io/${{ github.repository }}/app:latest"
format: "sarif"
output: "trivy-registry.sarif"
- name: Upload scan results
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: trivy-registry.sarif
category: "registry-scan"
- name: Check for critical vulnerabilities
run: |
CRITICAL_COUNT=$(docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image \
--severity CRITICAL \
--format json \
ghcr.io/${{ github.repository }}/app:latest | \
jq '.Results[].Vulnerabilities | length')
if [ "$CRITICAL_COUNT" -gt 0 ]; then
echo "::error::Found $CRITICAL_COUNT critical vulnerabilities"
exit 1
fi
Integração com recursos de segurança do GitHub:
- Visão geral de segurança: Painel de segurança em toda a organização mostrando vulnerabilidades de contêiner.
- Alertas de segurança: Alertas automatizados para dependências de contêineres vulneráveis.
- Atualizações do Dependabot: Solicitações pull automatizadas para atualizar imagens de base vulneráveis e dependências.
- Integração de proprietários de código: Encaminhe as descobertas de segurança para as equipes apropriadas por meio do arquivo CODEOWNERS.
- Logs de auditoria: Registo de auditoria completo de eventos de segurança e ações de remediação.
Práticas recomendadas para varredura de contentores
Implementar construções de vários estágios
Separe as dependências de compilação e tempo de execução:
# Build stage
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Runtime stage
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]
Benefícios:
- Imagens menores: As imagens de tempo de execução não incluem ferramentas de construção e artefatos intermédios.
- Menos vulnerabilidades: As dependências de compilação (compiladores, SDKs) não aparecem nas imagens finais.
- Melhor desempenho: Imagens menores empurram, puxam e começam mais rápido.
Use imagens de base mínimas
Escolha as imagens de base apropriadas:
- Alpine: Imagem base leve (~5 MB) com superfície de ataque mínima.
- Distroles: Contém apenas dependências de aplicativo e tempo de execução, sem shell ou gerenciador de pacotes.
-
Variantes finas: As variantes oficiais
*-slimexcluem utilitários desnecessários. -
Versões específicas: Use tags de versão específicas em vez de
latestpara reprodutibilidade.
Exemplo de imagem distroless:
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o myapp .
FROM gcr.io/distroless/static-debian11
COPY --from=builder /app/myapp /
USER nonroot:nonroot
CMD ["/myapp"]
Escaneie cedo e com frequência
Frequência de varredura:
- Estação de trabalho do desenvolvedor: Analise imagens localmente antes de confirmar.
- Validação de pull request: Verificar nos pipelines de CI em cada pedido de pull.
- A filial principal constrói: Varreduras abrangentes em fusões de filiais principais.
- Admissão de registo: Digitalizar imagens antes de as aceitar em registos.
- Nova verificação agendada: Analise periodicamente as imagens armazenadas em busca de vulnerabilidades recém-divulgadas.
- Pré-implantação: Validação final antes da implantação na produção.
Implementar portas de segurança
Pontos de aplicação da política:
- task: Trivy@1
inputs:
image: "$(imageName):$(Build.BuildNumber)"
severityThreshold: "HIGH"
exitCode: 1
displayName: "Security gate: block high/critical vulnerabilities"
Exemplos de portões:
- Gravidade da vulnerabilidade: Falhas em compilações com vulnerabilidades críticas ou de alta gravidade.
- Conformidade com a licença: Bloqueie imagens com licenças proibidas.
- Problemas de configuração: Impeça a implantação de imagens em execução como root.
- Deteção de segredos: Ocorre uma falha se segredos forem detetados nas camadas da imagem.
Automatizar a remediação
Atualizações automatizadas:
- Dependabot para Dockerfiles: Habilite o Dependabot para atualizar as versões e dependências da imagem base no Dockerfiles.
- Reconstruções automatizadas: Configure pipelines para reconstruir imagens automaticamente quando as imagens base forem atualizadas.
- Automação de patches: Use ferramentas para corrigir automaticamente imagens de base ou dependências.
- Pipelines de teste: Garanta que as atualizações automatizadas acionem testes abrangentes.
Configuração do GitHub Dependabot para Docker:
version: 2
updates:
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
Manter o histórico de resultados da verificação
Acompanhamento e tendências:
- Relatórios centralizados: A verificação agregada resulta em painéis centralizados.
- Análise de tendências: Rastreie as contagens de vulnerabilidade ao longo do tempo para medir a postura de segurança.
- Auditorias de conformidade: Mantenha o histórico de resultados da verificação para obter evidências de conformidade.
- Arquivo SBOM: Lista de materiais do software de arquivamento para imagens implantadas.
Implementar assinatura de imagem
Verifique a proveniência da imagem:
- task: Docker@2
inputs:
command: "sign"
arguments: "--key $(signingKey) $(imageName):$(Build.BuildNumber)"
displayName: "Sign container image"
- script: |
docker trust inspect --pretty $(imageName):$(Build.BuildNumber)
displayName: "Verify image signature"
Benefícios da assinatura de imagem:
- Verificação da proveniência: Confirme imagens originadas de fontes confiáveis.
- Deteção de adulteração: Detete se as imagens foram modificadas após a assinatura.
- Aplicação da política: Implante apenas imagens assinadas em ambientes de produção.
A automatização da verificação de imagens de contêiner em todo o ciclo de vida de desenvolvimento e implantação garante a deteção abrangente de vulnerabilidades e a aplicação de políticas. Com a varredura antecipada, a varredura frequente e a implementação de remediação automatizada, as organizações podem manter implantações de contêineres seguras sem sacrificar a velocidade de desenvolvimento. A próxima unidade examina como interpretar e priorizar alertas de ferramentas de verificação de segurança.