KubeLinter: detecta errores de configuración y vulnerabilidades en los archivos YAML y Charts de Helm de Kubernetes.
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.
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