Elastic under lock and key: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso desde dentro y desde fuera

Elastic under lock and key: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso desde dentro y desde fuera

Elastic Stack es una herramienta muy conocida en el mercado de sistemas SIEM (en realidad, no solo ellos). Puede recopilar una gran cantidad de datos de diferentes tamaños, tanto confidenciales como no muy confidenciales. No es del todo correcto si el acceso a los propios elementos del Elastic Stack no está protegido. De forma predeterminada, todos los elementos listos para usar de Elastic (recolectores Elasticsearch, Logstash, Kibana y Beats) se ejecutan en protocolos abiertos. Y en el propio Kibana, la autenticación está deshabilitada. Todas estas interacciones se pueden proteger y en este artículo le diremos cómo hacerlo. Por conveniencia, dividimos la narrativa en 3 bloques semánticos:

  • Modelo de acceso a datos basado en roles
  • Seguridad de datos dentro de un clúster de Elasticsearch
  • Proteger datos fuera de un clúster de Elasticsearch

Detalles bajo el corte.

Modelo de acceso a datos basado en roles

Si instala Elasticsearch y no lo ajusta de ninguna manera, el acceso a todos los índices estará abierto para todos. Bueno, o aquellos que saben usar curl. Para evitar esto, Elasticsearch tiene un modelo a seguir que está disponible a partir de una suscripción Básica (que es gratuita). Esquemáticamente se parece a esto:

Elastic under lock and key: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso desde dentro y desde fuera

¿Qué hay en la imagen?

  • Los usuarios son todas aquellas personas que pueden iniciar sesión con sus credenciales.
  • Un rol es un conjunto de derechos.
  • Los derechos son un conjunto de privilegios.
  • Los privilegios son permisos para escribir, leer, eliminar, etc. (Lista completa de privilegios)
  • Los recursos son índices, documentos, campos, usuarios y otras entidades de almacenamiento (el modelo a seguir para algunos recursos solo está disponible con suscripciones pagas).

Por defecto Elasticsearch tiene usuarios de caja, al que están unidos roles de caja. Una vez que habilite la configuración de seguridad, podrá comenzar a usarla inmediatamente.

Para habilitar la seguridad en la configuración de Elasticsearch, debe agregarla al archivo de configuración (de forma predeterminada, esto es elasticsearch/config/elasticsearch.yml) nueva línea:

xpack.security.enabled: true

Después de cambiar el archivo de configuración, inicie o reinicie Elasticsearch para que los cambios surtan efecto. El siguiente paso es asignar contraseñas a los usuarios del box. Hagamos esto de forma interactiva usando el siguiente comando:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

Comprobamos:

[elastic@node1 ~]$ curl -u elastic 'node1:9200/_cat/nodes?pretty'
Enter host password for user 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1

Puede darse una palmadita en la espalda: la configuración en el lado de Elasticsearch está completa. Ahora es el momento de configurar Kibana. Si lo ejecuta ahora, aparecerán errores, por lo que es importante crear un almacén de claves. Esto se hace en dos comandos (usuario kibana y la contraseña ingresada en el paso de creación de contraseña en Elasticsearch):

