Come configurare Elasticsearch per evitare perdite

Negli ultimi dodici mesi ci sono state molte fughe di dati dalle basi. Elasticsearch (ecco, ecco e ecco). In molti casi, i dati personali erano memorizzati nel database. Queste fughe avrebbero potuto essere evitate se gli amministratori avessero controllato alcune semplici impostazioni dopo il deployment del database. Oggi parleremo di queste.

Iniziamo col dire che nella nostra esperienza utilizziamo Elasticsearch per l'archiviazione dei log e l'analisi dei registri dei sistemi di protezione delle informazioni, del sistema operativo e del software sulla nostra piattaforma IaaS, conforme alla normativa 152-FZ, Cloud-152. 

Come configurare Elasticsearch per evitare perdite

Controlliamo che il database non sia visibile su Internet.

Nella maggior parte dei casi noti di fughe (ecco, ecco) gli aggressori hanno ottenuto l'accesso ai dati in modo semplice e diretto: il database era pubblico su Internet e poteva essere collegato senza autenticazione.  

Iniziamo a considerare la pubblicazione su Internet. Perché accade questo? La ragione è che per un'interazione più flessibile con Elasticsearch si raccomanda si crea un cluster di tre server. Affinché i database possano comunicare tra loro, è necessario aprire le porte. Alla fine, gli amministratori non limitano l'accesso al database, rendendolo accessibile da qualsiasi luogo. Verificare se ci sono accessi esterni al database è facile. Basta inserire nel browser http://[IP/Nome Elasticsearch]:9200/_cat/nodes?v

Se ci si riesce a collegare, è il momento di chiudere.

Proteggiamo l'accesso al database.

Adesso faremo in modo che non si possa accedere al database senza autenticazione.

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

La buona notizia è che nell'autunno del 2019 Amazon ha aperto le proprie soluzioni, che si sovrappongono a X-Pack. La funzione di autenticazione per connettersi al database è diventata disponibile con licenza libera per la versione Elasticsearch 7.3.2, e già in lavorazione c'è un 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.

Con l'installazione del plugin, la configurazione della porta di accesso al database cambia. Su essa viene abilitata la crittografia SSL. Affinché i server del cluster possano continuare a funzionare tra di loro, è necessario configurare l'interazione tra loro utilizzando SSL.

Si può stabilire la fiducia tra gli host utilizzando una propria autorità di certificazione o senza di essa. Con il primo metodo è tutto chiaro: basta rivolgersi a esperti di CA. Passiamo subito al secondo.

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

    export DOMAIN_CN="example.com"

  2. Creiamo una chiave privata:

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

  3. Firmiamo il certificato root. Conservalo come la pupilla dei tuoi occhi: in caso di smarrimento 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 di 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 dell'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. Configurare /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

Modifica le password degli utenti interni

  1. Usa il comando sottostante per visualizzare l'hash della password:

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

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

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

Configuriamo il firewall nel sistema operativo

  1. Abilitiamo l'avvio del firewall:

    systemctl enable firewalld

  2. Avviamolo:

    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. Ricarichiamo le regole del firewall:

    firewall-cmd --reload

  5. Mostriamo le regole attive:

    firewall-cmd --list-all

Applichiamo tutte le 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 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. Controlliamo se le modifiche sono state applicate:

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

Tutte queste sono le impostazioni minime che proteggono Elasticsearch da connessioni non autorizzate.

Fonte: habr.com

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