KubeLinter: detecta errores de configuración y vulnerabilidades en los archivos YAML y Charts de Helm de Kubernetes.

KubeLinter: detecta errores de configuración y vulnerabilidades en los archivos YAML y Charts de Helm de Kubernetes.

KubeLinter

KubeLinter entra en acción

KubeLinter es una herramienta open source de análisis estático, también conocida como lint o linter, que identifica los errores de configuración y programación en las implementaciones de Kubernetes. La herramienta de línea de comandos analiza de forma automática los archivos YAML y los charts de Helm, y establece una comparación con la configuración de Kubernetes y las prácticas recomendadas de seguridad.

Funcionamiento de KubeLinter

KubeLinter accede a los charts y ejecuta varias pruebas que le permiten comprobar que sus ajustes sean los adecuados y que no tengan errores. Luego, envía mensajes con las fallas encontradas que impiden la instalación adecuada del chart, o bien mensajes de advertencia sobre todo aquello que no se ajuste a las prácticas recomendadas de seguridad.

Cuando falla una verificación, KubeLinter informa recomendaciones sobre cómo resolver cualquier problema potencial y devuelve un código de salida distinto de cero.

Documentación Oficial

Repositorio Github

Configuración de KubeLinter

KubeLinter es sumamente configurable. Los usuarios pueden crear, habilitar y deshabilitar sus propias reglas personalizadas con cambios mínimos en los flujos de trabajo y comentarios casi instantáneos sobre los errores de configuración y las violaciones a la seguridad.

KubeLinter se puede agregar a todas las herramientas de CICD, entre ellas Gitlab-ci, GitHub Action, Jenkins, etc, y puede buscar e identificar automáticamente errores en las configuraciones de las aplicaciones. Gracias a ello, los desarrolladores obtienen ayuda para resolver los problemas, y pueden detectarlos de manera automática durante todo el proceso de producción.

Instalación de KubeLinter

La descarga e instalación de KubeLinter solo tarda unos minutos.

Si desea instalar KubeLinter, tiene varias opciones:

  • Utilizar Go para usar la CLI de forma local

  • Docker

  • Homebrew

  • Código fuente.

Documentación https://docs.kubelinter.io para obtener información detallada sobre la instalación, el uso y la configuración de KubeLinter.

Instalación de KubeLinter con Docker

1.- Obtenga la última imagen de Docker de KubeLinter:

docker pull stackrox/kube-linter:0.1.4

Si usamos la etiqueta :latest, recomiendo usar una version en específica KubeLinter Release

2.- Agregue la ruta a un directorio que contenga sus archivos yaml:

docker run -v /path/to/files/you/want/to/lint:/dir -v /path/to/config.yaml:/etc/config.yaml stackrox/kube-linter lint /dir --config /etc/config.yaml

Pueden ignorar configuraciones con la definicion de config.yaml, donde podrian ignorar lo que crean que no es necesario

Para configurar las comprobaciones que ejecuta KubeLinter o ejecutar sus propias comprobaciones personalizadas, puede utilizar un yaml de configuración. Cuando ejecute el lint , use la --config

checks:
  ignorePaths:
    - ~/foo/bar/**
    - /**/*/foo/**
    - ../baz/**
    - /tmp/*.yaml

Más información : https://docs.kubelinter.io/#/configuring-kubelinter

Usando Kubelint

Vamos analizar este objeto pod [pod.yaml]

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: busybox
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: false

kubelint.sh , le pasas como argumento la carpeta donde esta los yaml/helm-charts

#!/bin/bash
if [ "$1" == "" ]; then
    echo usage kubelint directory [filter]
    echo example ./kubelint.sh k8s
    exit 1
else
    LINT="$1"
    if [ -d "$LINT" ]; then
        echo docker run -v $(PWD):/dir stackrox/kube-linter lint /dir/$LINT 
        docker run -v $(PWD):/dir stackrox/kube-linter lint /dir/$LINT
    else
    echo "$LINT NOT FOUND."
    fi
fi

Resultado:

Como puede ver, la salida del comando es muy agradable. No solo verificará si las mejores prácticas se siguen correctamente, sino que también proporciona buenos enlaces para mejorar su conocimiento sobre por qué esta práctica es necesaria y cómo solucionarla.

Además, en esta página , puede encontrar en detalle los mensajes de errores

A medida podemos ir arreglando los errores 🔥

Realizamos todos los consejos de buenas practicas del archivo pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: busybox:1.36.1
    resources:
        requests:
          memory: "64Mi"
          cpu: "10m"
        limits:
          memory: "64Mi"
          cpu: "10m"
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo    
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true

Volvemos a correr el script

🔥🔥🔥🔥🔥🔥 Impresionante.

Tambien podemos tener salidas [Resultados] agregando esta linea en el script o corriendolo aparte, la ventaja de tener un reporte en formato json es que podemos parsearlo muy facil con cualquier script.

docker run -v $(PWD):/dir stackrox/kube-linter lint --format json /dir/$LINT >$FILE_KUBELINTER

Integración CICD con Github Actions [kube-linter-action ]

Esta es una acción de GitHub para escanear archivos YAML de Kubernetes y helm chart

      - name: Scan repo with kube-linter
        uses: stackrox/kube-linter-action@v1.0.4
        with:
          directory: yamls
          config: .kube-linter/config.yaml
          format: sarif
          output-file: kube-linter.sarif

Documentación: https://github.com/stackrox/kube-linter-action

Conclusión

Kube-linter es una herramienta agradable y simple que podría incluirse en integración con CICD para mejorar la seguridad y las mejores prácticas. Su simplicidad y fácil configuración harán de esta herramienta un estándar para uso futuro. No me sorprendería que se incluyera en la CLI de Kubernetes “kubectl”.

VIDEO