privileged: true en producción. Riesgo de escape de contenedor.| Política | Tipo | Descripción | production | staging | dev |
|---|---|---|---|---|---|
require-resource-limits |
Validate | CPU y memory limits obligatorios en todos los Pods | ENFORCE | AUDIT | AUDIT |
disallow-privileged |
Validate | Bloquea contenedores con privileged: true |
ENFORCE | ENFORCE | AUDIT |
disallow-latest-tag |
Validate | Prohíbe tag :latest — pin obligatorio de versión |
ENFORCE | ENFORCE | AUDIT |
require-labels |
Validate | Labels team y app requeridos en Deployments/StatefulSets |
ENFORCE | AUDIT | OFF |
add-security-defaults |
Mutate | Inyecta runAsNonRoot, allowPrivilegeEscalation: false, drop ALL caps |
ENFORCE | ENFORCE | ENFORCE |
add-default-resources |
Mutate | Aplica limits (512Mi/500m) y requests (256Mi/100m) si no definidos | ENFORCE | ENFORCE | ENFORCE |
add-pull-secret |
Mutate | Inyecta imagePullSecrets para imágenes en ghcr.io/dataflow-analytics/* |
ENFORCE | ENFORCE | OFF |
generate-default-networkpolicy |
Generate | Crea NetworkPolicy deny-all al crear cualquier Namespace | ENFORCE | ENFORCE | AUDIT |
generate-quota |
Generate | Crea ResourceQuota (4CPU/8Gi req — 8CPU/16Gi limits — 50 pods) por namespace | ENFORCE | ENFORCE | AUDIT |
verify-images |
VerifyImage | Verifica firma cosign (keyless) para ghcr.io/dataflow-analytics/* |
ENFORCE | AUDIT | OFF |
Bloquea cualquier Pod que solicite modo privilegiado. Se aplica en producción y staging con acción Enforce para prevención inmediata.
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: disallow-privileged annotations: policies.kyverno.io/severity: critical policies.kyverno.io/team: dataflow-platform spec: validationFailureAction: Enforce rules: - name: no-privileged match: any: - resources: kinds: ["Pod"] namespaces: ["production", "staging"] validate: message: "Privileged containers not allowed." pattern: spec: containers: - securityContext: privileged: "!true"
Inyecta automáticamente defaults de seguridad en todos los Pods — los desarrolladores no necesitan recordar el boilerplate de seguridad.
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: add-security-defaults spec: rules: - name: add-run-as-nonroot match: any: - resources: kinds: ["Pod"] mutate: patchStrategicMerge: spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - (name): "*" securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"]
Crea automáticamente una NetworkPolicy deny-all en cada nuevo Namespace. Aísla el tráfico por defecto — explícito para permitir.
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: generate-default-networkpolicy spec: rules: - name: default-deny-ingress match: any: - resources: kinds: ["Namespace"] generate: synchronize: true apiVersion: networking.k8s.io/v1 kind: NetworkPolicy name: default-deny namespace: "{{ request.object.metadata.name }}" data: spec: podSelector: {} policyTypes: - Ingress
Verifica firma cosign (keyless via GitHub Actions OIDC) antes de permitir el despliegue. Solo imágenes firmadas del CI/CD de DataFlow pueden ejecutarse.
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: verify-images spec: validationFailureAction: Enforce webhookTimeoutSeconds: 30 rules: - name: verify-signature match: any: - resources: kinds: ["Pod"] verifyImages: - imageReferences: - "ghcr.io/dataflow-analytics/*" attestors: - entries: - keyless: subject: "https://github.com/dataflow-analytics/*" issuer: "https://token.actions.githubusercontent.com" rekor: url: "https://rekor.sigstore.dev"
Kyverno actúa como Admission Webhook de Kubernetes. Cada recurso creado o modificado pasa por la cadena de políticas en este orden:
Instalación — GKE DataFlow Analytics
# 1. Añadir repo Kyverno helm repo add kyverno \ https://kyverno.github.io/kyverno/ # 2. Instalar en namespace propio helm install kyverno kyverno/kyverno \ -n kyverno --create-namespace \ --set replicaCount=3 \ --set config.webhookTimeoutSeconds=30 # 3. Aplicar suite de políticas DataFlow kubectl apply -f policies/ # 4. Verificar estado kubectl get clusterpolicies kubectl get policyreport -A # 5. Test local antes de push (CLI) kyverno apply policies/disallow-privileged.yaml \ --resource test/pod-privileged.yaml # Output esperado: pass: 0 fail: 1 warn: 0 error: 0 FAILED: privileged: true → bloqueado ✓
Cobertura de Seguridad — Post Kyverno
Fase 1 — Completado
- Kyverno v1.12 instalado en GKE (3 réplicas HA)
- Políticas validate en modo Audit — sin bloquear CI/CD
- PolicyReport generado → 47 violaciones detectadas
- Políticas mutate activas en los 3 entornos
- NetworkPolicy + ResourceQuota auto-generados
- CI/CD actualizado:
kyverno testen pre-merge
Fase 2 — En Progreso
- Migrar validate a Enforce en producción
- Añadir firma cosign al pipeline de 3 servicios restantes
- Labels
team/appen 12 Deployments legacy - Excepciones documentadas via annotations para kube-system
- Verificar compatibilidad Kyverno con Istio sidecar injection
- Webhook timeout tunning bajo carga peak (Black Friday)