[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.username
[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.password

Si todo es correcto, Kibana comenzará a solicitar un nombre de usuario y contraseña. La suscripción Básica incluye un modelo a seguir basado en usuarios internos. A partir de Gold, puede conectar sistemas de autenticación externos: LDAP, PKI, Active Directory y sistemas de inicio de sesión único.

Elastic under lock and key: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso desde dentro y desde fuera

Los derechos de acceso a objetos dentro de Elasticsearch también pueden ser limitados. Sin embargo, para hacer lo mismo con documentos o campos, necesitarás una suscripción paga (este lujo comienza con el nivel Platino). Estas configuraciones están disponibles en la interfaz de Kibana o mediante API de seguridad. Puede consultar el ya familiar menú Herramientas de desarrollo:

Creando un rol

PUT /_security/role/ruslan_i_ludmila_role
{
  "cluster": [],
  "indices": [
    {
      "names": [ "ruslan_i_ludmila" ],
      "privileges": ["read", "view_index_metadata"]
    }
  ]
}

Creando un usuario

POST /_security/user/pushkin
{
  "password" : "nataliaonelove",
  "roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
  "full_name" : "Alexander Pushkin",
  "email" : "[email protected]",
  "metadata" : {
    "hometown" : "Saint-Petersburg"
  }
}

Seguridad de datos dentro de un clúster de Elasticsearch

Cuando Elasticsearch se ejecuta en un clúster (lo cual es común), la configuración de seguridad dentro del clúster se vuelve importante. Para una comunicación segura entre nodos, Elasticsearch utiliza el protocolo TLS. Para configurar una interacción segura entre ellos, necesita un certificado. Generamos un certificado y clave privada en formato PEM:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil ca --pem

Después de ejecutar el comando anterior, en el directorio /../búsqueda elástica aparecerá el archivo pila-elastica-ca.zip. En su interior encontrarás un certificado y una clave privada con extensiones. crt и clave respectivamente. Es recomendable colocarlos en un recurso compartido, al que se debe poder acceder desde todos los nodos del clúster.

Cada nodo ahora necesita sus propios certificados y claves privadas basadas en las del directorio compartido. Al ejecutar el comando, se le pedirá que establezca una contraseña. Puede agregar opciones adicionales -ip y -dns para una verificación completa de los nodos que interactúan.

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key

Como resultado de ejecutar el comando recibiremos un certificado y una clave privada en formato PKCS#12, protegida por contraseña. Ya sólo queda mover el archivo generado. p12 al directorio de configuración:

[elastic@node1 ~]$ mv elasticsearch/elastic-certificates.p12 elasticsearch/config

Agregue una contraseña al certificado en el formato p12 en el almacén de claves y el almacén de confianza de cada nodo:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

Ya es sabido elasticsearch.yml Solo queda agregar líneas con los datos del certificado:

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

Lanzamos todos los nodos de Elasticsearch y ejecutamos rizo. Si todo se hizo correctamente se devolverá una respuesta con varios nodos:

[elastic@node1 ~]$ curl node1:9200/_cat/nodes -u elastic:password                                                                                    
172.18.0.3 43 75 4 0.00 0.05 0.05 dim * node2                                                                                                                     
172.18.0.4 21 75 3 0.00 0.05 0.05 dim - node3                                                                                                                     
172.18.0.2 39 75 4 0.00 0.05 0.05 dim - node1

Existe otra opción de seguridad: el filtrado de direcciones IP (disponible en suscripciones del nivel Gold). Le permite crear listas blancas de direcciones IP desde las que puede acceder a los nodos.

Proteger datos fuera de un clúster de Elasticsearch

Fuera del clúster significa conectar herramientas externas: Kibana, Logstash, Beats u otros clientes externos.

Elastic under lock and key: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso desde dentro y desde fuera

Para configurar la compatibilidad con https (en lugar de http), agregue nuevas líneas a elasticsearch.yml:

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

Porque El certificado está protegido con contraseña, agréguelo al almacén de claves y al almacén de confianza de cada nodo:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password

Después de agregar las claves, los nodos de Elasticsearch están listos para conectarse a través de https. Ahora se pueden lanzar.

El siguiente paso es crear una clave para conectar Kibana y agregarla a la configuración. Basándonos en el certificado que ya se encuentra en el directorio compartido, generaremos un certificado en formato PEM (PKCS#12 Kibana, Logstash y Beats aún no son compatibles):

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key --pem

Todo lo que queda es descomprimir las claves creadas en la carpeta con la configuración de Kibana:

[elastic@node1 ~]$ unzip elasticsearch/certificate-bundle.zip -d kibana/config

Las claves están ahí, así que solo queda cambiar la configuración de Kibana para que empiece a utilizarlas. En el archivo de configuración kibana.yml, cambie http a https y agregue líneas con la configuración de conexión SSL. Las últimas tres líneas configuran la comunicación segura entre el navegador del usuario y Kibana.

elasticsearch.hosts: ["https://${HOSTNAME}:9200"]
elasticsearch.ssl.certificateAuthorities: /shared_folder/ca/ca.crt
elasticsearch.ssl.verificationMode: certificate
server.ssl.enabled: true
server.ssl.key: /../kibana/config/instance/instance.key
server.ssl.certificate: /../kibana/config/instance/instance.crt

De este modo, se completa la configuración y se cifra el acceso a los datos en el clúster de Elasticsearch.

Si tiene preguntas sobre las capacidades de Elastic Stack en suscripciones gratuitas o pagas, tareas de monitoreo o creación de un sistema SIEM, deje una solicitud a formulario de comentarios en nuestro sitio web.

Más de nuestros artículos sobre Elastic Stack en Habré:

Comprensión del aprendizaje automático en Elastic Stack (también conocido como Elasticsearch, también conocido como ELK)

Dimensionamiento de búsqueda elástica

Fuente: habr.com

Añadir un comentario