Como configurar Elasticsearch para evitar filtracións

Durante o ano pasado, houbo moitas filtracións das bases de datos Elasticsearch (velaquí, velaquí и velaquí). En moitos casos, os datos persoais foron almacenados na base de datos. Estas filtracións poderían terse evitado se, despois de implantar a base de datos, os administradores se preocuparan en comprobar algunhas configuracións sinxelas. Hoxe falaremos deles.

De inmediato, fagamos unha reserva de que na nosa práctica utilizamos Elasticsearch para almacenar rexistros e analizar rexistros de ferramentas de seguridade da información, SO e software na nosa plataforma IaaS, que cumpre cos requisitos de 152-FZ, Cloud-152. 

Como configurar Elasticsearch para evitar filtracións

Comprobamos se a base de datos "se pega" a Internet

Na maioría dos casos coñecidos de fugas (velaquí, velaquí) o atacante accedeu aos datos de forma sinxela e sen pretensións: a base de datos publicouse en Internet e foi posible conectarse a ela sen autenticación.  

En primeiro lugar, imos ocuparnos da publicación en Internet. Por que ocorre isto? O caso é que para un funcionamento máis flexible de Elasticsearch recomendado crear un clúster de tres servidores. Para que as bases de datos se comuniquen entre elas, cómpre abrir portos. Como resultado, os administradores non restrinxen o acceso á base de datos de ningún xeito e pode conectarse á base de datos desde calquera lugar. É doado comprobar se a base de datos é accesible desde fóra. Só tes que entrar no navegador http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Se podes entrar, corre para pechalo.

Protexer a conexión coa base de datos

Agora faremos que sexa imposible conectarse á base de datos sen autenticación.

Elasticsearch ten un módulo de autenticación que limita o acceso á base de datos, pero só está dispoñible no conxunto de complementos X-Pack de pago (un mes de uso gratuíto).

A boa noticia é que no outono de 2019, Amazon abriu os seus desenvolvementos, que se solapan con X-Pack. A función de autenticación ao conectarse a unha base de datos quedou dispoñible baixo unha licenza gratuíta para a versión Elasticsearch 7.3.2, e xa está en proceso unha nova versión para Elasticsearch 7.4.0.

Este complemento é fácil de instalar. Vaia á consola do servidor e conecte o repositorio:

Baseado 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


Baseado en DEB:

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

Configurar a interacción entre servidores mediante SSL

Ao instalar o complemento, a configuración do porto que se conecta á base de datos cambia. Permite o cifrado SSL. Para que os servidores do clúster sigan traballando entre si, cómpre configurar a interacción entre eles mediante SSL.

A confianza entre hosts pódese establecer con ou sen a súa propia autoridade de certificación. Co primeiro método, todo está claro: só tes que contactar con especialistas de CA. Imos directamente ao segundo.

  1. Crea unha variable co nome de dominio completo:

    export DOMAIN_CN="example.com"

  2. Crea unha clave privada:

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

  3. Asina o certificado raíz. Mantéñase seguro: se se perde ou se compromete, a confianza entre todos os hosts terá que ser reconfigurada.

    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 unha 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. Crea unha solicitude para asinar o 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. Crea certificados para o 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. Crea unha solicitude de sinatura:

    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. Sinatura do certificado:

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

  10. Coloque o certificado entre os nós de Elasticsearch no seguinte cartafol:

    /etc/elasticsearch/


    necesitamos os ficheiros:

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

  11. Personalizar /etc/elasticsearch/elasticsearch.yml – cambiar o nome dos ficheiros con certificados polos xerados por nós:

    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

Cambio de contrasinais para usuarios internos

  1. Usando o seguinte comando, saímos o hash do contrasinal á consola:

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

  2. Cambia o hash do ficheiro polo recibido:

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

Configurar un firewall no SO

  1. Permitir que o firewall se inicie:

    systemctl enable firewalld

  2. Imos lanzalo:

    systemctl start firewalld

  3. Permitir conexión a Elasticsearch:

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

  4. Volve cargar as regras do firewall:

    firewall-cmd --reload

  5. Aquí están as normas de traballo:

    firewall-cmd --list-all

Aplicando todos os nosos cambios a Elasticsearch

  1. Cree unha variable coa ruta completa ao cartafol co complemento:

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

  2. Imos executar un script que actualizará os contrasinais e comprobará a 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. Comproba se se aplicaron os cambios:

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

Iso é todo, estas son as configuracións mínimas que protexen Elasticsearch das conexións non autorizadas.

Fonte: www.habr.com

Engadir un comentario