În ultima an, au existat multe scurgeri din baze (, și ). În multe cazuri, baza conținea date personale. Aceste scurgeri ar fi putut fi evitate dacă, după desfășurarea bazei, administratorii ar fi verificat câteva setări simple. Astăzi vom discuta despre acestea.
Mai întâi, trebuie să menționăm că în practica noastră folosim Elasticsearch pentru stocarea logurilor și analiza jurnalelor de securitate, OS și software pe platforma noastră IaaS, conform cerințelor 152-FZ, Cloud-152.

Verificăm dacă baza nu este expusă pe internet
În majoritatea cazurilor cunoscute de scurgeri (, ) atacatorul a obținut acces la date într-un mod simplu: baza a fost publicată pe internet și putea fi conectată fără autentificare.
Începem cu publicarea pe internet. De ce se întâmplă asta? Motivul este că pentru o colaborare mai flexibilă, Elasticsearch creează un cluster din trei servere. Pentru ca bazele de date să comunice între ele, trebuie să deschidem porturi. În consecință, administratorii nu limitează accesul la bază și la Baze de Date se poate conecta din orice parte. Verificarea accesului extern la baza de date este ușoară. Pur și simplu introducem în browser http://[IP/Numele Elasticsearch]:9200/_cat/nodes?v
Dacă reușim să intrăm, atunci trebuie să închidem repede.
Protejăm conexiunea la baza de date
Acum vom face astfel încât baza să nu poată fi accesată fără autentificare.
Elasticsearch are un modul de autentificare, care limitează accesul la bază, însă acesta se află doar în pachetul premium de pluginuri X-Pack (1 lună de utilizare gratuită).
Vestea bună este că, în toamna anului 2019, Amazon a deschis lucrările sale, care se suprapun cu X-Pack. Funcția de autentificare la conectarea la bază a devenit disponibilă sub licență liberă pentru versiunea Elasticsearch 7.3.2, și deja este în lucru un nou release pentru Elasticsearch 7.4.0.
Instalarea acestui plugin este simplă. Accesăm consola serverului și conectăm depozitul:
Bazat pe RPM:
curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo
yum update
yum install opendistro-security
Bazat pe DEB:
wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -Configurăm interacțiunea între servere prin SSL
Atunci când se instalează pluginul, configurația portului de conectare la bază de date se modifică. Pe acesta se activează criptarea SSL. Pentru ca serverele din cluster să poată continua să colaboreze, trebuie să configurați interacțiunea dintre ele prin SSL.
Încrederea între gazde poate fi stabilită fie printr-un centru de certificare propriu, fie fără acesta. Cu prima metodă este clar: trebuie doar să contactați specialiști în CA. Să trecem direct la a doua.
- Creăm o variabilă cu numele complet al domeniului:
export DOMAIN_CN="example.com" - Creăm o cheie privată:
openssl genrsa -out root-ca-key.pem 4096 - Semnăm certificatul rădăcină. Păstrați-l ca pe ochii din cap: în cazul pierderii sau compromiterii sale, va trebui să resetați încrederea între toate gazdele.
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 - Creăm cheie de administrator:
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 - Creăm o cerere pentru semnarea certificatului:
openssl req -new -subj "\/C=RU\/ST=Moscow\/O=Moscow Inc.\/CN=${DOMAIN_CN}\/CN=admin " -key admin-key.pem -out admin.csr - Creăm certificatul de administrator:
openssl x509 -req -extensions usr_cert -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem - Creăm certificate pentru nodul 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 - Creăm o cerere de semnare:
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 - Semnăm certificatul:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem - Distribuim certificatul între nodurile Elasticsearch în folder:
/etc/elasticsearch/
ne vor trebui fișierele:node-01-key.pem node-01.pem admin-key.pem admin.pem root-ca.pem - Configurăm /etc/elasticsearch/elasticsearch.yml – schimbăm numele fișierelor cu certificatele, pe cele generate de 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
Schimbăm parolele utilizatorilor interni
- Folosind comanda de mai jos, afișăm hash-ul parolei în consolă:
sh ${OD_SEC}/tools/hash.sh -p [parolă] - Schimbăm hash-ul din fișier cu cel obținut:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Configurăm firewall-ul în sistemul de operare
- Permitem activarea firewall-ului:
systemctl enable firewalld - Îl pornim:
systemctl start firewalld - Permitem conectarea la Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent - Reîncărcăm regulile firewall-ului:
firewall-cmd --reload - Afișăm regulile funcționale:
firewall-cmd --list-all
Aplicăm toate modificările noastre la Elasticsearch
- Creăm o variabilă cu calea completă către folderul cu pluginul:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/" - Rulăm scriptul care va actualiza parolele și va verifica setările:
${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 - Verificăm dacă modificările au fost aplicate:
curl -XGET https://[IP/Numele Elasticsearch]:9200/_cat/nodes?v -u admin:[parola] --insecure
Asta e tot, acestea sunt setările minime care protejează Elasticsearch de conexiuni neautorizate.
Sursa: habr.com
