Au cours de la derniĂšre annĂ©e, il y a eu de nombreuses fuites dans les bases de donnĂ©es Elasticsearch ( ici , ici et lĂ ). Dans de nombreux cas, des donnĂ©es personnelles ont Ă©tĂ© stockĂ©es dans la base de donnĂ©es. Ces fuites pourraient ĂȘtre Ă©vitĂ©es si, aprĂšs le dĂ©ploiement de la base de donnĂ©es, les administrateurs prenaient la peine de vĂ©rifier quelques paramĂštres simples. Aujourd'hui, nous en parlerons.Nous rĂ©servons immĂ©diatement que, dans notre pratique, nous utilisons Elasticsearch pour stocker des journaux et analyser les journaux des outils de protection des informations, du systĂšme d'exploitation et des logiciels dans notre plate-forme IaaS qui rĂ©pondent aux exigences de 152-, Cloud-152. 
Vérifiez si la base de données «colle»
Dans la plupart des cas connus de fuites ( ici , ici ), l'attaquant a eu accĂšs aux donnĂ©es simplement et sans prĂ©tention: la base de donnĂ©es a Ă©tĂ© publiĂ©e sur Internet, et il Ă©tait possible de s'y connecter sans authentification. Tout d'abord, nous traiterons de la publication sur Internet. Pourquoi cela est-il ainsi? Le fait est que pour un fonctionnement plus flexible d'Elasticsearch, il est recommandĂ© de crĂ©er un cluster de trois serveurs. Pour que les bases de donnĂ©es communiquent entre elles, vous devez ouvrir les ports. Par consĂ©quent, les administrateurs ne restreignent pas l'accĂšs Ă la base de donnĂ©es et vous pouvez vous connecter Ă la base de donnĂ©es oĂč que vous soyez. Il est facile de vĂ©rifier s'il existe un accĂšs externe Ă la base de donnĂ©es. Entrez simplement http: // [Nom IP / Elasticsearch]: 9200 / _cat / nĆuds? Dans le navigateur ? VSi vous parvenez Ă vous connecter, exĂ©cutez pour fermer.Nous protĂ©geons la connexion Ă la base de donnĂ©es
Maintenant, nous rendrons impossible la connexion à la base de données sans authentification.Elasticsearch possÚde un module d'authentification qui restreint l'accÚs à la base de données, mais il ne se trouve que dans l'ensemble payant de plug-ins X-Pack (1 mois d'utilisation gratuite).La bonne nouvelle est qu'à l'automne 2019, Amazon a ouvert ses bases qui croisent le X-Pack. La fonction d'authentification lors de la connexion à la base de données est devenue disponible sous une licence gratuite pour la version Elasticsearch 7.3.2., Et une nouvelle version pour Elasticsearch 7.4.0 est déjà en service.L'installation de ce plugin est simple. Nous allons dans la console du serveur et connectons le référentiel:basé sur RPM:curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo
yum update
yum install opendistro-security
BasĂ© sur DEB:wget -qO â https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -
Nous configurons l'interaction entre les serveurs via SSL
Lors de l'installation du plugin, la configuration du port de connexion Ă la base de donnĂ©es change. Il inclut le cryptage SSL. Pour que les serveurs de cluster continuent de fonctionner entre eux, vous devez configurer l'interaction entre eux Ă l'aide de SSL.La confiance entre les hĂŽtes peut ĂȘtre Ă©tablie avec ou sans votre propre autoritĂ© de certification. Avec la premiĂšre mĂ©thode, tout est clair: il suffit de contacter un spĂ©cialiste en CA. Nous passons immĂ©diatement au second.- CrĂ©ez une variable avec le nom de domaine complet:
export DOMAIN_CN="example.com"
- Créez une clé privée:
openssl genrsa -out root-ca-key.pem 4096
- Nous signons le certificat racine. Gardez-le comme la prunelle de vos yeux: s'il est perdu ou compromis, la confiance entre tous les hĂŽtes devra ĂȘtre reconfigurĂ©e.
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
- Créez une clé d'administration:
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
- Créez une demande de signature d'un certificat:
openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${DOMAIN_CN}/CN=admin " \
-key admin-key.pem -out admin.csr
- Créez un certificat d'administrateur:
openssl x509 -req -extensions usr_cert -in admin.csr -CA root-ca.pem \
-CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem
- CrĂ©ez des certificats pour le nĆud Elasticsearch:
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
- Créez une demande de signature:
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
- Nous signons le certificat:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial \
-sha256 -out node.pem
- Nous dĂ©composons le certificat entre les nĆuds Elasticsearch dans le dossier:
/etc/elasticsearch/
nous avons besoin des fichiers:
node-01-key.pem
node-01.pem
admin-key.pem
admin.pem
root-ca.pem
- Configurez /etc/elasticsearch/elasticsearch.yml - changez le nom des fichiers de certificat en ceux générés par nous:
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
Nous changeons les mots de passe des utilisateurs internes
- En utilisant la commande ci-dessous, nous affichons le hachage de mot de passe dans la console:
sh ${OD_SEC}/tools/hash.sh -p []
- Remplacez le hachage du fichier par celui reçu:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Configurer le pare-feu dans le systĂšme d'exploitation
- Autorisez le lancement du pare-feu:
systemctl enable firewalld
- Exécuter:
systemctl start firewalld
- Nous autorisons la connexion Ă Elasticsearch:
firewall-cmd --set-default-zone work
firewall-cmd --zone=work --add-port=9200/TCP --permanent
- Redémarrage des rÚgles de pare-feu:
firewall-cmd --reload
- Nous dérivons les rÚgles de travail:
firewall-cmd --list-all
Appliquer toutes nos modifications Ă Elasticsearch
- Créez une variable avec le chemin d'accÚs complet au dossier avec le plugin:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"
- Exécutez un script qui mettra à jour les mots de passe et vérifiera les paramÚtres:
${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
- Vérifiez si les modifications ont été appliquées:
curl -XGET https://[IP/ Elasticsearch]:9200/_cat/nodes?v -u admin:[] --insecure
C'est tout, ce sont les paramÚtres minimum qui bloquent Elasticsearch d'une connexion non autorisée.