Análisis continuo de Vulnerabilidades en K8S

Buenas, en este post vamos a configurar un stack de análisis continuo de vulnerabilidades en Kubernetes. Normalmente, el análisis de vulnerabilidades sobre las imágenes de docker, se realiza en el proceso de CI del pipeline. Pero aquí hay un problema, que si las vulnerabilidades se publican después de ser desplegado el servicio, no vamos a tener forma de detectar esto hasta que se vuelva a lanzar el CI.

Para solucionar esto, la gente de Aquasecurity sacó en su día una herramienta llamada Starboard que ahora han descontinuado en favor de Trivy Operator. Esta herramienta se encargará de revisar tanto las posibles vulnerabilidades y secretos de las imágenes de docker, como la configuración de los recursos desplegados.

Una vez desplegado Trivy, podremos ver los reportes tanto en Grafana como en Lens (mediante una extensión).

También vamos a utilizar Trivy Server. Esto lo vamos a usar como servidor central de cacheo ya que si no, cada job que se ejecuta, va a descargarse actualizaciones de la DB y de este modo haremos que el proceso sea mas eficiente.

Trivy Server

Para empezar, vamos a desplegar el Server. Para esto, vamos a utilizar HELM. Primero, vamos crear el fichero de values.yaml . Aquí solo voy a indicar las cosas que hay que cambiar. El original está aquí.

nameOverride: "trivy-server"
fullnameOverride: "trivy-server"
trivy:
  # https://docs.github.com/es/rest#rate-limiting
  gitHubToken: XXXXXXXXXXXXXXXXX
  cache:
    redis:
      enabled: true
      url: "redis://redis.midominio.com:6379"
  # Usar el comando pwgen -n32
  serverToken: XXXXXXXXXXXXXXXXXXXXXXX

Cambiando esto, ya podemos desplegarlo

helm repo add aquasecurity https://aquasecurity.github.io/helm-charts/
helm repo update
helm install trivy-server aquasecurity/trivy --values values.yaml

Warning!

Por defecto, no trae activado automountServiceAccountToken. Esto hará que si utilizáis alguna herramienta como vault-secrets-webhook no funcione.

Trivy Operator

Ahora vamos a con el Trivy Operator. El values.yaml de este tiene alguna cosa mas que cambiar. Pero como en el anterior, solo voy a poner lo que yo he cambiado. Si queréis cambiar o añadir algo, el original está aquí.

nameOverride: "trivy-operator"
fullnameOverride: "trivy-operator"
operator:
  scanJobsConcurrentLimit: 5
service:
  # Si no se cambia el puerto, no fuciona
  metricsPort: 8080
  annotations:
    # Esto es para que prometheus coja las métricas automáticamente
    prometheus.io/path: "/metrics"
    prometheus.io/port: "8080"
    prometheus.io/scrape: "true"
trivy:
  mode: ClientServer
  resources:
    requests:
      cpu: 100m
      memory: 100M
    limits:
      cpu: 500m
      memory: 1Gi
  # Esto cambiará si se está exponiendo en otro endpoint
  serverURL: "http://trivy-server:4954"
  serverInsecure: true
  # El token que se ha creado previamente con pwgen -n32
  serverToken: "XXXXXXXXXXXXXXXXXXXX"

Y con esto ya estaría configurado Trivy Operator. Ahora solo quedaría desplegarlo. Lo primero que hay que hacer, es desplegar los CRDs

kubectl apply \
-f https://raw.githubusercontent.com/aquasecurity/trivy-operator/main/deploy/crd/aquasecurity.github.io_clusterconfigauditreports.yaml \
-f https://raw.githubusercontent.com/aquasecurity/trivy-operator/main/deploy/crd/aquasecurity.github.io_clusterrbacassessmentreports.yaml \
-f https://raw.githubusercontent.com/aquasecurity/trivy-operator/main/deploy/crd/aquasecurity.github.io_configauditreports.yaml \
-f https://raw.githubusercontent.com/aquasecurity/trivy-operator/main/deploy/crd/aquasecurity.github.io_exposedsecretreports.yaml \
-f https://raw.githubusercontent.com/aquasecurity/trivy-operator/main/deploy/crd/aquasecurity.github.io_rbacassessmentreports.yaml \
-f https://raw.githubusercontent.com/aquasecurity/trivy-operator/main/deploy/crd/aquasecurity.github.io_vulnerabilityreports.yaml \
-f https://raw.githubusercontent.com/aquasecurity/trivy-operator/main/deploy/compliance/aquasecurity.github.io_clustercompliancedetailreports.yaml \
-f https://raw.githubusercontent.com/aquasecurity/trivy-operator/main/deploy/compliance/aquasecurity.github.io_clustercompliancereports.yaml

Y ahora, ya se puede desplegar con HELM

helm install trivy-operator aquasecurity/trivy-operator --values values.yaml

Por último, nos quedaría dar permisos al Operator sobre el ECR (en el caso de que se use AWS como registry privado). Esto está explicado aquí.

Ahora veremos que empezará a lanzar varios jobs para analizar los recursos que estén desplegados. Para ver los resultados, tenemos que descargarnos una extensión para Lens. Hay que copiar el link del .tgz y pegarlo en la sección de extensiones de Lens (Ctrl + Mayus + E). Esto instalará la extensión y podremos ver en la parte de abajo del todo los reportes.

Y también empezarán a aparecer las métricas en Prometheus. Si a alguien le interesa, dejo un dashboard muy sencillo que he hecho.


Also published on Medium.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *