Nell'ultimo anno ci sono state molte violazioni dei database (, e ). 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.

Controlliamo se il database è esposto su internet
Nella maggior parte dei casi noti di violazione (, ) 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 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.
- Creiamo una variabile con il nome completo del dominio:
export DOMAIN_CN="example.com" - Creiamo la chiave privata:
openssl genrsa -out root-ca-key.pem 4096 - 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 - 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 - 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 - 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 - 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 - 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 - Firmiamo il certificato:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem - 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 - 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
- Con il comando sottostante, visualizziamo l'hash della password nella console:
sh ${OD_SEC}/tools/hash.sh -p [password] - Sostituiamo l'hash nel file con quello ottenuto:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Configuriamo il firewall nel sistema operativo
- Consentiamo l'avvio del firewall:
systemctl enable firewalld - Avviamolo:
systemctl start firewalld - Consentiamo la connessione a Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent - Riavviamo le regole del firewall:
firewall-cmd --reload - Mostriamo le regole attive:
firewall-cmd --list-all
Applichiamo tutte le nostre modifiche a Elasticsearch
- Creiamo una variabile con il percorso completo della cartella del plugin:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/" - 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 - 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
