Come configurare Elasticsearch per evitare perdite

Nell'ultimo anno ci sono state molte violazioni dei database Elasticsearch (ecco, ecco e ecco). In molti casi, nei database erano conservati dati personali. Queste violazioni avrebbero potuto essere evitate se, dopo il dispiegamento del database, gli amministratori si fossero presi la briga di controllare alcune semplici impostazioni. Oggi ne parleremo.

Facciamo subito un chiarimento: nella nostra pratica utilizziamo Elasticsearch per memorizzare i log e analizzare i registri dei sistemi di protezione delle informazioni, dei sistemi operativi e del software sulla nostra piattaforma IaaS, in conformità con i requisiti della legge 152-FZ, Cloud-152. 

Come configurare Elasticsearch per evitare perdite

Controlliamo se il database è esposto su internet

Nella maggior parte dei casi noti di violazione (ecco, ecco) l'aggressore ha ottenuto l'accesso ai dati in modo semplice e diretto: il database era stato pubblicato su internet e si poteva connettere senza autenticazione.  

Iniziamo a capire la pubblicazione su internet. Come succede? La questione è che per lavorare in modo più flessibile, Elasticsearch si raccomanda crea un cluster di tre server. Affinché i database comunichino tra loro, è necessario aprire delle porte. Di conseguenza, gli amministratori non limitano l'accesso al database, e il database è accessibile da ovunque. Controllare se c'è accesso al database da esterno è semplice. Basta digitare nel browser http://[IP/Nome Elasticsearch]:9200/_cat/nodes?v

Se riesci a entrare, allora è il momento di chiudere.

Proteggiamo la connessione al database

Ora faremo in modo che non si possa connettere al database senza autenticazione.

Elasticsearch ha un modulo di autenticazione che limita l'accesso al database, ma è disponibile solo nel pacchetto a pagamento di plugin X-Pack (1 mese di utilizzo gratuito).

La buona notizia è che nell'autunno del 2019 Amazon ha aperto le sue risorse, che si sovrappongono a X-Pack. La funzione di autenticazione per la connessione al database è diventata disponibile con licenza libera per la versione Elasticsearch 7.3.2 e già in fase di realizzazione è il nuovo rilascio per Elasticsearch 7.4.0.

L'installazione di questo plugin è semplice. Accediamo alla console del server e colleghiamo il repository:

Basato su RPM:

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

yum update

yum install opendistro-security


Basato su DEB:

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

Configuriamo l'interazione tra i server tramite SSL

Durante l'installazione del plugin, viene modificata la configurazione della porta di connessione al database. Viene attivata la crittografia SSL. Affinché i server del cluster possano continuare a interagire tra loro, è necessario impostare la comunicazione tra di essi tramite SSL.

La fiducia tra gli host può essere stabilita usando un proprio certificatore o senza di esso. Con il primo metodo è tutto chiaro: è sufficiente contattare esperti del CA. Passiamo subito al secondo.

  1. Creiamo una variabile con il nome completo del dominio:

    export DOMAIN_CN="example.com"

  2. Creiamo la chiave privata:

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

  3. Firmiamo il certificato radice. Conservalo come la pupilla degli occhi: in caso di perdita o compromissione, sarà necessario riconfigurare la fiducia tra tutti gli host.

    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. Creiamo la chiave per l'amministratore:

    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. Creiamo una richiesta per la firma del certificato:

    openssl req -new -subj "\/C=RU\/ST=Moscow\/O=Moscow Inc.\/CN=${DOMAIN_CN}\/CN=admin " 
    -key admin-key.pem -out admin.csr

  6. Creiamo il certificato per l'amministratore:

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

  7. Creiamo certificati per il 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. Creiamo una richiesta di 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. Firmiamo il certificato:

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

  10. Distribuiamo il certificato tra i nodi Elasticsearch nella cartella:

    /etc/elasticsearch/


    avremo bisogno dei file:

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

  11. Configuriamo /etc/elasticsearch/elasticsearch.yml – cambiamo il nome dei file con i certificati in quelli generati da noi:

    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

Cambiamo le password degli utenti interni

  1. Con il comando sottostante, visualizziamo l'hash della password nella console:

    sh ${OD_SEC}/tools/hash.sh -p [password]

  2. Sostituiamo l'hash nel file con quello ottenuto:

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

Configuriamo il firewall nel sistema operativo

  1. Consentiamo l'avvio del firewall:

    systemctl enable firewalld

  2. Avviamolo:

    systemctl start firewalld

  3. Consentiamo la connessione a Elasticsearch:

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

  4. Riavviamo le regole del firewall:

    firewall-cmd --reload

  5. Mostriamo le regole attive:

    firewall-cmd --list-all

Applichiamo tutte le nostre modifiche a Elasticsearch

  1. Creiamo una variabile con il percorso completo della cartella del plugin:

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

  2. Eseguiamo lo script che aggiornerà le password e verificherà le impostazioni:

    ${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. Verifichiamo se le modifiche sono state applicate:

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

Tutto qui, queste sono le impostazioni minime che proteggono Elasticsearch da accessi non autorizzati.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster