Come configurare Elasticsearch per evitare perdite

Nell'ultimo anno ci sono state molte fughe di informazioni dai database elasticsearch (qui, qui и qui). In molti casi, i dati personali venivano archiviati nel database. Queste fughe di notizie avrebbero potuto essere evitate se, dopo aver distribuito il database, gli amministratori si fossero presi la briga di controllare alcune semplici impostazioni. Oggi ne parleremo.

Precisiamo subito che nella nostra pratica utilizziamo Elasticsearch per archiviare e analizzare i log di strumenti di sicurezza delle informazioni, sistema operativo e software nella nostra piattaforma IaaS, che è conforme ai requisiti di 152-FZ, Cloud-152. 

Come configurare Elasticsearch per evitare perdite

Controlliamo se il database “sporge” su Internet

Nella maggior parte dei casi noti di perdite (qui, qui) l'aggressore è riuscito ad accedere ai dati in modo semplice e senza pretese: la banca dati era pubblicata su Internet ed era possibile collegarsi ad essa senza autenticazione.  

Innanzitutto, occupiamoci della pubblicazione su Internet. Perché succede questo? Il fatto è che per un funzionamento più flessibile di Elasticsearch raccomandato creare un cluster di tre server. Affinché i database possano comunicare tra loro, è necessario aprire le porte. Di conseguenza, gli amministratori non limitano in alcun modo l'accesso al database ed è possibile connettersi al database da qualsiasi luogo. È facile verificare se il database è accessibile dall’esterno. Basta entrare nel browser http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Se riesci ad entrare, corri a chiuderlo.

Protezione della connessione al database

Ora faremo in modo che sia impossibile connettersi al database senza autenticazione.

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

La buona notizia è che nell’autunno del 2019 Amazon ha aperto i suoi sviluppi, che si sovrappongono a X-Pack. La funzione di autenticazione durante la connessione a un database è diventata disponibile con una licenza gratuita per la versione Elasticsearch 7.3.2 ed è già in lavorazione una nuova versione per Elasticsearch 7.4.0.

Questo plugin è facile da installare. Vai alla console del server e collega il repository:

Basato sul numero di giri:

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 -

Configurazione dell'interazione tra server tramite SSL

Durante l'installazione del plugin, la configurazione della porta di connessione al database cambia. Abilita la crittografia SSL. Affinché i server del cluster continuino a funzionare tra loro, è necessario configurare l'interazione tra loro utilizzando SSL.

La fiducia tra host può essere stabilita con o senza la propria autorità di certificazione. Con il primo metodo tutto è chiaro: basta contattare gli specialisti di CA. Passiamo direttamente al secondo.

  1. Crea una variabile con il nome di dominio completo:

    export DOMAIN_CN="example.com"

  2. Crea una chiave privata:

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

  3. Firma il certificato radice. Mantienilo al sicuro: se viene perso o compromesso, la fiducia tra tutti gli host dovrà essere riconfigurata.

    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 chiave 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. Crea una richiesta per firmare il 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. Crea un certificato di 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. Crea 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. Crea 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. Firma del certificato:

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

  10. Posiziona il certificato tra i nodi Elasticsearch nella seguente cartella:

    /etc/elasticsearch/


    abbiamo bisogno dei file:

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

  11. Configurazione /etc/elasticsearch/elasticsearch.yml – cambiare 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

Modifica delle password per gli utenti interni

  1. Utilizzando il comando seguente, inviamo l'hash della password alla console:

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

  2. Cambia l'hash nel file con quello ricevuto:

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

Configurazione di un firewall nel sistema operativo

  1. Consenti l'avvio del firewall:

    systemctl enable firewalld

  2. Lanciamolo:

    systemctl start firewalld

  3. Consenti la connessione a Elasticsearch:

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

  4. Ricaricare le regole del firewall:

    firewall-cmd --reload

  5. Ecco le regole di lavoro:

    firewall-cmd --list-all

Applicazione di tutte le nostre modifiche a Elasticsearch

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

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

  2. Eseguiamo uno script che aggiornerà le password e controllerà 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. Controlla se le modifiche sono state applicate:

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

Questo è tutto, queste sono le impostazioni minime che proteggono Elasticsearch da connessioni non autorizzate.

Fonte: habr.com

Aggiungi un commento