So konfigurieren Sie Elasticsearch so, dass keine Lecks auftreten

Im letzten Jahr gab es viele Lecks in Elasticsearch- Datenbanken ( hier , hier und da ). In vielen Fällen wurden personenbezogene Daten in der Datenbank gespeichert. Diese Lecks könnten vermieden werden, wenn sich Administratoren nach der Bereitstellung der Datenbank die Mühe machen würden, einige einfache Einstellungen zu überprüfen. Heute werden wir darüber sprechen.

Wir werden sofort reservieren, dass wir in unserer Praxis Elasticsearch verwenden, um Protokolle zu speichern und Protokolle von Informationsschutz-Tools, Betriebssystemen und Software auf unserer IaaS-Plattform zu analysieren, die die Anforderungen von 152-, Cloud-152 erfüllen. 



Überprüfen Sie, ob die Datenbank "klebt".


In den meisten bekannten Fällen von Lecks ( hier , hier ) erhielt der Angreifer einfach und unprätentiös Zugriff auf die Daten: Die Datenbank wurde im Internet veröffentlicht, und es war möglich, ohne Authentifizierung eine Verbindung zu ihr herzustellen.  

Zunächst werden wir uns mit dem Veröffentlichen im Internet befassen. Warum ist das so? Tatsache ist, dass für einen flexibleren Betrieb von Elasticsearch empfohlen wird , einen Cluster mit drei Servern zu erstellen. Damit die Datenbanken miteinander kommunizieren können, müssen Sie die Ports öffnen. Infolgedessen beschränken Administratoren den Zugriff auf die Datenbank nicht, und Sie können von überall aus eine Verbindung zur Datenbank herstellen. Es ist einfach zu überprüfen, ob externer Zugriff auf die Datenbank besteht. Geben Sie einfach http: // [IP / Elasticsearch Name]: 9200 / _cat / node? Im Browser ein ? V

Wenn Sie sich anmelden können, führen Sie zum Schließen aus.

Wir schützen die Verbindung zur Datenbank


Jetzt machen wir es unmöglich, ohne Authentifizierung eine Verbindung zur Datenbank herzustellen.

Elasticsearch verfügt über ein Authentifizierungsmodul, das den Zugriff auf die Datenbank einschränkt, jedoch nur in den kostenpflichtigen X-Pack-Plugins (1 Monat kostenlose Nutzung).

Die gute Nachricht ist, dass Amazon im Herbst 2019 seine Grundlagen für das X-Pack eröffnet hat. Die Authentifizierungsfunktion beim Herstellen einer Verbindung zur Datenbank ist unter einer kostenlosen Lizenz für Version Elasticsearch 7.3.2 verfügbar. Eine neue Version für Elasticsearch 7.4.0 ist bereits in Betrieb.

Die Installation dieses Plugins ist einfach. Wir gehen in die Serverkonsole und verbinden das Repository:

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-basiert:

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

Wir konfigurieren die Interaktion zwischen Servern über SSL


Bei der Installation des Plugins ändert sich die Konfiguration des Datenbankverbindungsports. Es enthält SSL-Verschlüsselung. Damit die Cluster-Server weiterhin miteinander arbeiten können, müssen Sie die Interaktion zwischen ihnen mithilfe von SSL konfigurieren.

Das Vertrauen zwischen Hosts kann mit oder ohne Ihre eigene Zertifizierungsstelle hergestellt werden. Bei der ersten Methode ist alles klar: Sie müssen sich nur an einen Spezialisten für CA wenden. Wir fahren sofort mit dem zweiten fort.

  1. Erstellen Sie eine Variable mit dem vollständig qualifizierten Domänennamen:

    export DOMAIN_CN="example.com"
  2. Erstellen Sie einen privaten Schlüssel:

    openssl genrsa -out root-ca-key.pem 4096
  3. Wir unterschreiben das Stammzertifikat. Behalten Sie es als den Apfel Ihres Auges: Wenn es verloren geht oder gefährdet ist, muss das Vertrauen zwischen allen Hosts neu konfiguriert werden.

    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. Erstellen Sie einen Administratorschlüssel:

    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 Sie eine Anforderung zum Signieren eines Zertifikats:

    openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${DOMAIN_CN}/CN=admin " \
    -key admin-key.pem -out admin.csr
  6. Erstellen Sie ein 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. Erstellen Sie Zertifikate für den Elasticsearch-Knoten:

    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. Erstellen Sie eine Anfrage zur Unterschrift:

    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 unterschreiben das Zertifikat:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial \
    -sha256 -out node.pem
  10. Wir zerlegen das Zertifikat zwischen Elasticsearch-Knoten in den Ordner:

    /etc/elasticsearch/

    Wir brauchen die Dateien:

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem
  11. Richten Sie /etc/elasticsearch/elasticsearch.yml - den Namen der Zertifikatsdateien zu den von uns erzeugten diejenigen ändern:

    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

Wir ändern Passwörter interner Benutzer


  1. Mit dem folgenden Befehl zeigen wir den Passwort-Hash in der Konsole an:

    sh ${OD_SEC}/tools/hash.sh -p []
  2. Ändern Sie den Hash in der Datei in den empfangenen:

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

Konfigurieren Sie die Firewall im Betriebssystem


  1. Ermöglichen Sie den Start der Firewall:

    systemctl enable firewalld
  2. Starte es:

    systemctl start firewalld
  3. Wir erlauben die Verbindung zu Elasticsearch:

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent
  4. Neustart der Firewall-Regeln:

    firewall-cmd --reload
  5. Wir leiten die Arbeitsregeln ab:

    firewall-cmd --list-all

Wenden Sie alle unsere Änderungen auf Elasticsearch an


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

    export  OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"
  2. Führen Sie ein Skript aus, das Kennwörter aktualisiert und 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 übernommen wurden:

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

Das sind alles, dies sind die Mindesteinstellungen, die Elasticsearch von einer nicht autorisierten Verbindung abhalten.

Source: https://habr.com/ru/post/undefined/


All Articles