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

![KubeLinter](https://raw.githubusercontent.com/stackrox/kube-linter/main/images/logo/KubeLinter-vertical.svg align="center")

### 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](http://docs.kubelinter.io)

[Repositorio Github](https://github.com/stackrox/kube-linter)

### 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](https://www.redhat.com/es/topics/security/what-is-cve).

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](https://docs.kubelinter.io/#/), tiene varias opciones:

* Utilizar Go para usar la CLI de forma local
    
* Docker
    
* Homebrew
    
* Código fuente.
    

Documentación [https://docs.kubelinter.io](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](https://github.com/stackrox/kube-linter/releases)

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

```plaintext
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

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

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

### Usando Kubelint

Vamos analizar este objeto pod **\[pod.yaml\]**

```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

```bash
#!/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:**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689190695846/55900770-ecc7-4635-9965-34d1468f87cd.png align="center")

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](https://docs.kubelinter.io/#/generated/checks)

### A medida podemos ir arreglando los errores 🔥

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

```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**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689192250918/93051640-184d-4295-bb47-9a5acf6455c1.png align="center")

### **🔥🔥🔥🔥🔥🔥 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

```yaml
      - 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](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**

%[https://www.youtube.com/watch?v=qwkMJ20BWZ0]
