Hvordan konfigurere Elasticsearch for å unngå lekkasjer

Det siste året har det vært mange lekkasjer fra databaser Elasticsearch (her, her и her). I mange tilfeller ble personopplysninger lagret i databasen. Disse lekkasjene kunne vært unngått hvis administratorene etter å ha distribuert databasen hadde brydd seg med å sjekke noen enkle innstillinger. I dag skal vi snakke om dem.

La oss umiddelbart ta forbehold om at vi i vår praksis bruker Elasticsearch til å lagre logger og analysere logger over informasjonssikkerhetsverktøy, OS og programvare i vår IaaS-plattform, som oppfyller kravene i 152-FZ, Cloud-152. 

Hvordan konfigurere Elasticsearch for å unngå lekkasjer

Vi sjekker om databasen "stikker ut" til Internett

I de fleste kjente tilfeller av lekkasjer (her, her) angriperen fikk tilgang til dataene enkelt og upretensiøst: databasen ble publisert på Internett, og det var mulig å koble til den uten autentisering.  

La oss først ta for oss publisering på Internett. Hvorfor skjer dette? Faktum er at for mer fleksibel drift av Elasticsearch anbefales opprette en klynge med tre servere. For at databasene skal kommunisere med hverandre, må du åpne porter. Som et resultat begrenser ikke administratorer tilgangen til databasen på noen måte, og du kan koble til databasen fra hvor som helst. Det er enkelt å sjekke om databasen er tilgjengelig utenfra. Bare skriv inn i nettleseren http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Hvis du kan komme inn, så løp for å lukke den.

Beskytter tilkoblingen til databasen

Nå skal vi gjøre det slik at det er umulig å koble til databasen uten autentisering.

Elasticsearch har en autentiseringsmodul som begrenser tilgangen til databasen, men den er kun tilgjengelig i det betalte X-Pack-pluginsettet (1 måned gratis bruk).

Den gode nyheten er at høsten 2019 åpnet Amazon sine utviklinger, som overlapper med X-Pack. Autentiseringsfunksjonen ved tilkobling til en database har blitt tilgjengelig under en gratis lisens for versjon Elasticsearch 7.3.2, og en ny utgivelse for Elasticsearch 7.4.0 er allerede i arbeid.

Denne plugin er enkel å installere. Gå til serverkonsollen og koble til depotet:

RPM-basert:

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

yum update

yum install opendistro-security


DEB-basert:

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

Sette opp interaksjon mellom servere via SSL

Når du installerer plugin, endres konfigurasjonen av porten som kobles til databasen. Den muliggjør SSL-kryptering. For at klyngeserverne skal fortsette å jobbe med hverandre, må du konfigurere interaksjon mellom dem ved hjelp av SSL.

Tillit mellom verter kan etableres med eller uten egen sertifiseringsinstans. Med den første metoden er alt klart: du trenger bare å kontakte CA-spesialister. La oss gå rett til den andre.

  1. Opprett en variabel med hele domenenavnet:

    export DOMAIN_CN="example.com"

  2. Opprett en privat nøkkel:

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

  3. Signer rotsertifikatet. Hold det trygt: hvis det går tapt eller kompromittert, må tilliten mellom alle verter rekonfigureres.

    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. Opprett en administratornøkkel:

    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. Opprett en forespørsel om å signere sertifikatet:

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

  6. Opprett et administratorsertifikat:

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

  7. Opprett sertifikater for 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. Opprett en signaturforespørsel:

    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. Signering av sertifikatet:

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

  10. Plasser sertifikatet mellom Elasticsearch-noder i følgende mappe:

    /etc/elasticsearch/


    vi trenger filene:

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

  11. Konfigurerer /etc/elasticsearch/elasticsearch.yml – endre navnet på filene med sertifikater til de som er generert av oss:

    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

Endring av passord for interne brukere

  1. Ved å bruke kommandoen nedenfor sender vi ut passordhashen til konsollen:

    sh ${OD_SEC}/tools/hash.sh -p [пароль]

  2. Endre hashen i filen til den mottatte:

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

Sette opp en brannmur i operativsystemet

  1. La brannmuren starte:

    systemctl enable firewalld

  2. La oss lansere det:

    systemctl start firewalld

  3. Tillat tilkobling til Elasticsearch:

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

  4. Last inn brannmurreglene på nytt:

    firewall-cmd --reload

  5. Her er arbeidsreglene:

    firewall-cmd --list-all

Bruker alle endringene våre på Elasticsearch

  1. Lag en variabel med hele banen til mappen med plugin:

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

  2. La oss kjøre et skript som vil oppdatere passord og sjekke innstillinger:

    ${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. Sjekk om endringene er tatt i bruk:

    curl -XGET https://[IP/Имя Elasticsearch]:9200/_cat/nodes?v -u admin:[пароль] --insecure

Det er alt, dette er minimumsinnstillingene som beskytter Elasticsearch mot uautoriserte tilkoblinger.

Kilde: www.habr.com

Legg til en kommentar