Im letzten Jahr gab es viele Datenlecks aus Datenbanken (, und ). 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.

Wir überprüfen, ob die Datenbank nicht ungeschützt im Internet ist
In den meisten bekannten Fällen von Datenlecks (, ) 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 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.
- Erstellen einer Variablen mit dem vollständigen Domainnamen:
export DOMAIN_CN="example.com" - Erstellen eines privaten Schlüssels:
openssl genrsa -out root-ca-key.pem 4096 - 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 - 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 - 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 - 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 - 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 - 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 - Wir signieren das Zertifikat:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem - 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 - 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
- Mit dem folgenden Befehl geben wir den Passwort-Hash in der Konsole aus:
sh ${OD_SEC}/tools/hash.sh -p [пароль] - Wir ersetzen den Hash in der Datei durch den erhaltenen:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Firewalls im Betriebssystem konfigurieren
- Aktivieren Sie die Firewall:
systemctl enable firewalld - Starten Sie sie:
systemctl start firewalld - Erlauben Sie die Verbindung zu Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent - Laden Sie die Firewall-Regeln neu:
firewall-cmd --reload - Geben Sie die aktiven Regeln aus:
firewall-cmd --list-all
Wenden Sie alle Änderungen auf Elasticsearch an
- Erstellen Sie eine Variable mit dem vollständigen Pfad zum Plugin-Verzeichnis:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/" - 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 - Ü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
