tutoriales.com

Aprovechando el Módulo de Seguridad: Implementando Autenticación y Autorización en Elasticsearch

Este tutorial te guiará a través de la configuración esencial del módulo de seguridad de Elasticsearch. Aprenderás a implementar autenticación basada en usuarios y roles, configurar realms de autenticación, asegurar las comunicaciones con TLS/SSL y proteger tus datos del acceso no autorizado. Ideal para administradores y desarrolladores que buscan fortalecer la seguridad de sus despliegues de Elasticsearch.

Intermedio20 min de lectura9 views
Reportar error

Introducción al Módulo de Seguridad de Elasticsearch 🔒

Elasticsearch se ha convertido en una herramienta indispensable para la búsqueda y el análisis de datos. Sin embargo, su poder viene con la responsabilidad de asegurar los datos que maneja. El módulo de seguridad de Elasticsearch, parte de la Elastic Stack, proporciona una robusta capa de protección para controlar quién puede acceder a tus datos y qué acciones puede realizar. Ignorar la seguridad es dejar tus datos vulnerables a accesos no autorizados y posibles brechas.

En este tutorial, exploraremos en detalle cómo configurar y gestionar la seguridad en tu clúster de Elasticsearch. Cubriremos los conceptos clave, desde la autenticación de usuarios y la gestión de roles hasta la protección de las comunicaciones con TLS/SSL. Al finalizar, tendrás las herramientas y el conocimiento para implementar una estrategia de seguridad sólida.

🔥 Importante: El módulo de seguridad es una característica de la suscripción Platinum o Enterprise de Elastic. Sin embargo, también está disponible en la versión gratuita (Basic) con ciertas limitaciones, como la seguridad de transporte básica, la gestión de usuarios y roles internos. Para funcionalidades avanzadas como LDAP, SAML o Kibana Spaces, se requiere una suscripción pagada.

Conceptos Fundamentales de Seguridad en Elasticsearch ✨

Antes de sumergirnos en la configuración práctica, es crucial entender los pilares sobre los que se construye la seguridad en Elasticsearch:

Autenticación vs. Autorización

  • Autenticación: Es el proceso de verificar la identidad de un usuario o sistema. En Elasticsearch, esto significa asegurarse de que quien intenta conectarse es quien dice ser (por ejemplo, mediante un nombre de usuario y contraseña).
  • Autorización: Es el proceso de determinar qué recursos puede acceder y qué acciones puede realizar un usuario o sistema una vez que ha sido autenticado. Esto se gestiona a través de roles y permisos.

Realms de Autenticación

Los realms son como las fuentes donde Elasticsearch busca información de autenticación para los usuarios. Puedes configurar varios realms, y Elasticsearch los consultará en orden hasta que un usuario sea autenticado con éxito. Algunos de los realms más comunes incluyen:

  • native: Almacena usuarios y roles directamente en Elasticsearch. Ideal para clústeres pequeños o para empezar.
  • file: Almacena usuarios y roles en archivos en el sistema de archivos de cada nodo. Útil para entornos de desarrollo o configuraciones estáticas.
  • ldap: Permite autenticar usuarios contra un servidor LDAP/Active Directory existente.
  • pki: Autentica usuarios usando certificados X.509 (infraestructura de clave pública).
  • saml: Utilizado para la autenticación de inicio de sesión único (SSO) con proveedores de identidad compatibles con SAML (por ejemplo, Okta, Auth0).

Usuarios y Roles

  • Usuarios: Son las identidades individuales o de servicio que interactúan con Elasticsearch. Cada usuario se autentica a través de un realm.
  • Roles: Son conjuntos de permisos que definen lo que un usuario puede hacer en el clúster. Un usuario puede tener uno o más roles asignados.

Permisos de Rol

