Cómo configurar Elasticsearch para evitar filtraciones

Durante el año pasado, ha habido muchas filtraciones de bases de datos. Elasticsearch (aquí, aquí и aquí). En muchos casos, los datos personales se almacenaron en la base de datos. Estas filtraciones podrían haberse evitado si, después de implementar la base de datos, los administradores se hubieran molestado en comprobar algunas configuraciones simples. Hoy hablaremos de ellos.

Inmediatamente hagamos una reserva de que en nuestra práctica utilizamos Elasticsearch para almacenar registros y analizar registros de herramientas, sistemas operativos y software de seguridad de la información en nuestra plataforma IaaS, que cumple con los requisitos de 152-FZ, Cloud-152. 

Cómo configurar Elasticsearch para evitar filtraciones

Comprobamos si la base de datos "sobresale" de Internet

En los casos más conocidos de fugas (aquí, aquí) el atacante accedió a los datos de forma sencilla y sin pretensiones: la base de datos se publicó en Internet y era posible conectarse a ella sin autenticación.  

Primero, tratemos la publicación en Internet. ¿Por qué pasó esto? El hecho es que para un funcionamiento más flexible de Elasticsearch recomendado Cree un clúster de tres servidores. Para que las bases de datos se comuniquen entre sí, es necesario abrir puertos. Como resultado, los administradores no restringen el acceso a la base de datos de ninguna manera y usted puede conectarse a la base de datos desde cualquier lugar. Es fácil comprobar si se puede acceder a la base de datos desde fuera. Solo ingresa en el navegador http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Si puedes entrar, corre para cerrarlo.

Protegiendo 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 limita el acceso a la base de datos, pero sólo está disponible en el conjunto de complementos X-Pack de pago (1 mes de uso gratuito).

La buena noticia es que en otoño de 2019 Amazon abrió sus desarrollos, que se superponen con X-Pack. La función de autenticación al conectarse a una base de datos está disponible bajo una licencia gratuita para la versión Elasticsearch 7.3.2, y ya se está trabajando en una nueva versión para Elasticsearch 7.4.0.

Este complemento es fácil de instalar. Vaya a la consola del servidor y conecte 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 -

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

Al instalar el complemento, la configuración del puerto de conexión a la base de datos cambia. Permite el cifrado SSL. Para que los servidores del clúster sigan funcionando entre sí, debe configurar la interacción entre ellos mediante SSL.

La confianza entre hosts se puede establecer con o sin su propia autoridad de certificación. Con el primer método todo está claro: basta con ponerse en contacto con los especialistas de CA. Pasemos directamente al segundo.

  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. Firme el certificado raíz. Mantenlo seguro: 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. Cree 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 el 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. Cree 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. Crear 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. Firma del certificado:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial 
    -sha256 -out node.pem

  10. Coloque el certificado entre los nodos de Elasticsearch en la siguiente carpeta:

    /etc/elasticsearch/


    necesitamos los archivos:

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

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

Cambiar contraseñas para usuarios internos

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

    sh ${OD_SEC}/tools/hash.sh -p [пароль]

  2. Cambie el hash del archivo por el recibido:

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

Configurar un firewall en el sistema operativo

  1. Permita que se inicie el firewall:

    systemctl enable firewalld

  2. Lancemoslo:

    systemctl start firewalld

  3. Permitir la conexión a Elasticsearch:

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent

  4. Vuelva a cargar las reglas del firewall:

    firewall-cmd --reload

  5. Aquí están las reglas de trabajo:

    firewall-cmd --list-all

Aplicando 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. Ejecutemos un 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. Compruebe si se han aplicado los cambios:

    curl -XGET https://[IP/Имя Elasticsearch]:9200/_cat/nodes?v -u admin:[пароль] --insecure

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

Fuente: habr.com

Añadir un comentario