Ingeniería

Primeros pasos con la seguridad de Elasticsearch

A partir de las versiones 6.8 y 7.1 del Elastic Stack, las características de seguridad como la comunicación encriptada con TLS, el control de acceso basado en roles (RBAC) y más se encuentran disponibles de forma gratuita en la distribución predeterminada. En este blog, veremos cómo dar los primeros pasos con estas características para asegurar tus clusters de Elasticsearch.

A modo de ejemplo práctico de cómo asegurar una implementación del Elastic Stack, crearemos y aseguraremos un cluster de Elasticsearch de dos nodos en una máquina local. Para hacerlo, primero configuraremos la comunicación TLS entre los dos nodos. Después habilitaremos la seguridad de la instancia de Kibana que se usa para analizar y visualizar los datos en el cluster. A continuación, configuraremos el control de acceso basado en roles en Kibana para asegurarnos de que los usuarios solo puedan ver los datos que están autorizados a ver.

Aunque el funcionamiento de la seguridad implica muchas otras cosas, por ahora solo abarcaremos lo necesario para que puedas comenzar. Una vez que hayas leído este blog, te recomendamos que consultes la documentación sobre cómo asegurar el Elastic Stack, que incluye ejemplos prácticos útiles. Una breve aclaración: haremos todo esto en un cluster local porque, aunque estas características ahora están disponibles de forma predeterminada en las versiones 6.8 y 7.1, siempre han sido estándar en nuestro Elasticsearch Service.

Instalación de Elasticsearch y Kibana

Para este ejemplo, realizaremos la instalación en una laptop con Linux. Adapta los pasos a continuación a tu entorno específico.

Paso 1: Descargar Elasticsearch y Kibana

Lo primero que debes hacer es descargar la distribución predeterminada de Elasticsearch y Kibana versión 6.8+ o 7.1+. La seguridad se agregó a la distribución predeterminada en las versiones 7.1 y 6.8, así que si tienes una versión anterior, deberás actualizarla.

Paso 2: Extraer Elasticsearch y Kibana

Para este ejemplo, descargamos elasticsearch-7.1.0-linux-x86_64.tar.gz y kibana-7.1.0-linux-x86_64.tar.gz. Una vez descargados, será necesario extraer los contenidos.

Paso 3: Crear dos nodos de Elasticsearch

Para crear un cluster de dos nodos, debes hacer dos copias del directorio de Elasticsearch: una denominada master (maestro) y otra, node (nodo). Una vez finalizado este paso, tendrás los archivos y carpetas siguientes:

elasticsearch-7.1.0                      elasticsearch-7.1.0-node
elasticsearch-7.1.0-linux-x86_64.tar.gz kibana-7.1.0-linux-x86_64
elasticsearch-7.1.0-master kibana-7.1.0-linux-x86_64.tar.gz

Configuración de TLS y autenticación

Lo primero que debemos hacer es generar algunos certificados que permitan a los nodos comunicarse de forma segura. Puedes hacerlo con una CA empresarial, pero para esta demostración tenemos un comando denominado elasticsearch-certutil que puedes ejecutar para generarlos sin la confusión habitual que se crea con certificados.

Paso 1: TLS en el maestro de Elasticsearch

Puedes ingresar con cd al directorio master y luego ejecutar este comando:

bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""

A continuación, abre el archivo config/elasticsearch.yaml en tu editor de texto favorito. Pega las líneas siguientes al final del archivo.

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

Guarda el archivo y estaremos listos para iniciar el nodo maestro. Ejecuta el comando bin/elasticsearch. Este ejecutable debe mantenerse en ejecución, deja esta terminal de lado por ahora.

Paso 2: Contraseñas del cluster de Elasticsearch

Una vez que el nodo maestro está en ejecución, es momento de configurar las contraseñas del cluster. En una terminal nueva, debemos ingresar con cd a nuestro directorio del nodo maestro. Después ejecutamos el comando bin/elasticsearch-setup-passwords auto. Esto generará contraseñas al azar para los diversos usuarios internos del Elastic Stack. Como alternativa, puedes omitir el parámetro auto para definir manualmente las contraseñas con el parámetro interactive. Anota estas contraseñas, las volveremos a necesitar pronto.

Paso 3: TLS en el nodo de Elasticsearch

Ahora abramos otra terminal nueva e ingresemos con cd a nuestro directorio del nodo. En nuestro caso, se denominó elasticsearch-7.1.0-node.

Lo más sencillo que podemos hacer es copiar todo del directorio de configuración del maestro y pegarlo en el directorio de configuración del nodo.