Los roles en Elasticsearch son muy granulares y pueden definir permisos sobre:

  • Clúster: Acciones a nivel de clúster (ej. monitor, manage, all).
  • Índice: Acciones sobre índices específicos o patrones de índices (ej. read, write, create_index, delete). Puedes especificar qué índices se ven afectados.
  • Documento: Permite filtrar documentos a los que un usuario puede acceder dentro de un índice.
  • Campo: Permite restringir el acceso a campos específicos dentro de los documentos.
💡 Consejo: Siempre aplica el principio de *mínimo privilegio*. Concede solo los permisos necesarios para que un usuario realice su tarea, no más.

Configurando la Seguridad Básica: Usuarios y Roles Nativos 🛠️

Comenzaremos con la configuración de seguridad más básica pero esencial: usuarios y roles internos gestionados directamente por Elasticsearch. Esto es perfecto para empezar y entender el flujo.

1. Habilitar la Seguridad

Por defecto, la seguridad puede no estar habilitada. Para activarla, necesitas modificar el archivo elasticsearch.yml en cada nodo del clúster.

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

Reinicia tu clúster de Elasticsearch después de realizar estos cambios para que surtan efecto.

⚠️ Advertencia: Al habilitar `xpack.security.transport.ssl.enabled: true`, Elasticsearch esperará conexiones cifradas. Si no configuras TLS/SSL, tus nodos no podrán comunicarse entre sí, ¡así que asegúrate de tener un plan! Por ahora, podrías omitirlo y configurarlo después para hacer la configuración básica, pero *no es recomendado para producción*.

2. Configurar Usuarios Internos con elastic-setup-passwords

Una vez habilitada la seguridad, Elasticsearch crea varios usuarios internos por defecto (elastic, kibana, logstash_system, etc.) que no tienen contraseñas asignadas. Debes establecer sus contraseñas. Usa la herramienta elasticsearch-setup-passwords:

bin/elasticsearch-setup-passwords interactive

Elige la opción interactive para establecer las contraseñas manualmente, o auto para que se generen automáticamente. Asegúrate de guardar estas contraseñas de forma segura, especialmente la del usuario elastic, que tiene privilegios de superusuario.

📌 Nota: Este comando solo se ejecuta *una vez* por clúster para establecer las contraseñas iniciales. Si necesitas cambiar una contraseña más tarde, usarás la API de gestión de usuarios.

3. Crear Usuarios Personalizados

Para crear tus propios usuarios, puedes usar la API de gestión de usuarios de Elasticsearch. Aquí crearemos un usuario llamado analista_ventas.

curl -X POST "localhost:9200/_security/user/analista_ventas?pretty" -H 'Content-Type: application/json' -u elastic:your_elastic_password -d'
{
  "password" : "SecureP@ssw0rd123",
  "full_name" : "Analista de Ventas",
  "email" : "analista@ejemplo.com",
  "roles" : ["kibana_user"],
  "metadata" : { "department" : "sales" }
}
'

Reemplaza your_elastic_password con la contraseña que estableciste para el usuario elastic.

4. Crear Roles Personalizados

Ahora, crearemos un rol personalizado llamado ventas_reader que solo tendrá permisos para leer datos de índices relacionados con ventas.

curl -X POST "localhost:9200/_security/role/ventas_reader?pretty" -H 'Content-Type: application/json' -u elastic:your_elastic_password -d'
{
  "cluster": ["monitor"],
  "indices": [
    {
      "names": ["sales-*", "metrics-*"],
      "privileges": ["read", "view_index_metadata"]
    }
  ],
  "run_as": [],
  "metadata": { "description" : "Lectura de datos de ventas y métricas" }
}
'

Este rol permite:

  • A nivel de clúster: monitor (ver el estado del clúster).
  • A nivel de índice: read y view_index_metadata en cualquier índice que comience con sales- o metrics-.

5. Asignar Roles a Usuarios

Finalmente, asignamos el rol ventas_reader a nuestro usuario analista_ventas.

curl -X POST "localhost:9200/_security/user/analista_ventas/_role_mapping?pretty" -H 'Content-Type: application/json' -u elastic:your_elastic_password -d'
{
  "roles" : [ "ventas_reader", "kibana_user" ],
  "users" : [ "analista_ventas" ]
}
'

El usuario analista_ventas ahora tiene los permisos combinados de ventas_reader y kibana_user.


Protegiendo Comunicaciones con TLS/SSL 🛡️

Para cualquier entorno de producción, es esencial cifrar las comunicaciones. TLS/SSL (Transport Layer Security/Secure Sockets Layer) protege los datos en tránsito entre nodos del clúster y entre clientes (como Kibana o tu aplicación) y el clúster.

1. Generación de Certificados

Elasticsearch proporciona la herramienta elasticsearch-certutil para generar certificados y claves. Podemos crear una CA (Certificate Authority) y luego certificados para cada nodo y un certificado para clientes.

  1. Crear una CA (Certificate Authority):
bin/elasticsearch-certutil ca
Esto generará `elastic-stack-ca.p12`. Guarda este archivo de forma segura.

2. Crear certificados para nodos:

bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
Esto generará `elastic-certificates.p12`. Este archivo contendrá el certificado y la clave privada para todos los nodos del clúster. Para producción, es mejor generar certificados individuales por nodo especificando sus nombres de host.

<details open><summary>Generar certificados por nodo (Recomendado para producción)</summary>
Para generar un certificado para un nodo específico (ej. `node1` con hostname `es-node1.example.com` y IP `192.168.1.10`):
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns es-node1.example.com --ip 192.168.1.10 --pem --out node1.zip
Repite este proceso para cada nodo, luego descomprime los archivos PEM en el directorio `config/certs` de cada nodo.
</details>

2. Configurar TLS en elasticsearch.yml

Una vez que tengas los certificados (elastic-certificates.p12 para todos los nodos o los archivos PEM individuales), necesitas configurar elasticsearch.yml en todos los nodos.

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

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: elastic-certificates.p12
xpack.security.http.ssl.truststore.path: elastic-certificates.p12

Si generaste certificados individuales en formato PEM para cada nodo, la configuración sería algo así:

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.certificate_authorities: [ config/certs/ca.crt ]
xpack.security.transport.ssl.certificate: config/certs/node1.crt
xpack.security.transport.ssl.key: config/certs/node1.key

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.certificate_authorities: [ config/certs/ca.crt ]
xpack.security.http.ssl.certificate: config/certs/node1.crt
xpack.security.http.ssl.key: config/certs/node1.key
💡 Consejo: Asegúrate de que los archivos `.p12` o `.crt` y `.key` estén protegidos con permisos de archivo adecuados para que solo el usuario que ejecuta Elasticsearch pueda leerlos.

3. Reiniciar el Clúster

Reinicia cada nodo de tu clúster de Elasticsearch. Una vez reiniciado, las comunicaciones entre nodos y las conexiones HTTP externas se cifrarán.

Cliente (Kibana, App) HTTPS Gateway / LB Cifrado TLS HTTPS / TLS Elasticsearch Node 1 Autenticación Autorización Cifrado TLS (Interno) TLS Elasticsearch Node 2 Autenticación Autorización Cifrado TLS (Interno) Realm (LDAP / Native) Validación de Usuarios

Configuración Avanzada: Realms Externos y Filtros de IP 🚀

Para entornos empresariales, es común integrar Elasticsearch con sistemas de gestión de identidades existentes.

Integración con LDAP/Active Directory

Configurar un realm LDAP permite a los usuarios autenticarse contra tu servidor LDAP o Active Directory. Esto simplifica la gestión de usuarios, ya que no necesitas duplicar cuentas en Elasticsearch.

Edita elasticsearch.yml para añadir la configuración del realm LDAP:

