Elastic bajo llave: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso interno y externo

Elastic bajo llave: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso interno y externo

Elastic Stack es una herramienta conocida en el mercado de sistemas SIEM (de hecho, no sólo para ellos). Puede recopilar una gran variedad de datos, tanto sensibles como no sensibles. No es del todo correcto que el acceso a los propios elementos de Elastic Stack no esté protegido. Por defecto, todos los elementos de Elastic (Elasticsearch, Logstash, Kibana y coleccionistas Beats) operan con protocolos abiertos. Y en la propia Kibana, la autenticación está desactivada. Todas estas interacciones se pueden asegurar y en este artículo te explicaremos cómo hacerlo. Para facilitar la lectura, hemos dividido la narración en 3 bloques conceptuales:

  • Modelo de acceso basado en roles
  • Seguridad de los datos dentro del clúster de Elasticsearch
  • Seguridad de los datos fuera del clúster de Elasticsearch

Más detalles a continuación.

Modelo de acceso basado en roles

Si instalas Elasticsearch y no lo configuras, el acceso a todos los índices estará abierto para cualquier persona interesada. O, al menos, para aquellos que puedan usar curl. Para evitar esto, Elasticsearch tiene un modelo de acceso basado en roles que está disponible a partir de la suscripción nivel Básico (que es gratuita). A continuación se muestra un esquema aproximado:

Elastic bajo llave: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso interno y externo

Lo que se muestra en la imagen

  • Los usuarios son todas las personas que pueden autenticarse utilizando credenciales.
  • Un rol es un conjunto de permisos.
  • Los permisos son un conjunto de privilegios.
  • Los privilegios son autorizaciones para escribir, leer, eliminar, etc. (Lista completa de privilegios)
  • Los recursos son índices, documentos, campos, usuarios y otros sujetos del almacenamiento (el modelo de roles para algunos recursos solo está disponible en suscripciones de pago).

En Elasticsearch, por defecto, hay usuarios predeterminados, los cuales están vinculados a roles predeterminados. Después de activar la configuración de seguridad, se pueden empezar a utilizar de inmediato.

Para activar la seguridad en la configuración de Elasticsearch, es necesario añadir en el archivo de configuración (por defecto es elasticsearch/config/elasticsearch.yml) una nueva línea:

xpack.security.enabled: true

Después de modificar el archivo de configuración, debemos iniciar o reiniciar Elasticsearch para que los cambios surtan efecto. El siguiente paso es asignar contraseñas a los usuarios predeterminados. Haremos esto de forma interactiva utilizando el siguiente comando:

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-setup-passwords interactive
Iniciando la configuración de contraseñas para los usuarios reservados elastic, apm_system, kibana, logstash_system, beats_system, remote_monitoring_user.
Se le pedirá que ingrese contraseñas a medida que avanza el proceso.
Por favor confirme que desea continuar [y/N]y


Ingrese la contraseña para [elastic]:
Reingrese la contraseña para [elastic]:
Ingrese la contraseña para [apm_system]:
Reingrese la contraseña para [apm_system]:
Ingrese la contraseña para [kibana]:
Reingrese la contraseña para [kibana]:
Ingrese la contraseña para [logstash_system]:
Reingrese la contraseña para [logstash_system]:
Ingrese la contraseña para [beats_system]:
Reingrese la contraseña para [beats_system]:
Ingrese la contraseña para [remote_monitoring_user]:
Reingrese la contraseña para [remote_monitoring_user]:
Contraseña cambiada para el usuario [apm_system]
Contraseña cambiada para el usuario [kibana]
Contraseña cambiada para el usuario [logstash_system]
Contraseña cambiada para el usuario [beats_system]
Contraseña cambiada para el usuario [remote_monitoring_user]
Contraseña cambiada para el usuario [elastic]

Verificando:

[elastic@node1 ~]$ curl -u elastic 'node1:9200/_cat/nodes?pretty'
Ingrese la contraseña del host para el usuario 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1

