Im letzten Jahr gab es viele Datenlecks aus Datenbanken (, und ). In vielen Fällen waren in der Datenbank personenbezogene Daten gespeichert. Diese Lecks hätten vermieden werden können, wenn die Administratoren nach dem Bereitstellen der Datenbank einige einfache Einstellungen überprüft hätten. Darüber werden wir heute sprechen.
Zuerst sei gesagt, dass wir in unserer Praxis Elasticsearch zur Speicherung von Protokollen und zur Analyse von Informationen über sicherheitstechnische Mittel, Betriebssysteme und Software auf unserer IaaS-Plattform verwenden, die den Anforderungen des 152-FZ und Cloud-152 entspricht.

Wir überprüfen, ob die Datenbank nicht im Internet zugänglich ist.
In den meisten bekannten Fällen von Datenlecks (, ) hatte der Angreifer ganz einfach Zugang zu den Daten: Die Datenbank wurde im Internet veröffentlicht und konnte ohne Authentifizierung aufgerufen werden.
Zuerst klären wir die Veröffentlichung im Internet. Wie kommt es dazu? Das liegt daran, dass Elasticsearch für eine flexiblere Nutzung einen Cluster aus drei Servern erstellt. Damit die Datenbanken miteinander kommunizieren können, müssen Ports geöffnet werden. Infolgedessen beschränken Administratoren den Zugang zur Datenbank nicht, und die Datenbank kann von überall aus erreicht werden. Es ist einfach zu überprüfen, ob die Datenbank von außen zugänglich ist. Geben Sie einfach im Browser ein: http://[IP/Elasticsearch-Name]:9200/_cat/nodes?v
Wenn Sie Zugang haben, sollten Sie ihn schnellstmöglich schließen.
Wir sichern die Verbindung zur Datenbank.
Jetzt sorgen wir dafür, dass keine Verbindung zur Datenbank ohne Authentifizierung hergestellt werden kann.
Elasticsearch hat ein Authentifizierungsmodul, das den Zugang zur Datenbank einschränkt, aber dieses ist nur im kostenpflichtigen Plugin-Paket X-Pack enthalten (1 Monat kostenlose Nutzung).
Die guten Nachrichten sind, dass Amazon im Herbst 2019 seine Entwicklungen, die mit X-Pack überschneiden, veröffentlicht hat. Die Authentifizierungsfunktion beim Zugriff auf die Datenbank ist jetzt unter einer freien Lizenz für die Elasticsearch-Version 7.3.2 verfügbar, und ein neues Release für Elasticsearch 7.4.0 ist bereits in Arbeit.
Dieses Plugin lässt sich einfach installieren. Melden Sie sich an der Serverkonsole an und fügen Sie das Repository hinzu:
Basierend auf RPM:
curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo
yum update
yum install opendistro-security
Basierend auf DEB:
wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -Wir konfigurieren die Interaktion zwischen den Servern über SSL.
Bei der Installation des Plugins wird die Konfiguration des Ports, der zur Verbindung mit der Datenbank verwendet wird, geändert. SSL-Verschlüsselung wird aktiviert. Damit die Cluster-Server weiterhin miteinander arbeiten können, ist es erforderlich, die Interaktion zwischen ihnen mithilfe von SSL einzurichten.
Vertrauen zwischen Hosts kann entweder durch einen eigenen Zertifizierungsstelle oder ohne diese hergestellt werden. Mit der ersten Methode ist alles klar: man sollte sich einfach an CA-Experten wenden. Lassen Sie uns direkt zur zweiten übergehen.
- Wir erstellen eine Variable mit dem vollständigen Domainnamen:
export DOMAIN_CN="example.com" - Wir erstellen einen privaten Schlüssel:
openssl genrsa -out root-ca-key.pem 4096 - Wir signieren das Wurzelzertifikat. Bewahren Sie es wie einen Augapfel auf: Bei Verlust oder Kompromittierung 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 - Wir erstellen einen Administrator-Schlü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 - Wir erstellen eine Anfrage zur Signierung des Zertifikats:
openssl req -new -subj "\/C=RU\/ST=Moscow\/O=Moscow Inc.\/CN=${DOMAIN_CN}\/CN=admin " -key admin-key.pem -out admin.csr - Wir erstellen das Administrator-Zertifikat:
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-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 - Wir erstellen eine Signierungsanfrage:
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-Knoten in den Ordner:
/etc/elasticsearch/
Wir benötigen die 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 Dateinamen der Zertifikate 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
Wir ändern die Passwörter für interne Benutzer
- Mit dem folgenden Befehl geben wir den Passwort-Hash in der Konsole aus:
sh ${OD_SEC}/tools/hash.sh -p [пароль] - Wir ändern den Hash in der Datei auf den erhaltenen:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Wir konfigurieren die Firewall im Betriebssystem
- Wir erlauben den Start der Firewall:
systemctl enable firewalld - Wir starten sie:
systemctl start firewalld - Wir erlauben die Verbindung zu Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent - Wir laden die Firewall-Regeln neu:
firewall-cmd --reload - Wir geben die aktiven Regeln aus:
firewall-cmd --list-all
Wir wenden alle unsere Änderungen auf Elasticsearch an
- Wir erstellen eine Variable mit dem vollständigen Pfad zum Ordner des Plugins:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/" - Wir starten das Skript, 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 - Wir überprüfen, ob die Änderungen angewendet wurden:
curl -XGET https://[IP/Elasticsearch-Name]:9200/_cat/nodes?v -u admin:[passwort] --insecure
Das sind die minimalen Einstellungen, die Elasticsearch vor unautorisierten Verbindungen schützen.
Quelle: habr.com