xpack.security.authc.realms.ldap.ldap1:
  order: 0
  url: "ldaps://your-ldap-server:636"
  bind_dn: "cn=read-only-user,dc=example,dc=com"
  bind_password: "read-only-user-password"
  user_search:
    base_dn: "dc=example,dc=com"
    filter: "(uid={0})"
  group_search:
    base_dn: "dc=example,dc=com"
    filter: "(memberUid={0})"
  unmapped_groups_as_roles: true
  ssl:
    certificate_authorities: [ "config/certs/ldap_ca.crt" ]
    verification_mode: full

Después de configurar el realm, necesitas mapear los grupos de LDAP a roles de Elasticsearch. Esto se hace a través de la API de mapeo de roles o en el archivo role_mapping.yml.

PUT /_security/role_mapping/ldap_admin_mapping
{
  "roles": [ "superuser" ],
  "rules": { "field": { "groups": "cn=admins,dc=example,dc=com" } },
  "enabled": true
}

Este mapeo asigna el rol superuser de Elasticsearch a cualquier usuario que pertenezca al grupo cn=admins,dc=example,dc=com en LDAP.

Filtrado de IP (IP Filtering)

Para una capa de seguridad adicional, puedes restringir qué direcciones IP pueden conectarse a tu clúster de Elasticsearch. Esto se configura en elasticsearch.yml.

xpack.security.transport.filter.enabled: true
xpack.security.transport.filter.allow: ["192.168.1.0/24", "10.0.0.1"]
xpack.security.transport.filter.deny: ["_all"]

xpack.security.http.filter.enabled: true
xpack.security.http.filter.allow: ["192.168.1.0/24", "10.0.0.1"]
xpack.security.http.filter.deny: ["_all"]

En este ejemplo, solo las IPs en el rango 192.168.1.0/24 y la IP 10.0.0.1 podrán conectarse al clúster (tanto para comunicaciones internas como HTTP externas).

⚠️ Advertencia: Ten mucho cuidado al configurar filtros de IP. Un error podría bloquear completamente el acceso a tu clúster, incluso para ti. Siempre ten una forma de revertir los cambios o acceso físico/SSH a los nodos.

Gestión de la Seguridad en Kibana 📊

Kibana actúa como la interfaz de usuario para Elasticsearch, y su seguridad es tan importante como la del propio clúster.

1. Conexión Segura de Kibana a Elasticsearch

Kibana debe conectarse a Elasticsearch usando credenciales de un usuario con los permisos adecuados. Modifica kibana.yml:

elasticsearch.username: "kibana_system"
elasticsearch.password: "your_kibana_system_password"

elasticsearch.ssl.verificationMode: full
elasticsearch.ssl.certificateAuthorities: [ "/path/to/your/ca.crt" ]

Asegúrate de que kibana_system tenga una contraseña establecida con elasticsearch-setup-passwords y que tenga el rol kibana_system o kibana_admin.

2. Espacios (Spaces) en Kibana

Los Espacios en Kibana (requiere suscripción de pago) permiten segmentar la interfaz de Kibana, ofreciendo vistas personalizadas y separando los objetos de Kibana (dashboards, visualizaciones, saved searches) para diferentes grupos de usuarios. Cada espacio puede tener sus propios permisos. Esto complementa la seguridad de Elasticsearch a nivel de datos.

  • Ejemplo de uso: Crear un espacio "Ventas" donde los usuarios solo vean dashboards de ventas, y un espacio "Operaciones" con dashboards de monitoreo del clúster.

3. Gestión de Usuarios y Roles desde Kibana

Kibana ofrece una interfaz gráfica para gestionar usuarios, roles y realms de forma intuitiva. Navega a Stack Management -> Security para acceder a estas opciones. Esto es mucho más cómodo que usar la API de forma constante.

💡 Consejo: Usa la interfaz de Kibana para la gestión diaria de usuarios y roles una vez que tu clúster y la seguridad básica estén configurados. Es más amigable y reduce errores.

Mejores Prácticas de Seguridad en Elasticsearch ✅

