
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:

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. ()
- 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 , los cuales están vinculados a . 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: trueDespué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.passwordSi 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.

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 . 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 --pemDespué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.keyAl 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/configAgregamos 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_passwordEn 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.p12Iniciamos 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 - node1Hay 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.

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.p12Dado 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_passwordDespué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 --pemSolo falta descomprimir las claves creadas en la carpeta de configuración de Kibana:
[elastic@node1 ~]$ unzip elasticsearch\/certificate-bundle.zip -d kibana\/configLas 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.crtAsí, 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 en nuestro sitio web.
También nuestros artículos sobre Elastic Stack en Habr:
Fuente: habr.com
