Cómo configurar Elasticsearch para que no haya fugas

Durante el año pasado, ha habido muchas filtraciones de las bases de datos de Elasticsearch ( aquí , aquí y allá ). En muchos casos, los datos personales se almacenaron en la base de datos. Estas fugas podrían evitarse si, después de implementar la base de datos, los administradores se toman la molestia de verificar algunas configuraciones simples. Hoy hablaremos de ellos.

Inmediatamente haremos una reserva de que en nuestra práctica usamos Elasticsearch para almacenar registros y analizar registros de herramientas de protección de información, sistema operativo y software en nuestra plataforma IaaS que cumple con los requisitos de 152-, Cloud-152. 



Compruebe si la base de datos está "pegada"


En la mayoría de los casos conocidos de filtraciones ( aquí , aquí ), el atacante obtuvo acceso a los datos de manera simple y sin pretensiones: la base de datos se publicó en Internet y fue posible conectarse a ella sin autenticación.  

Primero, nos ocuparemos de publicar en Internet. ¿Por qué esto es tan? El hecho es que para un funcionamiento más flexible de Elasticsearch, se recomienda crear un clúster de tres servidores. Para que las bases de datos se comuniquen entre sí, debe abrir los puertos. Como resultado, los administradores no restringen el acceso a la base de datos, y puede conectarse a la base de datos desde cualquier lugar. Comprobar si hay acceso externo a la base de datos es fácil. Simplemente ingrese http: // [IP / Elasticsearch Name]: 9200 / _cat / nodo? En el navegador ? V

Si logra iniciar sesión, ejecute para cerrar.

Protegemos la conexión a la base de datos.


Ahora haremos que sea imposible conectarse a la base de datos sin autenticación.

Elasticsearch tiene un módulo de autenticación que restringe el acceso a la base de datos, pero solo está en el conjunto pago de complementos de X-Pack (1 mes de uso gratuito).

La buena noticia es que en el otoño de 2019, Amazon abrió sus bases que se cruzan con el X-Pack. La función de autenticación cuando se conecta a la base de datos está disponible bajo una licencia gratuita para la versión Elasticsearch 7.3.2., Y una nueva versión para Elasticsearch 7.4.0 ya está en funcionamiento.

Instalar este complemento es fácil. Entramos en la consola del servidor y conectamos el repositorio:

Basado en RPM:

curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo

yum update

yum install opendistro-security

Basado en DEB:

wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -

Configuramos la interacción entre servidores a través de SSL


Al instalar el complemento, cambia la configuración del puerto de conexión de la base de datos. Incluye encriptación SSL. Para que los servidores del clúster continúen trabajando entre sí, debe configurar la interacción entre ellos mediante SSL.

La confianza entre los hosts se puede establecer con o sin su propia autoridad de certificación. Con el primer método, todo está claro: solo necesita contactar a un especialista en CA. Procedemos inmediatamente a la segunda.

  1. Cree una variable con el nombre de dominio completo:

    export DOMAIN_CN="example.com"
  2. Crea una clave privada:

    openssl genrsa -out root-ca-key.pem 4096
  3. Firmamos el certificado raíz. Manténgalo como la niña de su ojo: si se pierde o se ve comprometido, será necesario reconfigurar la confianza entre todos los hosts.

    openssl req -new -x509 -sha256 \-subj "/C=RU/ST=Moscow/O=Moscow, Inc./CN=${DOMAIN_CN}" \
    -key root-ca-key.pem -out root-ca.pem
  4. Crea una clave de administrador:

    openssl genrsa -out admin-key-temp.pem 4096
    openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt \
    -v1 PBE-SHA1-3DES -out admin-key.pem
  5. Cree una solicitud para firmar un certificado:

    openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${DOMAIN_CN}/CN=admin " \
    -key admin-key.pem -out admin.csr
  6. Crear un certificado de administrador:

    openssl x509 -req -extensions usr_cert -in admin.csr -CA root-ca.pem \
    -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem
  7. Cree certificados para el nodo Elasticsearch:

    export NODENAME="node-01"
    openssl genrsa -out ${NODENAME}-key-temp.pem 4096
    openssl pkcs8 -inform PEM -outform PEM -in ${NODENAME}-key-temp.pem -topk8 -nocrypt \
    -v1 PBE-SHA1-3DES -out ${NODENAME}-key.pem
  8. Cree una solicitud de firma:

    openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${NODENAME}.${DOMAIN_CN}" \ 
    -addext"subjectAltName=DNS:${NODENAME}.${DOMAIN_CN},DNS:www.${NODENAME}.${DOMAIN_CN}" \
    -key ${NODENAME}-key.pem -out ${NODENAME}.csr
  9. Firmamos el certificado:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial \
    -sha256 -out node.pem
  10. Descomponemos el certificado entre los nodos de Elasticsearch en la carpeta:

    /etc/elasticsearch/

    necesitamos los archivos:

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem
  11. Configure /etc/elasticsearch/elasticsearch.yml - cambie el nombre de los archivos de certificado a los generados por nosotros:

    opendistro_security.ssl.transport.pemcert_filepath: node-01.pem                                                                                                                                                                                    
    	opendistro_security.ssl.transport.pemkey_filepath: node-01-key.pem                                                                                                                                                                                 
    	opendistro_security.ssl.transport.pemtrustedcas_filepath: root-ca.pem                                                                                                                                                                              
    	opendistro_security.ssl.transport.enforce_hostname_verification: false                                                                                                                                                                             
    	opendistro_security.ssl.http.enabled: true                                                                                                                                                                                                         
    	opendistro_security.ssl.http.pemcert_filepath: node-01.pem                                                                                                                                                                                         
    	opendistro_security.ssl.http.pemkey_filepath: node-01-key.pem                                                                                                                                                                                      
    	opendistro_security.ssl.http.pemtrustedcas_filepath: root-ca.pem                                                                                                                                                                                   
    	opendistro_security.allow_unsafe_democertificates: false                                                                                                                                                                                           
    	opendistro_security.allow_default_init_securityindex: true                                                                                                                                                                                         
    	opendistro_security.authcz.admin_dn:                                                                                                                                                                                                               
    	  − CN=admin,CN=example.com,O=Moscow Inc.,ST=Moscow,C=RU                                                                                                                                                                                                  
    	opendistro_security.nodes_dn:                                                                                                                                                                                                                      
    	  − CN=node-01.example.com,O=Moscow Inc.,ST=Moscow,C=RU

Cambiamos las contraseñas de los usuarios internos.


  1. Usando el siguiente comando, mostramos el hash de contraseña en la consola:

    sh ${OD_SEC}/tools/hash.sh -p []
  2. Cambie el hash en el archivo al recibido:

    /usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml

Configurar el firewall en el sistema operativo


  1. Permitir el lanzamiento del firewall:

    systemctl enable firewalld
  2. Ejecutarlo:

    systemctl start firewalld
  3. Permitimos la conexión a Elasticsearch:

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent
  4. Reinicio de las reglas del firewall:

    firewall-cmd --reload
  5. Derivamos las reglas de trabajo:

    firewall-cmd --list-all

Aplicar todos nuestros cambios a Elasticsearch


  1. Cree una variable con la ruta completa a la carpeta con el complemento:

    export  OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"
  2. Ejecute el script que actualizará las contraseñas y verifique la configuración:

    ${OD_SEC}/tools/securityadmin.sh -cd ${OD_SEC}/securityconfig/ \
    -icl -nhnv -cacert /etc/elasticsearch/root-ca.pem \
    -cert /etc/elasticsearch/admin.pem \ 
    -key /etc/elasticsearch/admin-key.pem
  3. Compruebe si se aplicaron los cambios:

    curl -XGET https://[IP/ Elasticsearch]:9200/_cat/nodes?v -u admin:[] --insecure

Eso es todo, estas son las configuraciones mínimas que bloquean Elasticsearch de una conexión no autorizada.

Source: https://habr.com/ru/post/undefined/


All Articles