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 activadoautomountServiceAccountToken
. Esto hará que si utilizáis alguna herramienta comovault-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.