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 ? VWenn 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.- Erstellen Sie eine Variable mit dem vollständig qualifizierten Domänennamen:
export DOMAIN_CN="example.com"
- Erstellen Sie einen privaten Schlüssel:
openssl genrsa -out root-ca-key.pem 4096
- 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
- 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
- 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
- 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
- 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
- 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
- Wir unterschreiben das Zertifikat:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial \
-sha256 -out node.pem
- 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
- 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
- Mit dem folgenden Befehl zeigen wir den Passwort-Hash in der Konsole an:
sh ${OD_SEC}/tools/hash.sh -p []
- Ä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
- Ermöglichen Sie den Start der Firewall:
systemctl enable firewalld
- Starte es:
systemctl start firewalld
- Wir erlauben die Verbindung zu Elasticsearch:
firewall-cmd --set-default-zone work
firewall-cmd --zone=work --add-port=9200/TCP --permanent
- Neustart der Firewall-Regeln:
firewall-cmd --reload
- Wir leiten die Arbeitsregeln ab:
firewall-cmd --list-all
Wenden Sie alle unsere Änderungen auf Elasticsearch an
- Erstellen Sie mit dem Plugin eine Variable mit dem vollständigen Pfad zum Ordner:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"
- 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
- Ü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.