Comment configurer Elasticsearch pour éviter les fuites

Au cours de la dernière année, il y a eu de nombreuses fuites de bases de données ElasticSearch (ici, ici и ici). Dans de nombreux cas, des données personnelles étaient stockées dans la base de données. Ces fuites auraient pu être évitées si, après le déploiement de la base de données, les administrateurs avaient pris la peine de vérifier quelques paramètres simples. Aujourd’hui, nous allons en parler.

Faisons immédiatement une réserve que dans notre pratique, nous utilisons Elasticsearch pour stocker et analyser les journaux des outils de sécurité de l'information, des systèmes d'exploitation et des logiciels dans notre plate-forme IaaS, qui est conforme aux exigences du 152-FZ, Cloud-152. 

Comment configurer Elasticsearch pour éviter les fuites

Nous vérifions si la base de données « colle » à Internet

Dans les cas de fuites les plus connus (ici, ici) l'attaquant a accédé aux données de manière simple et sans prétention : la base de données était publiée sur Internet, et il était possible de s'y connecter sans authentification.  

Parlons d’abord de la publication sur Internet. Pourquoi cela arrive-t-il? Le fait est que pour un fonctionnement plus flexible d'Elasticsearch recommandé créer un cluster de trois serveurs. Pour que les bases de données communiquent entre elles, vous devez ouvrir des ports. Par conséquent, les administrateurs ne restreignent en aucune façon l’accès à la base de données et vous pouvez vous connecter à la base de données depuis n’importe où. Il est facile de vérifier si la base de données est accessible de l’extérieur. Entrez simplement dans le navigateur http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Si vous pouvez entrer, courez pour le fermer.

Protéger la connexion à la base de données

Nous allons maintenant faire en sorte qu'il soit impossible de se connecter à la base de données sans authentification.

Elasticsearch dispose d'un module d'authentification qui limite l'accès à la base de données, mais il n'est disponible que dans l'ensemble de plugins payant X-Pack (1 mois d'utilisation gratuite).

La bonne nouvelle est qu'à l'automne 2019, Amazon a ouvert ses développements, qui chevauchent X-Pack. La fonction d'authentification lors de la connexion à une base de données est devenue disponible sous licence gratuite pour la version Elasticsearch 7.3.2, et une nouvelle version pour Elasticsearch 7.4.0 est déjà en préparation.

Ce plugin est facile à installer. Accédez à la console du serveur et connectez le référentiel :

Basé sur le régime :

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 -

Configuration de 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 permet le cryptage SSL. Pour que les serveurs du cluster continuent de fonctionner les uns avec les autres, vous devez configurer l'interaction entre eux à l'aide de SSL.

La confiance entre les hôtes peut être établie avec ou sans sa propre autorité de certification. Avec la première méthode, tout est clair : il suffit de contacter des spécialistes CA. Passons directement à la seconde.

  1. Créez une variable avec le nom de domaine complet :

    export DOMAIN_CN="example.com"

  2. Créez une clé privée :

    openssl genrsa -out root-ca-key.pem 4096

  3. Signez le certificat racine. Gardez-le en sécurité : 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

  4. Créez une clé d'administrateur :

    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. Créez une demande de signature du certificat :

    openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${DOMAIN_CN}/CN=admin " 
    -key admin-key.pem -out admin.csr

  6. 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

  7. 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

  8. 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

  9. Signature du certificat :

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial 
    -sha256 -out node.pem

  10. Placez le certificat entre les nœuds Elasticsearch dans le dossier suivant :

    /etc/elasticsearch/


    nous avons besoin des fichiers :

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem

  11. Configurer /etc/elasticsearch/elasticsearch.yml – remplacez le nom des fichiers avec certificats par ceux générés par nos soins :

    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

Modification des mots de passe pour les utilisateurs internes

  1. À l'aide de la commande ci-dessous, nous affichons le hachage du mot de passe sur la console :

    sh ${OD_SEC}/tools/hash.sh -p [пароль]

  2. Remplacez le hachage du fichier par celui reçu :

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

Configuration d'un pare-feu dans le système d'exploitation

  1. Autorisez le démarrage du pare-feu :

    systemctl enable firewalld

  2. Lançons-le :

    systemctl start firewalld

  3. Autoriser la connexion à Elasticsearch :

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent

  4. Rechargez les règles du pare-feu :

    firewall-cmd --reload

  5. Voici les règles de travail :

    firewall-cmd --list-all

Application de toutes nos modifications à Elasticsearch

  1. Créez une variable avec le chemin complet du dossier avec le plugin :

    export  OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"

  2. Exécutons 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

  3. 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 minimaux qui protègent Elasticsearch des connexions non autorisées.

Source: habr.com

Achetez un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Achetez un hébergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster