Pular para o conteúdo principal

🏃‍♂️ Runners, Execução Isolada e Ambientes Controlados

🌟 Objetivo

Garantir que todos os containers são executados em ambientes isolados, controlados e auditáveis, especialmente no contexto de pipelines CI/CD e execução automatizada de tarefas, mitigando riscos de:

  • Compromisso do host ou de outros jobs;
  • Escalada de privilégios;
  • Persistência de dados sensíveis entre execuções;
  • Utilização indevida de runners partilhados com permissões excessivas.

🧬 O que são runners e ambientes de execução

Runners são agentes de execução responsáveis por correr tarefas de CI/CD ou workloads de containers, tipicamente em plataformas como:

  • GitHub Actions (runners)
  • GitLab CI (runners)
  • Azure DevOps (agents)
  • Jenkins (executors)
  • Kubernetes Jobs, CronJobs ou pods temporários

Um ambiente isolado deve garantir:

  • Separação de namespaces (processo, rede, filesystem);
  • Zero persistência entre execuções;
  • Execução com utilizador não-root e permissões mínimas;
  • Capacidade limitada (ex: CPU, memória, storage).

⚠️ Runners partilhados e genéricos são ponto crítico de ataque se não forem isolados e verificados continuamente.


📘 Tipos de runners e níveis de risco

TipoExemplosRisco associadoNotas
Partilhado (multi-tenant)GitHub hosted, GitLab sharedElevado - superfície comumEvitar em pipelines críticas
Autogerido (on-prem/cloud)Azure DevOps agent, K8s podModerado - depende do hardeningIdeal se gerido com boas práticas
Ephemeral e dedicadosK8s jobs, ephemeral containersBaixo - isolamento totalRecriado por build, não partilhado

🛠️ Como aplicar execução isolada

  1. Evitar uso de runners partilhados para projetos críticos (L3);
  2. Executar containers em ambientes efémeros - destruídos após uso;
  3. Desativar privilégios no runtime (--privileged, --cap-add, --mount /var/run/docker.sock);
  4. Aplicar limites de recursos (CPU, RAM) e quotas;
  5. Validar que o utilizador de execução não tem permissões administrativas;
  6. Utilizar sandboxing (ex: gVisor, Kata Containers) quando aplicável;
  7. Controlar imagens utilizadas no runner (ver 01-imagens-base.md);
  8. Impedir acesso direto à rede ou storage externo sem validação explícita;
  9. Monitorizar execuções e registar métricas de isolamento e falhas.

📂 Onde e como configurar

PlataformaConfiguração de isolamento sugerida
GitHub ActionsUsar runners self-hosted com sandbox (ex: K8s), revogar após uso
Azure DevOpsAgentes em containers dedicados; evitar acesso a host
GitLab CIRunners Docker/Kubernetes com política de isolamento
JenkinsDocker plugin com --rm, --read-only, user não-root
KubernetesPods efémeros com securityContext, PodSecurity e PSA

✅ Boas práticas

  • Isolar por projeto/cliente: um runner por repositório ou namespace;
  • Recriar runners a cada execução (não persistir imagens ou cache);
  • Monitorizar tempo de execução, uso de disco e falhas de segurança;
  • Proibir acesso à rede interna sem validação explícita;
  • Utilizar labels e restrições para forçar execução segura (ex: no-root, trusted-image);
  • Integrar com enforcement de política via OPA/Kyverno.

📎 Referências cruzadas

DocumentoRelação com ambientes de execução
01-imagens-base.mdRunners devem usar imagens aprovadas
05-policies-runtime-opa.mdEnforcement de políticas de execução segura
06-sbom-containers.mdSBOM pode incluir runtime e dependências do runner
09-exemplo-pipeline-container.mdCaso prático de execução controlada
achievable-maturityUso de ambientes isolados é indicador de maturidade

🧱 A segurança do pipeline começa na segurança da execução. Runners mal configurados são portas abertas para comprometimento da supply chain.