Implementar la seguridad no es un evento único, sino un proceso continuo. Aquí tienes algunas mejores prácticas:

  1. Principio de Mínimo Privilegio: Otorga siempre los permisos mínimos necesarios. Evita asignar el rol superuser o admin a menos que sea estrictamente indispensable.
  2. Cifrado en Tránsito (TLS/SSL): Siempre habilita TLS para las comunicaciones de transporte y HTTP. No hay excusa para no cifrar los datos en tránsito en producción.
  3. Auditoría (Audit Logging): Habilita el registro de auditoría (xpack.security.audit.enabled: true en elasticsearch.yml) para rastrear quién accede a qué recursos y cuándo. Esto es vital para la conformidad y la detección de incidentes.
  4. Integración con IDP (Identity Providers): Para entornos empresariales, integra Elasticsearch con LDAP, Active Directory, SAML u OpenID Connect para centralizar la gestión de identidades.
  5. Actualizaciones Regulares: Mantén tu clúster de Elasticsearch y Kibana actualizados. Elastic lanza parches de seguridad regularmente.
  6. Protección de Datos en Reposo: Aunque no es parte del módulo de seguridad de Elasticsearch directamente, considera el cifrado a nivel de sistema operativo o disco para proteger los datos en reposo.
  7. Monitoreo de Seguridad: Utiliza herramientas de monitoreo para detectar patrones de acceso inusuales o intentos de inicio de sesión fallidos que puedan indicar un ataque.
  8. Respaldo de Configuraciones de Seguridad: Realiza copias de seguridad de tus configuraciones de seguridad, incluyendo elasticsearch.yml, certificados y mapeos de roles.
90% Seguridad en Tránsito
80% Autenticación Robusta
70% Autorización Granular

Resolución de Problemas Comunes ❓

Problemas de Conexión después de habilitar seguridad Si después de habilitar `xpack.security.enabled: true` no puedes conectarte, verifica: * **Contraseñas iniciales**: ¿Ejecutaste `elasticsearch-setup-passwords`? * **Errores de TLS**: Si habilitaste `xpack.security.transport.ssl.enabled: true`, ¿configuraste correctamente los certificados? Revisa los logs de Elasticsearch en busca de errores relacionados con SSL/TLS. * **Firewall**: ¿Hay un firewall bloqueando el puerto 9200 (HTTP) o 9300 (transporte)?
Acceso denegado (403 Forbidden) para un usuario * **Roles incorrectos**: Verifica que el usuario tenga asignados los roles correctos para los índices y acciones que intenta realizar. * **Permisos de rol**: Edita la definición del rol para asegurarte de que incluye los permisos necesarios (ej. `read` para un índice específico). * **Orden de realms**: Si usas múltiples realms, asegúrate de que el orden sea correcto y que el usuario se esté autenticando contra el realm esperado.
Certificados SSL no válidos o errores de cadena * **CA de confianza**: Asegúrate de que tu CA raíz o intermedia esté configurada como `certificate_authorities` en `elasticsearch.yml` y `kibana.yml`. * **Nombres de host/IP**: Verifica que los nombres de host y las direcciones IP en los certificados coincidan con los de tus nodos. * **Fechas de validez**: Asegúrate de que los certificados no estén caducados.

Conclusión 🎉

La seguridad en Elasticsearch no es una opción, sino una necesidad. Al implementar los principios y configuraciones cubiertos en este tutorial, puedes proteger tu clúster contra accesos no autorizados y garantizar la integridad y confidencialidad de tus datos. Desde la configuración de usuarios y roles básicos hasta la protección con TLS/SSL y la integración con sistemas de identidad externos, ahora tienes una base sólida para asegurar tus despliegues de Elasticsearch.

Recuerda que la seguridad es un viaje continuo. Mantente al día con las mejores prácticas, monitorea tu clúster y adapta tu estrategia de seguridad a medida que tus necesidades evolucionan. ¡Tus datos te lo agradecerán!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!