cp ../elasticsearch-7.1.0-master/config/* config/

También debes agregar la opción de configuración node.master: false al archivo config/elasticsearch.yml. No profundizaremos detalles aquí, pero puedes encontrar más información en la documentación sobre clusters. Como alternativa a solo copiar los archivos de configuración indiscriminadamente, simplemente puedes copiar los archivos del certificado y configurar las claves xpack.security.* al igual que con el nodo maestro.

Luego iniciamos el nodo ejecutando bin/elasticsearch. Veremos que se une al cluster. Y si observamos la ventana de la terminal del nodo maestro, podremos ver un mensaje que indica que un nodo se unió al cluster. Ahora tenemos un cluster de dos nodos en ejecución.

Paso 4: Seguridad en Kibana

Lo último que debemos hacer es configurar Kibana. Nuevamente, abre otra ventana de terminal (la última, lo prometemos). Tendremos que agregar la contraseña para el usuario de Kibana. Podemos encontrarla en los resultados anteriores del comando setup-passwords.

Ingresemos con cd al directorio de Kibana y abramos el archivo config/kibana.yml con el editor de texto. Busca las líneas similares a las siguientes:

#elasticsearch.username: "user"
#elasticsearch.password: "pass"

Quita las marcas de comentario de los campos username y password eliminando el carácter # al comienzo de la línea. Cambia "user" a "kibana" y luego "pass" a lo que el comando setup-passwords indique como contraseña de Kibana. Guarda el archivo para que podamos iniciar Kibana ejecutando bin/kibana.

Configuración del control de acceso basado en roles (RBAC) en Kibana

Una vez que Kibana se esté ejecutando, podemos pasar al navegador web y abrir http://localhost:5601. Nos solicitará las credenciales de inicio de sesión, usaremos el superusuario elastic con la contraseña de setup-passwords.

Iniciar sesión en Kibana

Kibana nos preguntará si deseamos cargar algunos datos de muestra cuando la instalación es nueva, como en este caso.

Cargar datos de muestra en Kibana

Carguemos los datos de muestra de vuelo y web para este ejemplo. Una vez cargados, haz clic en el icono de engranaje de configuración.

Navegar a administración en Kibana

Ahora creemos nuestros roles. Busca la opción Roles y haz clic en ella.

Roles en Kibana

Haz clic en Create role (Crear rol).

Crear un rol nuevo

Denominaremos read_logs al primer rol.

Crear el rol read_logs

Desplázate hacia abajo hasta el campo de privilegios del índice y selecciona el índice del log. Luego le asignamos el privilegio read (lectura).

Configurar privilegios del rol

Probablemente quieras investigar esta sección sobre espacios una vez que la seguridad esté en funcionamiento, pero la omitiremos en este blog. Para obtener más información acerca de los espacios —que son estupendos para organizar y asegurar los datos en Kibana—, consulta la documentación sobre espacios de Kibana o este blog de introducción a los espacios de Kibana.

Ahora, creemos otro rol denominado read_flight.

Crear rol read_flight

Le asignamos el privilegio read (lectura) al índice de vuelos.

Configurar el rol

Ahora crearemos dos usuarios y les asignaremos estos roles. Selecciona el enlace Users (Usuarios) a la izquierda y haz clic en el botón Create new user (Crear usuario nuevo).

Crear un usuario nuevo

Denominaremos a este usuario flight_user y configuraremos la contraseña. No es necesario indicar el nombre completo y la dirección de correo electrónico. Debemos asignar nuestro rol read_flight y también el rol kibana_user, debido a que este usuario verá los datos en Kibana.

Crear el usuario de vuelos

Presiona para crearlo, y repitamos los pasos para el log_user. Esta vez, agregaremos los roles read_logs y kibana_user.

Crear el usuario de logs

Bien, ya terminamos de crear dos usuarios nuevos. Ahora podemos cerrar sesión como el usuario elastic.

Cerrar sesión como elastic

Luego podemos iniciar sesión como log_user. Si hacemos clic en el icono dashboards, podemos ver que hay dos dashboards, uno para los vuelos y otro para los logs.

Consultar los dashboards

Si haces clic en el dashboard Logs, verás los datos de log de muestra. Si regresamos e intentamos ver el dashboard de vuelos, veremos el dashboard, pero no los datos. Este es un lugar en el que pueden usarse los espacios de Kibana por motivos de seguridad para permitir que solo ciertos usuarios vean determinados dashboards.

Ahora podemos cerrar sesión como log_user y volver a iniciar sesión como flight_user.

Si abrimos el dashboard de logs, esta vez no podremos ver ningún dato. Incluso veremos un error porque Kibana no puede acceder al índice de logs.

Datos restringidos por RBAC

Pero cuando consultamos el dashboard de vuelos, podemos ver que esta vez tenemos acceso a los datos de vuelo.

Acceso a los datos proporcionado por RBAC

¡Felicitaciones! Ahora tenemos configurado un cluster de dos nodos y dos usuarios con acceso restringido a los datos del índice.

Resumen

La seguridad en el Elastic Stack es extremadamente versátil, es posible hacer muchas otras cosas que no incluimos en este blog. La finalidad de este blog era ayudarte a dar los primeros pasos. Más adelante tendremos una gran cantidad contenido que abarcará muchas de las características de seguridad e información sobre su uso. Mientras tanto, contamos con más documentación y blogs sobre cómo funciona la seguridad del Elastic Stack y qué más puedes lograr.

También puedes pedir ayuda en nuestro foro público.

¡Feliz búsqueda!