Puedes darte una palmadita en la espalda: la configuración del lado de Elasticsearch está completa. Ahora es el turno de configurar Kibana. Si la inicias ahora, aparecerán errores, así que es importante crear un almacén de claves. Esto se hace en dos comandos (usuario kibana y contraseña ingresados en el paso de creación de contraseñas 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 el inicio de sesión y la contraseña. En la suscripción de nivel Basic, está disponible un modelo de roles basado en usuarios internos. A partir de Gold, se pueden conectar sistemas externos de autenticación: LDAP, PKI, Active Directory y sistemas de inicio de sesión único.

Elastic bajo llave: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso interno y externo

Los derechos de acceso a los objetos dentro de Elasticsearch también se pueden restringir. Sin embargo, para hacer lo mismo con documentos o campos, se necesita una suscripción de pago (este lujo comienza desde el nivel Platinum). Estas configuraciones están disponibles en la interfaz de Kibana o a través de Security API. Se puede verificar mediante el menú de Dev Tools ya conocido:

Creación de un rol

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

Creación de usuario

POST \/_security\/user\/pushkin
{
  "password" : "nataliaonelove",
  "roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
  "full_name" : "Alexander Pushkin",
  "email" : "pushkin@lyceum.edu",
  "metadata" : {
    "hometown" : "San Petersburgo"
  }
}

Seguridad de los datos dentro del clúster de Elasticsearch

Cuando Elasticsearch funciona en un clúster (que es lo habitual), se vuelven importantes las configuraciones de seguridad dentro del clúster. Para una interacción segura entre nodos, Elasticsearch utiliza el protocolo TLS. Para establecer una comunicación segura entre ellos, se necesita un certificado. Generamos un certificado y una clave privada en formato PEM:

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

Después de ejecutar el comando anterior, en el directorio /../elasticsearch aparecerá un archivo comprimido elastic-stack-ca.zip. Dentro se encontrarán el certificado y la clave privada con las extensiones crt y key respectivamente. Es recomendable subirlos a un recurso compartido al que deben tener acceso todos los nodos del clúster.

Ahora, cada nodo necesita sus propios certificados y claves privadas basados en los que están en el directorio compartido. Al ejecutar el comando se pedirá una contraseña. Se pueden agregar opciones adicionales —ip y —dns para la 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

Al finalizar la ejecución del comando, obtendremos un certificado y una clave privada en formato PKCS#12, protegidos por contraseña. Solo queda mover el archivo generado p12 al directorio de configuración:

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

Agregamos la contraseña al certificado en formato p12 en el keystore y truststore 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

En el ya conocido 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

Iniciamos todos los nodos de Elasticsearch y ejecutamos curl. Si todo se ha realizado 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

Hay otra opción de seguridad: filtrado de direcciones IP (disponible en suscripciones a partir del nivel Gold). Permite crear listas blancas de direcciones IP desde las cuales se permite acceder a los nodos.

Seguridad de los datos fuera del clúster de Elasticsearch

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

Elastic bajo llave: habilitando las opciones de seguridad del clúster de Elasticsearch para el acceso interno y externo

Para configurar el soporte https (en lugar de http), agregaremos nuevas líneas en 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

Dado que el certificado está protegido por contraseña, la agregaremos al keystore y truststore en 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 por https. Ahora se pueden iniciar.

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

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

Solo falta descomprimir las claves creadas en la carpeta de configuración de Kibana:

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

Las claves están listas, así que solo queda modificar la configuración de Kibana para que las use. En el archivo de configuración kibana.yml cambiamos http a https y añadimos las líneas con la configuración de SSL. Las últimas tres líneas configuran la interacció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

Así, la configuración está completa y el acceso a los datos en el clúster de Elasticsearch está cifrado.

Si tiene preguntas sobre las capacidades de Elastic Stack en suscripciones gratuitas o de pago, sobre tareas de monitoreo o para crear un sistema SIEM, deje su solicitud en el formulario de contacto en nuestro sitio web.

También nuestros artículos sobre Elastic Stack en Habr:

Explorando el Machine Learning en Elastic Stack (también conocido como Elasticsearch o ELK)

Dimensionamiento de Elasticsearch

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster