Prácticas y herramientas para asegurar contenedores en todo su ciclo de vida: construcción de imágenes, runtime, orquestación y cumplimiento.
La seguridad de contenedores es un conjunto de prácticas, herramientas y políticas diseñadas para proteger aplicaciones containerizadas en todo su ciclo de vida. Abarca desde la construcción segura de imágenes hasta la detección de amenazas en tiempo de ejecución, pasando por la orquestación segura y el cumplimiento normativo.
A diferencia de la seguridad tradicional de aplicaciones, la seguridad de contenedores debe considerar múltiples capas: la imagen base, las dependencias, el runtime del contenedor, la orquestación y la infraestructura subyacente. Cada capa introduce vectores de ataque únicos que requieren controles específicos.
La seguridad de contenedores no es un complemento opcional — es una disciplina integral que debe integrarse en el pipeline de CI/CD desde el primer commit hasta la producción.
La seguridad comienza en el Dockerfile. Las imágenes base deben ser oficiales, mínimas y actualizadas. Las imágenes «distroless» o basadas en Alpine Linux reducen significativamente la superficie de ataque al eliminar shells, gestores de paquetes y herramientas innecesarias.
# ❌ Imagen insegura
FROM ubuntu:latest
RUN apt-get update && apt-get install -y curl
COPY . /app
USER root
CMD ["node", "app.js"]
# ✅ Imagen segura
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM gcr.io/distroless/nodejs20-debian12
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/src ./src
USER 65534
CMD ["src/app.js"]El escaneo debe ejecutarse en múltiples etapas: durante la construcción, antes del despliegue y periódicamente en registros. Herramientas como Trivy, Grype o Snyk identifican vulnerabilidades conocidas (CVEs) en el sistema operativo base y dependencias de aplicación.
# GitHub Actions - Escaneo con Trivy
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:${{ github.sha }}'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
exit-code: '1' # Falla el build si encuentra vulnerabilidades críticasLa firma de imágenes con cosign garantiza la integridad y procedencia. Implementa un modelo de «confianza cero» donde solo imágenes firmadas por claves autorizadas pueden ejecutarse en producción.
# Firmar imagen
cosign sign --key cosign.key myregistry/myapp:v1.0.0
# Verificar en admission controller
cosign verify --key cosign.pub myregistry/myapp:v1.0.0Falco monitorea el comportamiento del kernel en tiempo real, detectando actividades anómalas como accesos a archivos sensibles, escalación de privilegios o conexiones de red sospechosas.
# Regla Falco personalizada
- rule: Unexpected Network Connection
desc: Detect unexpected outbound connections
condition: >
(spawned_process and container and
(fd.typechar = 4 and fd.net != "127.0.0.1" and not fd.net in (allowed_networks)))
output: >
Unexpected network connection (user=%user.name container=%container.name
dest=%fd.rip:%fd.rport)
priority: WARNINGLos Pod Security Standards de Kubernetes definen tres niveles de políticas: Privileged, Baseline y Restricted. El nivel Restricted debe ser el estándar para cargas de trabajo de producción.
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-app
spec:
template:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 65534
fsGroup: 65534
seccompProfile:
type: RuntimeDefault
containers:
- name: app
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
resources:
limits:
memory: "128Mi"
cpu: "100m"Las network policies implementan microsegmentación, limitando la comunicación entre pods según etiquetas y namespaces. Por defecto, todo el tráfico debe estar denegado (deny-all) con excepciones explícitas.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-network-policy
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432Los secretos nunca deben embeberse en imágenes o variables de entorno planas. Herramientas como AWS Secrets Manager, HashiCorp Vault o Kubernetes Secrets con cifrado en reposo proporcionan gestión segura de credenciales.
# Uso seguro de secretos en Kubernetes
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
volumeMounts:
- name: tls-certs
mountPath: /etc/ssl/certs
readOnly: true
volumes:
- name: tls-certs
secret:
secretName: tls-certificates| Herramienta | Función | Fortaleza | Limitación |
|---|---|---|---|
| Trivy | Escaneo de vulnerabilidades | Rápido, múltiples formatos | Solo vulnerabilidades conocidas |
| Falco | Detección runtime | Tiempo real, altamente configurable | Curva de aprendizaje |
| OPA Gatekeeper | Políticas de admisión | Lenguaje declarativo potente | Complejidad para casos simples |
| cosign | Firma de imágenes | Integración nativa con registros | Requiere infraestructura PKI |
| Snyk | Escaneo comercial | Base de datos propietaria | Costo por desarrollador |
Los contenedores amplifican tanto beneficios como riesgos de seguridad. Una imagen vulnerable se replica instantáneamente a cientos de instancias. Un contenedor comprometido puede escalar lateralmente a través de la red del clúster. La inmutabilidad de contenedores es una ventaja de seguridad, pero solo si las imágenes base son seguras desde el origen.
Para equipos de staff+ engineering, la seguridad de contenedores no es solo cumplimiento — es arquitectura. Las decisiones sobre registros, políticas de admisión y detección de amenazas impactan directamente la postura de seguridad organizacional. La automatización de controles de seguridad en el pipeline reduce la fricción del desarrollador mientras mantiene estándares consistentes.
El costo de remediar vulnerabilidades crece exponencialmente: es significativamente más caro en producción que en desarrollo. La seguridad de contenedores shift-left convierte la seguridad de un bloqueador reactivo en un acelerador proactivo.
Plataforma de contenedores que empaqueta aplicaciones con todas sus dependencias en unidades portables y consistentes que se ejecutan igual en cualquier entorno.
Plataforma de orquestación de contenedores que automatiza el despliegue, escalado y gestión de aplicaciones containerizadas a escala, convirtiéndose en el estándar de facto para cloud native.
Integración de prácticas de seguridad en todo el ciclo de vida del desarrollo de software, automatizando controles de seguridad en el pipeline de CI/CD.
Prácticas para asegurar la integridad y seguridad de todas las dependencias, herramientas y procesos que componen el pipeline de desarrollo de software.
Repositorios para almacenar, versionar y distribuir imágenes de contenedores, desde registros públicos como Docker Hub hasta registros privados como ECR.