Si queremos poner nuestro entorno ELK (ElasticSearch, Logstash y Kibana) en producción lo primero que debemos hacer es securizarlo. Así que instalamos el plugin Elastic Shield el cual nos ayudará en dicha tarea:
1 2 |
> /usr/share/elasticsearch/bin/plugin install license > /usr/share/elasticsearch/bin/plugin install shield |
Creamos el usuario administrador:
1 2 3 |
> /usr/share/elasticsearch/bin/shield/esusers useradd es_admin -r admin Enter new password: ***** Retype new password: ***** |
Ahora reiniciamos el servicio para que se aplique aplique la configuración:
1 |
> /etc/init.d/elasticsearch restart |
Ahora podremos comprobar que si intentamos acceder al servidor http://localhost:9200/ nos mostrará un error al no permitir el acceso al usuario anonymous. Pero si lo intentamos con el usuario admin si que funciona:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
> curl -XGET 'http://localhost:9200/' {"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication token for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"shield\""}}],"type":"security_exception","reason":"missing authentication token for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"shield\""}},"status":401} > curl -u es_admin -XGET 'http://localhost:9200/' Enter host password for user 'es_admin': ***** { "name" : "Malekith the Accursed", "cluster_name" : "elasticsearch", "version" : { "number" : "2.3.5", "build_hash" : "90f439ff60a3c0f497f91663701e64ccd01edbb4", "build_timestamp" : "2016-07-27T10:36:52Z", "build_snapshot" : false, "lucene_version" : "5.5.0" }, "tagline" : "You Know, for Search" } |
Ya tenemos ElasticSearch securizado, pero ahora no pueden acceder Logstash ni Kibana, por lo que tendremos que configurarlos con las credenciales correspondientes.
En /etc/elasticsearch/shield/roles.yml podemos observar que ya existen un rol llamado kibana4_server, creado específicamente para este uso. Así que vamos a proceder a crear el usuario para que Kibana pueda acceder:
1 2 3 |
> curl -u es_admin -XPOST 'http://localhost:9200/_shield/user/mi-usuario-kibana' -d '{"password" : "mipassword", "roles" : [ "kibana4_server"]}}' Enter host password for user 'mi-usuario-kibana': ****** {"user":{"created":true}} |
Ahora editamos el archivo de configuración de Kibana (opt/kibana/config/kibana.yml) para especificar las credenciales, añadiendo las siguientes lineas:
1 2 3 4 |
elasticsearch.username: "mi-usuario-kibana" elasticsearch.password: "mipassword" elasticsearch.url: "http://mi-usuario-kibana:mipassword@localhost:9200" |
Para que nuestro usuario pueda acceder a todos los índices de ElasticSearch, hay que concederle permiso en el rol kibana4_server. Para ello editamos el archivo /etc/elasticsearch/shield/roles.yml y modificamos la configuración del rol:
1 2 3 4 5 6 7 |
kibana4_server: cluster: - monitor indices: - names: '*' privileges: - all |
Con estos cambios ya tenemos la comunicación entre Kibana y Elasticsearch securizada, para que funcione habría que reiniciar ambos servicios. Solo nos quedará configurar de nuevo Logstash con las credenciales correspondientes.
Así que creamos el usuario para Logstash:
1 |
> /usr/share/elasticsearch/bin/shield/esusers useradd mi-logstash-user -p mipassword -r logstash |
Y modificamos la sección output de nuestro archivo de configuración en Logstash ( /etc/logstash/conf.d/auth-log.conf ) :
1 2 3 4 5 6 7 |
output { elasticsearch{ user => ["mi-logstash-user"] password => ["mipassword"] } stdout{} } |
Ahora ya tenemos las comunicaciones entre Logstash<->ElasticSearch<->Kibana securizados correctamente.
Por último vamos a securizar el acceso web a Kibana, utilizando el plugin Shield.
Siendo requisito fundamental el generar un certificado, nuestro siguiente paso será generarlo con OpenSSL con siguiente tutorial:
http://www.akadia.com/services/ssh_test_certificate.html
Como resultado obtendremos los archivos server.key y server.crt en la ruta /opt/kibana/cert (que deberemos crear).
Seguidamente instalamos el PlugIn Shield en Kibana:
1 |
> /opt/kibana/bin/kibana plugin --install kibana/shield/latest |
Editamos /opt/kibana/config/kibana.yml y añadimos las siguientes líneas:
1 2 3 4 |
shield.encryptionKey: "mipalabrasecreta" shield.sessionTimeout: 600000 server.ssl.cert: /opt/kibana/cert/server.crt server.ssl.key: /opt/kibana/cert/server.key |
Y reiniciamos el servicio de Kibana para que todo tenga efecto:
1 |
> systemctl restart kibana |
Ahora ya podemos acceder a https://localhost:5601 de forma segura. Nos solicitará credenciales, las cuales son las que creamos en ElasticSearch para Kibana (mi-usuario-kibana).
Opcionalmente podemos jugar con los roles y los usuarios de ElasticSearch, pudiendo crear roles específicos para que los usuarios solo puedan acceder a índices concretos.
Referencias de interés: