Как да настроим Elasticsearch, за да няма течове

През последната година се появиха много течове от бази данни. Elasticsearch (ето, ето и ето). В много случаи в базата са съхранявани лични данни. Тези течове можеха да бъдат избегнати, ако администраторите бяха проверили няколко лесни настройки след разгръщането на базата. Днес ще говорим за тях.

Първо уточняваме, че в практиката си използваме Elasticsearch за съхранение на логове и анализ на журналите на средствата за защита на информацията, ОС и софтуер в нашата IaaS платформа, съответстваща на изискванията на 152-ФЗ, Cloud-152. 

Как да настроим Elasticsearch, за да няма течове

Проверяваме дали базата не е достъпна в интернет.

В повечето известни случаи на течове (ето, ето) злосторникът получил достъп до данните просто и лесно: базата е била публикувана в интернет и можело да се свърже без удостоверяване.  

Първо, нека разгледаме публикацията в интернет. Защо това се случва? Причината е, че за по-гъвкава работа с Elasticsearch се препоръчва се създават клъстери от три сървъра. За да могат базите да комуникират помежду си, трябва да се отворят портове. В крайна сметка администраторите не ограничават достъпа до базата, и до БД може да се получи достъп от всякъде. Лесно е да проверите дали базата е достъпна извън. Просто въведете в браузъра http://[IP/Име на Elasticsearch]:9200/_cat/nodes?v

Ако успеете да влезете, веднага затворете достъпа.

Защитаваме връзката към базата данни.

Сега ще направим така, че към базата да не може да се свърже без удостоверяване.

Elasticsearch има модул за удостоверяване, който ограничава достъпа до базата, но той е само в платения пакет от плъгини X-Pack (първият месец е безплатен).

Добрата новина е, че през есента на 2019 г. Amazon откри разработките си, които пресичат X-Pack. Функцията за удостоверяване при свързване към базата стана достъпна под свободна лицензия за версия Elasticsearch 7.3.2, и нова версия за Elasticsearch 7.4.0 вече е в разработка.

Инсталацията на този плъгин е проста. Влизате в конзолата на сървъра и свързвате репозитория:

Базирано на RPM:

curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo

yum update

yum install opendistro-security


Базирано на DEB:

wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -

Настройваме взаимодействието между сървърите чрез SSL.

При инсталирането на приставката се променя конфигурацията на порта за свързване с базата данни. Включва се SSL шифроване. За да могат сървърите в клъстера да работят помежду си, е необходимо да се настрои взаимодействието между тях чрез SSL.

Доверието между хостовете може да бъде установено с помощта на собствен удостоверяващ център или без него. С първия вариант всичко е ясно: просто трябва да се обърнете към специалисти по CA. Да преминем направо към втория.

  1. Създаваме променлива с пълното име на домейна:

    export DOMAIN_CN="example.com"

  2. Създаваме частен ключ:

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

  3. Подписваме корския сертификат. Пазете го като зеница в окото: при загуба или компрометиране на доверието между всички хостове, ще трябва да се пренастрои.

    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. Създаваме ключ на администратора:

    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. Създаваме заявка за подписване на сертификат:

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

  6. Създаваме сертификат на администратора:

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

  7. Създаваме сертификати за узел 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. Създаваме заявка за подписване:

    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. Подписваме сертификата:

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

  10. Разпределяме сертификатите между узлите Elasticsearch в папката:

    /etc/elasticsearch/


    ще ни трябват файловете:

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

  11. Настройваме /etc/elasticsearch/elasticsearch.yml – променяме имената на файловете със сертификатите на генерираните от нас:

    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

Сменяме паролите на вътрешните потребители

  1. С помощта на командата по-долу извеждаме в конзолата хеша на паролата:

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

  2. Сменяме хеша в файла с получения:

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

Настройваме защитната стена в ОС

  1. Разрешаваме стартиране на защитната стена:

    systemctl enable firewalld

  2. Стартираме я:

    systemctl start firewalld

  3. Разрешаваме свързването с Elasticsearch:

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

  4. Презареждаме правилата на защитната стена:

    firewall-cmd --reload

  5. Извеждаме активни правила:

    firewall-cmd --list-all

Прилагаме всички наши промени към Elasticsearch

  1. Създаваме променлива с пълния път до папката с плъгина:

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

  2. Стартираме скрипт, който ще обнови паролите и ще провери настройките:

    ${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. Проверяваме дали промените са приложени:

    curl -XGET https://[IP/Име Elasticsearch]:9200/_cat/nodes?v -u admin:[парол] --insecure

Всичко, това са минималните настройки, които затварят Elasticsearch от неавторизирано свързване.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster