Cómo instalar Grafana con LDAP en Kubernetes usando Helm

Si has llegado a este blog imagino que estás peleándote con el Helm chart de Grafana para hacerlo funcionar con tu LDAP. No busques más, has llegado al sitio indicado.

Introducción

Si has usado Grafana antes seguramente estás al tanto de que hay múltiples integraciones para autenticación que puedes usar. Ya hablamos en otro post sobre cómo integrar Grafana con Google SSO basándonos en un contenedor docker, pero esta vez nos enfocaremos en hacer una instalación completa sobre Kubernetes con otro método de autenticación: LDAP.

Como supongo que ya sabrás, LDAP es usado en muchísimas compañías alrededor del globo y por lo tanto si lo estamos usando tiene sentido integrarlo con nuestra solución de dashboarding.

Requisitos previos

Los requisitos para seguir este post son los siguientes:

  • Ya tienes un servidor LDAP ejecutándose en algún lado. Nosotros usaremos OpenLDAP en este ejemplo.
  • Ya tienes un clúster de Kubernetes funcionando y es accesible con «kubectl». También puedes usar minikube si no tienes otra opción mejor.

¿Listos? ¡Vamos allá!

Let's do this

Instalar helm

Lo primero que necesitaremos es instalar e inicializar helm en el clúster. Si ya lo tienes puedes saltar a la siguiente sección. Para esta guía usaremos helm v2.16.12:

sudo wget -c https://get.helm.sh/helm-v2.16.12-linux-amd64.tar.gz -O - | tar -xz
sudo cp linux-amd64/helm /usr/local/bin/

Ahora vamos a inicializarlo en nuestro clúster. El siguiente comando instalará tiller:

helm init

Ten en cuenta que si te encuentras con cualquier error de permisos usando helm, entonces necesitarás crear un ClusterRoleBinding para tiller. En la documentación oficial de helm encontrarás cómo hacerlo.

Generar la configuración de conexión a LDAP

A continuación, vamos a crear la configuración de LDAP para Grafana con todos los parámetros necesarios para la integración. Este paso está basando en la documentación oficial de Grafana.

Crea un nuevo fichero llamado «ldap-toml«. Es imprescindible que el nombre sea ese ya que tenemos que crear un secret a partir de este fichero y el chart de helm de Grafana estará esperando encontrar una key llamada «ldap-toml».

Los campos más relevantes que puede interesarte modificar son: «host«, «bind_dn«, «bind_password» y «search_base_dns«. Siéntete libre de modificar el contenido en función de tus necesidades:

[[servers]]
# Ldap server host (specify multiple hosts space separated)
# We use OpenLDAP but you can use any IP address or external host here
host = "openldap.kube-system.svc"
# Default port is 389 or 636 if use_ssl = true
port = 389
# Set to true if LDAP server supports TLS
use_ssl = false
# Set to true if connect LDAP server with STARTTLS pattern (create connection in insecure, then upgrade to secure connection with TLS)
start_tls = false
# set to true if you want to skip SSL cert validation
ssl_skip_verify = true

# Search user bind dn
bind_dn = "cn=admin,dc=mycompany,dc=org"
# Search user bind password
bind_password = "admin"
# User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(uid=%s)"
search_filter = "(cn=%s)"
# An array of base dns to search through
search_base_dns = ["ou=Users,dc=mycompany,dc=org"]
# Specify names of the LDAP attributes your LDAP uses
[servers.attributes]
name = "givenName"
surname = "sn"
username = "cn"
member_of = "memberOf"
email =  "email"

Guarda el fichero y crea un nuevo secret a partir de él:

kubectl create secret generic grafana-ldap-toml --from-file=ldap-toml

Ahora vamos a crear el fichero grafana-values.yaml que le proporcionaremos a helm para habilitar LDAP en Grafana con los parámetros necesarios. La parte más importante con lo que respecta a LDAP es:

grafana.ini:
  server:
    domain: grafana.mydomain.com
  auth.ldap:
    enabled: true
    allow_sign_up: true
ldap:
  enabled: true
  existingSecret: "grafana-ldap-toml"

De nuevo, siéntete libre de adaptar los parámetros en función de tus necesidades. Si necesitas habilitar persistencia (pv), el ingress or cualquier otra cosa simplemente añádelo al fichero values. Puedes echar un vistazo a la referencia de valores del chart oficial.

Instalando el chart

¡Finalmente podemos instalar Grafana en nuestro clúster!

helm upgrade --install grafana grafana/grafana --namespace monitoring-system -f grafana-values.yaml

Una vez termine la instalación puedes acceder para hacer un test de la integración. Si no has habilitado ingress puedes hacer un port-forward y acceder en http://localhost:8000 usando el siguiente comando:

kubectl -n monitoring-system port-forward svc/grafana 8000:80

Ahora, prueba a hacer login con un usuario existente de LDAP:

Grafana LDAP login

Si vamos a settings -> Users veremos que mi usuario fue creado con el role «Viewer». Aquí podemos seleccionar cualquier role que necesitemos para este usuario.

Grafana LDAP users

¡Hemos terminado!

I've got this


Conclusión

Como puedes ver no es tan difícil realizar nuestra integración con LDAP al desplegar Grafana en Kubernetes, pero la documentación del chart de Helm no es suficientemente clara en ocasiones. La documentación describe qué tipo de valor esperará el chart para una key determinada, pero es un poco confusa en algunas áreas determinadas como la configuración de LDAP donde debemos mezclar distintos valores.

Ahora puedes trabajar en automatizar completamente tu despliegue de Grafana con integración con LDAP, por ejemplo automatizando la creación del secret o cualquier otra cosa que necesites.

Espero haber podido arrojar algo de luz sobre este tema y que seas capaz de implementarlo en tu propio clúster.

De todas formas si tienes alguna duda, ¡no dudes en contactar con nosotros!

¡Gracias por tu tiempo!

Deja una respuesta

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