Instalación de ELK Stack 7.10.x en Debian 10 (parte II)
Teniendo en cuenta que hemos realizado la instalación de todos los componentes del stack en la Parte I de este tutorial, procederemos a configurar la seguridad.
Paso 1.- Preparar el entorno y generar certificados.
Para cada instancia crearemos una entrada en el host del equipo:
192.168.1.95 elk.node1.local 192.168.1.95 elk.kibana.local 192.168.1.95 elk.logstash
Hemos utilizado la ip pública del equipo porque la conexión a Kibana y logstash se realizará desde nuestra red de equipos y en el caso del node1 (elasticsearch) por si incluyésemos nuevos nodos para un cluster de Elastick.
Crearemos una carpeta temporal, por ejemplo “tmp_certs” bajo el directorio “/etc/elasticsearch” para generar todos los certificados de una vez. En la carpeta crearemos el fichero “instances.yml” para definir los nodos y elementos que vamos a utilizar en el stack. El contenido será el siguiente:
instances: - name: 'node1' dns: [ 'elk.node1.local' ] - name: 'kibana' dns: [ 'elk.kibana.local' ] - name: 'logstash' dns: [ 'elk.logstash.local' ]
Ahora generaremos los certificados del servidor y CA, en nuestro caso utilizamos la propia CA que viene incluida en Elasticsearch y que es gestionada a través del comando elasticsearch-certutil
# /usr/share/elasticsearch/bin/elasticsearch-certutil cert --keep-ca-key --pem --in /etc/elasticsearch/tmp_certs/instances.yml --out /etc/elasticsearch/tmp_certs/certs.zip
Descomprimimos el archivo para poder acceder a los certificados:
# cd /etc/elasticsearch/tmp_certs
# unzip certs.zip
Los certificados creados son los siguientes:
Paso 2.- Configuración de TLS en Elasticsearch
Iremos el directorio de Elasticseach y crearemos una nueva carpeta llamada “/etc/elasticseach/certs” y copiaremos los certificados para Elasticsearch del paso anterior:
# cd /etc/elasticsearch
# mkdir certs
# cp ./tmp_certs/ca/ca* ./tmp_certs/node1/* certs
En la carpeta “/etc/elaticsearch/certs” deberán estar los siguientes archivos:
Ahora procederemos a añadir en el archivo de configuración de Elasticsearch (/etc/elasticsearch/elasticsearch.yml) las siguientes configuraciones:
# Nombre del nodo # --------------- node.name: node1 network.host: elk.node1.local # Configuración de seguridad # -------------------------- xpack.security.enabled: true xpack.security.http.ssl.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.http.ssl.key: certs/node1.key xpack.security.http.ssl.certificate: certs/node1.crt xpack.security.http.ssl.certificate_authorities: certs/ca.crt xpack.security.transport.ssl.key: certs/node1.key xpack.security.transport.ssl.certificate: certs/node1.crt xpack.security.transport.ssl.certificate_authorities: certs/ca.crt # En caso de multinodo # -------------------- # discovery.seed_hosts: [ "node1.elastic.test.com" ] # cluster.initial_master_nodes: [ "node1" ] # Indicamos que solo hay un nodo # ------------------------------ discovery.type: single-node
Iniciaremos el servicio de Elasticsearch:
# systemctl start elasticsearch
Paso 3.- Configuración de las contraseñas de acceso
Elasticsearch dispone de una herramienta para la creación de las contraseñas de acceso para los distintos usuarios del stack. En nuestro caso ejecutaremos el comando elasticsearch-setup-passwords con el parámetro auto para que nos genere las contraseñas automáticamente.
# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto -u https://elk.node1.local:9200
Paso 4.- Comprobación nodo Elasticsearch
Comprobaremos a través del API de Elasticsearch el estado del nodo1:
# curl --cacert /etc/elasticsearch/tmp_certs/ca/ca.crt -u elastic 'https://elk.node1.local:9200/_cat/nodes?v'
Paso 5.- Habilitar TLS para Kibana
Crearemos la carpeta /etc/kibana/certs y copiaremos los certificados.
# cd /etc/kibana
# mkdir certs
# cp /etc/elasticsearch/tmp_certs/kibana/* /etc/elasticsearch/tmp_certs/ca/ca.crt /etc/kibana/certs
Quedando de la siguiente forma:
Ahora procederemos a añadir en el archivo de configuración de Kibana (/etc/kibana/kibana.yml) las siguientes configuraciones:
# Nombre del host # ---------------- server.name: "kibana" server.host: "elk.kibana.local" # Configuracion de Seguridad # --------------------------- server.ssl.enabled: true server.ssl.certificate: /etc/kibana/certs/kibana.crt server.ssl.key: /etc/kibana/certs/kibana.key Configuración con Elasticsearch elasticsearch.hosts: ["https://elk.node1.local:9200"] elasticsearch.username: "kibana" elasticsearch.password: "moJa8w7iHWNzeucQO39V" elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/certs/ca.crt" ]
Teniendo en cuenta de cambiar la contraseña del usuario “Kibana” creado anteriormente en el “Paso 3”.
Paso 6.- Iniciar Kibana y comprobar que funciona correctamente
Para inciar Kibana
# systemctl start kibana
Comprobar el acceso con el usuario “elastic” en la URL https://elk.kibana.local:5601
Paso 7.- Preparar los usuarios para Logstash
Para que Logstash pueda gestionar los índices hace falta que creemos un rol con permiso de escritura y un usuario asignado al Rol. La forma de crear el usuario más rápida es a través de la herramienta de comandos en Kibana, podemos encontrarla en Management/Dev Tools:
Primero creamos el rol “logstash_writer_role”:
POST /_security/role/logstash_writer_role { "cluster": ["monitor","manage_index_templates","manage_ilm"], "indices": [ { "names": [ "logstash*" ], "privileges": [ "write", "create", "create_index", "manage", "manage_ilm" ], "field_security": { "grant": [ "*" ] } } ], "run_as": [], "metadata": {}, "transient_metadata": { "enabled": true } }
Al crearlo obtendremos la siguiente respuesta:
Ahora crearemos el usuario “logstash_internal” con un password que posteriormente se usara en los archivos de configuración de Logstash:
POST /_security/user/logstash_internal { "password" : "kfssfSSS45454", "roles" : [ "logstash_writer_role"], "full_name" : "Internal Logstash User" }
El resultado deberá ser el siguiente:
Paso 8.- Habilitar TSL para Logstash
Crearemos la carpeta «/etc/logstash/certs» y copiaremos los certificados:
# cd /etc/logstash
# mkdir certs
# cp /etc/elasticsearch/tmp_certs/logstash/* /etc/elasticsearch/tmp_certs/ca/ca.crt /etc/logstash/certs
Quedando de la siguiente forma:
Ahora procederemos a añadir en el archivo de configuración de Logstash (/etc/logstash/logstash.yml) las siguiente configuración:
# Nombre del nodo # ---------------- node.name: logstash.local # Configuración de elasticsearch # -------------------------------- xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.username: logstash_system xpack.monitoring.elasticsearch.password: 'WLkNRDcX7i952uTGyU0m' xpack.monitoring.elasticsearch.hosts: [ 'https://elk.node1.local:9200' ] xpack.monitoring.elasticsearch.ssl.certificate_authority: /etc/logstash/certs/ca.crt
Teniendo en cuenta de cambiar la contraseña del usuario “logstash_system” creado anteriormente en el “Paso 3”.
Paso 9.- Crear un certificado para los Beats
Para que los Beats se comuniquen de forma segura con el Logstash convertiremos logstash.key a formato PKCS#8 para usarlo en el plugin de entrada de los Beats.
# openssl pkcs8 -in /etc/logstash/certs/logstash.key -topk8 -nocrypt -out /etc/logstash/certs/logstash.pkcs8.key
Tendremos que dar permisos de lectura al usuario logstash del sistema al fichero que hemos creado, logstash.pkcs8.key
Paso 10.- Configurar una regla en logstash
Definiremos una entrada y salida de datos en Logstash. Para la salida utilizaremos la contraseña del usuario “logstash_internal” creada en el Paso 7. La definición se realiza creando un fichero de tipo Yalm (pero con la extensión .conf) en la carpeta «/etc/logstash/conf.d». En nuestro caso crearemos el fichero prueba.conf con el siguiente contenido:
input { beats { port => 5044 ssl => true ssl_key => '/etc/logstash/certs/logstash.pkcs8.key' ssl_certificate => '/etc/logstash/certs/logstash.crt' } } output { elasticsearch { hosts => ['https://elk.node1.local:9200'] cacert => '/etc/logstash/certs/ca.crt' user => 'logstash_internal' password => 'kfssfSSS45454' } }
Paso 11.- Comprobar que Logstash funciona
Debemos tener en cuenta que Logstash si no tiene ninguna regla definida se ira reiniciando sólo hasta que la encuentre, por lo que es importante tener realizado el Paso 10.
Para iniciarlo ejecutaremos:
# systemctl start logshtash
Para comprobar que funciona podemos consultar si esta escuchando el puerto que hemos definido para el Beat:
# netstat –tan|grep 5044
En esté punto ya podríamos monitorizar desde Kibana el stack, habilitando la monitorización en el apartado de “Management/Stack Monitoring”:
Paso 11.- Configurar y ejecutar Filebaet
Crearemos la carpeta /etc/filebeat/certs y copiaremos el certificado:
# cd /etc/filebeat
# mkdir certs
# cp /etc/elasticsearch/tmp_certs/ca/ca.crt /etc/filebeat/certs
Para tener un archivo de configuración más “limpio” procederemos a mover el archivo «/etc/filebeat/filebeat.yml» a «/etc/filebeat/filebeat.yml.orig» y crearemos un archivo vacío llamado «/etc/filebeat/filebeat.yml» añadiéndole las siguientes líneas:
filebeat.inputs: - type: log enabled: true paths: - /var/log/*.log output.logstash: hosts: ["elk.logstash.local:5044"] ssl.certificate_authorities: - /etc/filebeat/certs/ca.crt
Básicamente le estamos indicando que envíe los logs a Logstash de los archivos .log en el directorio «/var/log«
Iniciaremos el servicio:
# systemctl start filebeat
Paso 12.- Visualización de los logs en Kibana
El primer paso para poder visualizar los datos enviados por los Beats es crear un patrón de índice. En Kibana iremos a Management/Stack Management/Kibana/Index Patterns:
Pulsaremos crear índice e indicaremos que queremos crear un patrón para logstash:
Indicaremos el campo primario para la marca de tiempo del registro:
Al pulsar el botón de crear índice nos mostrará una pantalla con todos los campos asociados al índice.
Ahora ya podemos ver los logs que son enviados desde Filebeat en el panel de Kibana en el apartado Kibana/Discover y seleccinando el patrón de «logstash*«
Consideraciones finales
- Para que al iniciar el equipo inicien todos los servicios del stack ejecutaremos los siguientes comandos:
# systemctl enable elasticsearch
# systemctl enable logstash
# systemctl enable kibana
# systemctl enable filebeat
Teniendo en cuenta que todo depende del servicio “Elasticsearch” y es el primero que debería iniciarse.
- Deberemos configurar la rotación de los índices y si queremos que se eliminen o pasen a algunos de los estados posibles. (https://www.elastic.co/es/blog/implementing-hot-warm-cold-in-elasticsearch-with-index-lifecycle-management)
- El nombre de los índices y su rotación puede definirse en el fichero de configuración de los Beats en Logstash.
- En Debian, por defecto, Elasticsearch guarda los datos en “/var/lib/elasticsearch”, esta ubicación se puede cambiar a través del fichero de configuración “/etc/elasticsearch/elasticsearch.yml”
- En el proceso de configuración y puesta en marcha de los servicios nos puede ser de gran ayuda ver el log con «Journalctl».