Cum să configurezi Elasticsearch pentru a evita scurgerile

În ultima an, au existat multe scurgeri din baze Elasticsearch (iată, iată și iată). Î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. 

Cum să configurezi Elasticsearch pentru a evita scurgerile

Verificăm dacă baza nu este expusă pe internet

În majoritatea cazurilor cunoscute de scurgeri (iată, iată) 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 se recomandă 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.

  1. Creăm o variabilă cu numele complet al domeniului:

    export DOMAIN_CN="example.com"

  2. Creăm o cheie privată:

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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. Semnăm certificatul:

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

  10. 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

  11. 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

  1. Folosind comanda de mai jos, afișăm hash-ul parolei în consolă:

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

  2. 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

  1. Permitem activarea firewall-ului:

    systemctl enable firewalld

  2. Îl pornim:

    systemctl start firewalld

  3. Permitem conectarea la Elasticsearch:

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

  4. Reîncărcăm regulile firewall-ului:

    firewall-cmd --reload

  5. Afișăm regulile funcționale:

    firewall-cmd --list-all

Aplicăm toate modificările noastre la Elasticsearch

  1. Creăm o variabilă cu calea completă către folderul cu pluginul:

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

  2. 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

  3. 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

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster