Wie man Elasticsearch konfiguriert, um Datenlecks zu vermeiden

Im letzten Jahr gab es viele Datenlecks aus Datenbanken Elasticsearch (hier ist, hier ist und hier ist). In vielen Fällen wurden in der Datenbank persönliche Daten gespeichert. Diese Lecks hätten vermieden werden können, wenn die Administratoren nach der Bereitstellung der Datenbank ein paar einfache Einstellungen überprüft hätten. Heute werden wir darüber sprechen.

Um gleich zu Beginn klarzustellen, verwenden wir in unserer Praxis Elasticsearch zur Speicherung von Protokollen und zur Analyse von Logs aus Informationsschutzsystemen, Betriebssystemen und Software auf unserer IaaS-Plattform, die den Anforderungen des 152-FZ-Gesetzes und Cloud-152 entspricht. 

Wie man Elasticsearch konfiguriert, um Datenlecks zu vermeiden

Wir überprüfen, ob die Datenbank nicht ungeschützt im Internet ist

In den meisten bekannten Fällen von Datenlecks (hier ist, hier ist) hatte der Angreifer einfach und unkompliziert Zugang zu den Daten: Die Datenbank wurde im Internet veröffentlicht und konnte ohne Authentifizierung verbunden werden.  

Zunächst wollen wir klären, wie es zur Veröffentlichung im Internet kommt. Warum ist das so? Der Grund ist, dass für eine flexiblere Nutzung von Elasticsearch es empfohlen wird Erstellen Sie einen Cluster aus drei Servern. Damit die Datenbanken miteinander kommunizieren, müssen Ports geöffnet werden. In der Folge gibt es für Administratoren keine Einschränkungen beim Zugriff auf die Datenbank, und die Datenbank kann von überall aus erreicht werden. Um zu überprüfen, ob von außen auf die Datenbank zugegriffen werden kann, geben Sie einfach Folgendes in den Browser ein: http://[IP/Elasticsearch-Name]:9200/_cat/nodes?v

Wenn der Zugriff möglich ist, sollten Sie ihn sofort schließen.

Wir schützen die Verbindung zur Datenbank.

Jetzt stellen wir sicher, dass kein Zugriff auf die Datenbank ohne Authentifizierung möglich ist.

Elasticsearch hat ein Authentifizierungsmodul, das den Zugriff auf die Datenbank einschränkt, aber es ist nur im kostenpflichtigen X-Pack-Plugin-Set erhältlich (1 Monat kostenlos).

Die gute Nachricht ist, dass Amazon im Herbst 2019 seine Entwicklungen veröffentlicht hat, die sich mit X-Pack überschneiden. Die Authentifizierungsfunktion für den Datenbankzugriff ist nun unter einer freien Lizenz für Elasticsearch Version 7.3.2 verfügbar, und es gibt bereits einen neuen Release für Elasticsearch 7.4.0 in Arbeit.

Dieses Plugin wird ganz einfach installiert. Gehen Sie zur Serverkonsole und fügen Sie das Repository hinzu:

RPM-basiert:

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

yum update

yum install opendistro-security


DEB-basiert:

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

Einrichten der Kommunikation zwischen Servern über SSL

Bei der Installation des Plugins ändert sich die Konfiguration des Anschlussport für die Datenbank. Dort wird die SSL-Verschlüsselung aktiviert. Damit die Cluster-Server weiterhin miteinander kommunizieren können, muss die Verbindung zwischen ihnen mittels SSL eingerichtet werden.

Das Vertrauen zwischen den Hosts kann entweder mit einer eigenen Zertifizierungsstelle oder ohne diese hergestellt werden. Beim ersten Ansatz ist alles klar: Man muss sich einfach an CA-Experten wenden. Lass uns direkt zum zweiten übergehen.

  1. Erstellen einer Variablen mit dem vollständigen Domainnamen:

    export DOMAIN_CN="example.com"

  2. Erstellen eines privaten Schlüssels:

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

  3. Den Root-Zertifikat signieren. Bewahren Sie es wie einen Augapfel auf: Bei Verlust oder Kompromittierung muss das Vertrauen zwischen allen Hosts neu eingerichtet werden.

    openssl req -new -x509 -sha256 -subj "/C=DE/ST=Bayern/O=München, Inc./CN=${DOMAIN_CN}" 
    -key root-ca-key.pem -out root-ca.pem

  4. Erstellen des Administrator-Schlüssels:

    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. Erstellen einer Zertifikatssignieranfrage:

    openssl req -new -subj "/C=DE/ST=Bayern/O=München Inc./CN=${DOMAIN_CN}/CN=admin " 
    -key admin-key.pem -out admin.csr

  6. Wir erstellen das Administratorzertifikat:

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

  7. Wir erstellen Zertifikate für den Elasticsearch-Node:

    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. Wir erstellen einen Signatur-Antrag:

    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. Wir signieren das Zertifikat:

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

  10. Wir verteilen das Zertifikat zwischen den Elasticsearch-Nodes in den Ordner:

    /etc/elasticsearch/


    Wir benötigen die folgenden Dateien:

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

  11. Wir konfigurieren /etc/elasticsearch/elasticsearch.yml – wir ändern die Namen der Zertifikatsdateien in die von uns generierten:

    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=Moskau Inc.,ST=Moskau,C=RU                                                                                                                                                                                                  
    	opendistro_security.nodes_dn:                                                                                                                                                                                                                      
    	  − CN=node-01.example.com,O=Moskau Inc.,ST=Moskau,C=RU

Passwörter interner Benutzer ändern

  1. Mit dem folgenden Befehl geben wir den Passwort-Hash in der Konsole aus:

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

  2. Wir ersetzen den Hash in der Datei durch den erhaltenen:

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

Firewalls im Betriebssystem konfigurieren

  1. Aktivieren Sie die Firewall:

    systemctl enable firewalld

  2. Starten Sie sie:

    systemctl start firewalld

  3. Erlauben Sie die Verbindung zu Elasticsearch:

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

  4. Laden Sie die Firewall-Regeln neu:

    firewall-cmd --reload

  5. Geben Sie die aktiven Regeln aus:

    firewall-cmd --list-all

Wenden Sie alle Änderungen auf Elasticsearch an

  1. Erstellen Sie eine Variable mit dem vollständigen Pfad zum Plugin-Verzeichnis:

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

  2. Führen Sie das Skript aus, das die Passwörter aktualisiert und die Einstellungen überprüft:

    ${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. Überprüfen Sie, ob die Änderungen angewendet wurden:

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

Das sind die minimalen Einstellungen, die Elasticsearch vor unbefugtem Zugriff schützen.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster