Jak skonfigurować Elasticsearch, aby uniknąć wycieków

W ostatnim roku pojawiło się wiele wycieków z baz danych Elasticsearch (oto, oto i oto). W wielu przypadkach w bazie przechowywane były dane osobowe. Można było uniknąć tych wycieków, gdyby po wdrożeniu bazy administratorzy zadbali o kilka prostych ustawień. Dzisiaj o nich porozmawiamy.

Od razu zaznaczymy, że w naszej praktyce używamy Elasticsearch do przechowywania logów i analizy dzienników środków ochrony informacji, systemu operacyjnego i oprogramowania w naszej platformie IaaS, spełniającej wymagania ustawy 152-FZ, Cloud-152. 

Jak skonfigurować Elasticsearch, aby uniknąć wycieków

Sprawdzamy, czy baza nie jest dostępna w internecie

W większości znanych przypadków wycieków (oto, oto) haker uzyskał dostęp do danych dość prosto: baza była opublikowana w internecie i można się do niej podłączyć bez uwierzytelnienia.  

Najpierw przyjrzyjmy się publikacji w internecie. Dlaczego tak się dzieje? Chodzi o to, że dla bardziej elastycznej pracy Elasticsearch zaleca się tworzy się klaster z trzech serwerów. Aby bazy danych mogły się komunikować, trzeba otworzyć porty. W efekcie administratorzy w żaden sposób nie ograniczają dostępu do bazy, więc można się do niej podłączyć zdalnie. Sprawdzić, czy baza jest dostępna z zewnątrz, jest łatwo. Wystarczy w przeglądarce wpisać http://[IP/Nazwa Elasticsearch]:9200/_cat/nodes?v

Jeśli można się zalogować, trzeba natychmiast to zamknąć.

Zabezpieczamy połączenie z bazą danych

Teraz zrobimy tak, aby nie można było połączyć się z bazą bez uwierzytelnienia.

Elasticsearch ma moduł uwierzytelniania, który ogranicza dostęp do bazy, ale jest on dostępny tylko w płatnym zestawie wtyczek X-Pack (1 miesiąc bezpłatnego korzystania).

Dobrą wiadomością jest to, że jesienią 2019 roku Amazon ujawnił swoje rozwiązania, które pokrywają się z X-Pack. Funkcja uwierzytelniania przy połączeniu z bazą stała się dostępna na wolnej licencji dla wersji Elasticsearch 7.3.2, a nowa wersja dla Elasticsearch 7.4.0 jest już w trakcie prac.

Instalacja tej wtyczki jest prosta. Wchodzimy do konsoli serwera i podłączamy repozytorium:

Na bazie RPM:

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

yum update

yum install opendistro-security


Na bazie DEB:

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

Konfigurujemy interakcję między serwerami za pomocą SSL

Podczas instalacji wtyczki zmienia się konfiguracja portu połączenia z bazą danych. Włącza się szyfrowanie SSL. Aby serwery klastra mogły dalej ze sobą współpracować, należy skonfigurować interakcję między nimi za pomocą SSL.

Zaufanie między hostami można ustanowić za pomocą własnego centrum certyfikacji lub bez niego. W przypadku pierwszej metody wszystko jest jasne: wystarczy skontaktować się z ekspertami od CA. Przejdźmy od razu do drugiej.

  1. Tworzymy zmienną z pełną nazwą domeny:

    export DOMAIN_CN="example.com"

  2. Tworzymy klucz prywatny:

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

  3. Podpisujemy certyfikat root. Przechowuj go jak oczko w głowie: w przypadku jego utraty lub kompromitacji, zaufanie między wszystkimi hostami będzie wymagało ponownej konfiguracji.

    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. Tworzymy klucz administratora:

    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. Tworzymy żądanie podpisu certyfikatu:

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

  6. Tworzymy certyfikat administratora:

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

  7. Tworzymy certyfikaty dla węzła 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. Tworzymy żądanie podpisu:

    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. Podpisujemy certyfikat:

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

  10. Rozkładamy certyfikat między węzłami Elasticsearch w folderze:

    /etc/elasticsearch/


    będziemy potrzebować plików:

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

  11. Konfigurujemy /etc/elasticsearch/elasticsearch.yml – zmieniamy nazwy plików z certyfikatami na te, które wygenerowaliśmy:

    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

Zmiana haseł wewnętrznych użytkowników

  1. Użyj poniższego polecenia, aby wyświetlić hasz hasła w konsoli:

    sh ${OD_SEC}/tools/hash.sh -p [hasło]

  2. Zmieniamy hasz w pliku na otrzymany:

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

Konfigurujemy zaporę ogniową w systemie operacyjnym

  1. Pozwalamy na uruchomienie zapory ogniowej:

    systemctl enable firewalld

  2. Uruchamiamy ją:

    systemctl start firewalld

  3. Pozwalamy na połączenie z Elasticsearch:

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

  4. Przeładuj zasady zapory ogniowej:

    firewall-cmd --reload

  5. Wyświetlamy działające zasady:

    firewall-cmd --list-all

Wprowadzamy wszystkie nasze zmiany do Elasticsearch

  1. Tworzymy zmienną z pełną ścieżką do folderu z wtyczką:

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

  2. Uruchamiamy skrypt, który zaktualizuje hasła i sprawdzi ustawienia:

    ${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. Sprawdzamy, czy zmiany zostały zastosowane:

    curl -XGET https://[IP/Nazwa Elasticsearch]:9200/_cat/nodes?v -u admin:[hasło] --insecure

To wszystko, to minimalne ustawienia, które zabezpieczają Elasticsearch przed nieautoryzowanym połączeniem.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster