Cómo configurar Elasticsearch para evitar fugas

En el último año, ha habido muchas filtraciones de bases de datos. Elasticsearch (aquí, aquí y aquí). En muchos casos, se almacenaban datos personales en la base de datos. Estas filtraciones se podrían haber evitado si, después de desplegar la base de datos, los administradores se hubieran tomado la molestia de verificar algunas configuraciones sencillas. Hoy hablaremos de ellas.

Primero aclaremos que en nuestra práctica utilizamos Elasticsearch para almacenar registros y analizar los logs de los sistemas de protección de información, sistemas operativos y software en nuestra plataforma IaaS, que cumple con los requisitos de la ley 152-FZ, Cloud-152. 

Cómo configurar Elasticsearch para evitar fugas

Verificamos si la base de datos 'no está expuesta' en internet.

En la mayoría de los casos conocidos de filtraciones (aquí, aquí) los atacantes accedieron a los datos de manera simple y directa: la base fue publicada en internet, y se podía conectar sin autenticación.  

Primero, enfoquémonos en la publicación en internet. ¿Por qué ocurre esto? La razón es que para un funcionamiento más flexible de Elasticsearch se recomienda se crea un clúster de tres servidores. Para que las bases de datos se comuniquen entre sí, es necesario abrir puertos. Al final, los administradores no limitan de ninguna manera el acceso a la base de datos, y a esta se puede conectar desde cualquier lugar. Comprobar si hay acceso externo a la base de datos es fácil. Simplemente ingresamos en el navegador http://[IP/Nombre de Elasticsearch]:9200/_cat/nodes?v

Si se puede acceder, es necesario cerrar inmediatamente.

Proteger la conexión a la base de datos.

Ahora haremos que no se pueda conectar a la base de datos sin autenticación.

Elasticsearch cuenta con un módulo de autenticación que limita el acceso a la base de datos, pero solo está en el paquete de plugins de pago X-Pack (1 mes de uso gratuito).

Las buenas noticias son que en otoño de 2019, Amazon abrió sus desarrollos que se intersectan con X-Pack. La función de autenticación al conectarse a la base de datos se volvió disponible bajo una licencia libre para la versión 7.3.2 de Elasticsearch, y ya está en desarrollo un nuevo lanzamiento para la versión 7.4.0.

Este plugin se instala fácilmente. Ingresamos a 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 los servidores a través de SSL.

Al instalar el plugin, se modifica la configuración del puerto de conexión a la base de datos. Se habilita la encriptación SSL en este puerto. Para que los servidores del clúster puedan seguir colaborando, es necesario configurar la interacción entre ellos mediante SSL.

La confianza entre los hosts se puede establecer con o sin una autoridad de certificación propia. Con la primera opción es bastante claro: solo hay que acudir a especialistas en CA. Pasemos directamente a la segunda.

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

    export DOMAIN_CN="example.com"

  2. Creamos una clave privada:

    openssl genrsa -out root-ca-key.pem 4096

  3. Firmamos el certificado raíz. Guárdelo como un tesoro: en caso de pérdida o compromiso, 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. Creamos la clave del 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. Creamos una solicitud para la firma del 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. Creamos el certificado del 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. Creamos certificados para el nodo de 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. Creamos una solicitud para la 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. Distribuimos el certificado entre los nodos de Elasticsearch en la carpeta:

    /etc/elasticsearch/


    Necesitaremos los archivos:

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem

  11. Configuramos /etc/elasticsearch/elasticsearch.yml – cambiamos el nombre de los archivos de los certificados 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=Moscú Inc.,ST=Moscú,C=RU                                                                                                                                                                                                  
    	opendistro_security.nodes_dn:                                                                                                                                                                                                                      
    	  − CN=node-01.example.com,O=Moscú Inc.,ST=Moscú,C=RU

Cambiamos las contraseñas de los usuarios internos

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

    sh ${OD_SEC}/tools/hash.sh -p [contraseña]

  2. Cambiamos el hash en el archivo por el obtenido:

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

Configuramos el cortafuegos en el sistema operativo

  1. Permitimos el inicio del cortafuegos:

    systemctl enable firewalld

  2. Lo iniciamos:

    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. Reiniciamos las reglas del cortafuegos:

    firewall-cmd --reload

  5. Mostrando reglas activas:

    firewall-cmd --list-all

Aplicando todos nuestros cambios a Elasticsearch

  1. Creamos una variable con la ruta completa a la carpeta del plugin:

    export  OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"

  2. Ejecutamos el script que actualizará las contraseñas y verificará 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. Verificamos si se aplicaron los cambios:

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

Eso es todo, estas son las configuraciones mínimas que protegen Elasticsearch de conexiones no autorizadas.

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