Hvordan man konfigurerer Elasticsearch for at undgå lækager

I det forgangne år har der været mange lækager fra databaser Elasticsearch (her, her og her). I mange tilfælde blev der opbevaret personlige data i databasen. Disse lækager kunne være undgået, hvis administratorerne havde taget sig tid til at kontrollere et par enkle indstillinger efter oprettelsen af databasen. I dag vil vi tale om dem.

Vi bruger Elasticsearch i vores praksis til opbevaring af logs og analyse af logfiler fra informationsbeskyttelsesværktøjer, operativsystemer og software i vores IaaS-platform, der lever op til kravene i 152-FZ, Cloud-152. 

Hvordan man konfigurerer Elasticsearch for at undgå lækager

Lad os tjekke, om databasen 'stikker ud' på internettet

I de fleste kendte tilfælde af lækager (her, her) fik angrebsmænd adgang til dataene på en enkel og ligetil måde: databasen blev offentliggjort på internettet, og den kunne tilgås uden autentifikation.  

Lad os først tage et kig på offentliggørelsen på internettet. Hvorfor sker det så? Det skyldes, at Elasticsearch kræver anbefales at oprette et cluster med tre servere. For at databaserne kan kommunikere indbyrdes, skal der åbnes porte. Som resultat begrænser administratorerne ikke adgangen til databasen, og databasen kan tilgås fra hvor som helst. Det er nemt at tjekke, om der er adgang til databasen udefra. Bare skriv ind i browseren http://[IP/Elasticsearch Navn]:9200/_cat/nodes?v

Hvis man kan komme ind, så er det tid til at lukke den.

Vi beskytter forbindelsen til databasen

Nu vil vi gøre det umuligt at tilgå databasen uden autentifikation.

Elasticsearch har en autentifikationsmodul, der begrænser adgangen til databasen, men det er kun i den betalte plugin-pakke X-Pack (1 måneds gratis brug).

De gode nyheder er, at Amazon i efteråret 2019 frigav sine udviklinger, som overlapper med X-Pack. Autentifikationsfunktionen ved forbindelse til databasen blev tilgængelig under en fri licens for Elasticsearch version 7.3.2, og der er allerede en ny version til Elasticsearch 7.4.0 på vej.

Denne plugin installeres nemt. Gå ind i serverens konsol og tilføj repositoriet:

RPM-baseret:

curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo

yum update

yum install opendistro-security


DEB-baseret:

wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -

Vi konfigurerer interaktionen mellem serverne via SSL

Når plugin'et installeres, ændres konfigurationen af forbindelsesporten til databasen. SSL-kryptering aktiveres på den. For at kluster-serverne fortsat kan samarbejde, skal kommunikationen mellem dem konfigureres ved hjælp af SSL.

Tillid mellem værter kan etableres ved hjælp af et eget certifikationscenter eller uden det. Med den første metode er alt klart: du skal bare henvende dig til specialister i CA. Lad os gå direkte til den anden.

  1. Vi opretter en variabel med det fulde domænenavn:

    export DOMAIN_CN="example.com"

  2. Vi opretter en privat nøgle:

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

  3. Vi underskriver rodcertifikatet. Opbevar det som en øjesten: hvis det går tabt eller kompromitteres, skal al tillid mellem værterne genkonfigureres.

    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. Vi opretter administratornøglen:

    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. Vi opretter en anmodning om certifikatunderskrift:

    openssl req -new -subj "\/C=RU\/ST=Moscow\/O=Moscow Inc.\/CN=${DOMAIN_CN}\/CN=admin " 
    -key admin-key.pem -out admin.csr

  6. Vi opretter administratorcertifikatet:

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

  7. Vi opretter certifikater til Elasticsearch-noden:

    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. Vi opretter en anmodning om underskrift:

    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. Vi underskriver certifikatet:

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

  10. Vi placerer certifikaterne mellem Elasticsearch-noderne i mappen:

    /etc/elasticsearch/


    Vi får brug for filerne:

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

  11. Vi konfigurerer /etc/elasticsearch/elasticsearch.yml – ændrer navnet på filerne med certifikaterne, til dem vi har genereret:

    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

Ændring af adgangskoder for interne brugere

  1. Vi viser hash-værdien for adgangskoden i konsollen med følgende kommando:

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

  2. Vi ændrer hashen i filen til den opnåede:

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

Vi konfigurerer firewall i OS

  1. Vi tillader, at firewallen kan køre:

    systemctl enable firewalld

  2. Vi starter den:

    systemctl start firewalld

  3. Vi tillader forbindelse til Elasticsearch:

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

  4. Vi genstarter firewallens regler:

    firewall-cmd --reload

  5. Vi viser de aktive regler:

    firewall-cmd --list-all

Anvender alle vores ændringer til Elasticsearch

  1. Opretter en variabel med den fulde sti til mappen med pluginet:

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

  2. Kører scriptet, der opdaterer adgangskoderne og tjekker indstillingerne:

    ${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. Tjekker, om ændringerne er anvendt:

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

Det er alt, det er de minimale indstillinger, der beskytter Elasticsearch mod ikke-autorisere forbindelser.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster