Comment configurer Elasticsearch pour qu'il n'y ait pas de fuites

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 ? V

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

  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. 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
  4. 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
  5. 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
  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. Nous signons le certificat:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial \
    -sha256 -out node.pem
  10. 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
  11. 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


  1. En utilisant la commande ci-dessous, nous affichons le hachage de mot de passe dans 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

Configurer le pare-feu dans le systĂšme d'exploitation


  1. Autorisez le lancement du pare-feu:

    systemctl enable firewalld
  2. Exécuter:

    systemctl start firewalld
  3. Nous autorisons la connexion Ă  Elasticsearch:

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent
  4. Redémarrage des rÚgles de pare-feu:

    firewall-cmd --reload
  5. Nous dérivons les rÚgles de travail:

    firewall-cmd --list-all

Appliquer toutes nos modifications Ă  Elasticsearch


  1. 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/"
  2. 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
  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 minimum qui bloquent Elasticsearch d'une connexion non autorisée.

Source: https://habr.com/ru/post/undefined/


All Articles