Jak nastavit Elasticsearch, aby nedocházelo k únikům

V uplynulém roce došlo k mnoha únikům z databází Elasticsearch (tady je, tady je a tady je). V mnoha případech obsahovaly databáze osobní údaje. Těmto únikům by se dalo předejít, kdyby po nasazení databáze administrátoři zkontrolovali několik jednoduchých nastavení. Dnes se na ně podíváme.

Hned na úvod si ujasníme, že v naší praxi používáme Elasticsearch pro ukládání logů a analýzu protokolů informačních ochranných prostředků, operačních systémů a software na naší IaaS platformě, která splňuje požadavky 152-FZ, Cloud-152. 

Jak nastavit Elasticsearch, aby nedocházelo k únikům

Kontrolujeme, zda databáze není 'exposed' na internetu

Ve většině známých případů úniků (tady je, tady je) útočník získal přístup k datům jednoduchým a primitivním způsobem: databáze byla zveřejněna na internetu a bylo možné se k ní připojit bez autentizace.  

Nejprve si objasníme, jak to s publikováním na internetu funguje. Proč k tomu dochází? Je to proto, že pro flexibilnější práci s Elasticsearch se doporučuje vytváříme cluster ze tří serverů. Aby si databáze mohly mezi sebou vyměňovat informace, je nutné otevřít porty. Nakonec administrátoři nijak neomezují přístup k databázi, takže se k DB dá připojit odkudkoli. Zkontrolovat, zda k databázi existuje externí přístup, je jednoduché. Stačí v prohlížeči zadat http://[IP/Název Elasticsearch]:9200/_cat/nodes?v

Pokud se podaří dostat dovnitř, jde rychle zavřít.

Chceme chránit připojení k DB

Nyní uděláme tak, aby se k databázi nedalo připojit bez autentizace.

Elasticsearch má autentizační modul, který omezuje přístup k databázi, ale je pouze v placené sadě pluginů X-Pack (1 měsíc zdarma).

Dobrou zprávou je, že na podzim 2019 Amazon otevřel své dovednosti, které překrývají s X-Pack. Funkce autentizace při připojení k databázi se stala dostupnou pod svobodnou licencí pro verzi Elasticsearch 7.3.2 a již je na cestě nový vydání pro Elasticsearch 7.4.0.

Instalace tohoto pluginu je jednoduchá. Přihlaste se do konzole serveru a připojte repozitář:

RPM Based:

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

yum update

yum install opendistro-security


DEB Based:

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

Nastavujeme interakci mezi servery přes SSL

Při instalaci pluginu se mění konfigurace portu pro připojení k databázi. Na něm se aktivuje šifrování SSL. Aby servery v clusteru mohly i nadále spolupracovat, je nutné nastavit mezi nimi interakci pomocí SSL.

Důvěru mezi hostiteli lze navázat buď prostřednictvím vlastního certifikačního úřadu, nebo bez něj. U prvního způsobu je vše jasné: stačí se obrátit na specialisty z CA. Přeskočme tedy rovnou na druhý.

  1. Vytváříme proměnnou s plným názvem domény:

    export DOMAIN_CN="example.com"

  2. Vytváříme soukromý klíč:

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

  3. Podepisujeme kořenový certifikát. Uchovávejte ho jako oko v hlavě: při jeho ztrátě nebo kompromitaci bude nutné znovu nastavit důvěru mezi všemi hostiteli.

    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. Vytváříme klíč administrátora:

    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. Vytváříme žádost o podepsání certifikátu:

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

  6. Vytváříme certifikát administrátora:

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

  7. Vytváříme certifikáty pro uzel 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. Vytváříme žádost o podepsání:

    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. Podepisujeme certifikát:

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

  10. Rozkládáme certifikát mezi uzly Elasticsearch do složky:

    /etc/elasticsearch/


    budeme potřebovat soubory:

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

  11. Nastavujeme /etc/elasticsearch/elasticsearch.yml – měníme názvy souborů s certifikáty na námi vygenerované:

    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

Měníme hesla interních uživatelů

  1. Pomocí níže uvedeného příkazu vypíšeme hash hesla do konzole:

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

  2. Měníme hash v souboru na získaný:

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

Nastavujeme firewall v OS

  1. Umožňujeme spuštění firewallu:

    systemctl enable firewalld

  2. Spouštíme ho:

    systemctl start firewalld

  3. Umožňujeme připojení k Elasticsearch:

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

  4. Znovu načítáme pravidla firewallu:

    firewall-cmd --reload

  5. Zobrazujeme aktuální pravidla:

    firewall-cmd --list-all

Aplikujeme všechny naše změny na Elasticsearch

  1. Vytváříme proměnnou s úplnou cestou k adresáři s pluginem:

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

  2. Spouštíme skript, který aktualizuje hesla a zkontroluje nastavení:

    ${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. Kontrolujeme, zda se změny projevily:

    curl -XGET https://[IP/Název Elasticsearch]:9200/_cat/nodes?v -u admin:[heslo] --insecure

To jsou minimální nastavení, která zabezpečují Elasticsearch před neoprávněným připojením.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster