Як наладзіць Elasticsearch, каб не было уцечак

За апошні год узнікала шмат уцечак з баз Elasticsearch (вось, вось и вось). У шматлікіх выпадках у базе захоўваліся персанальныя дадзеныя. Гэтых уцечак можна было пазбегнуць, калі б пасля разгортвання базы адміністратары папрацавалі праверыць некалькі нескладаных налад. Сёння аб іх і пагаворым.

Адразу абмовімся, што ў сваёй практыцы выкарыстоўваем Elasticsearch для захоўвання логаў і аналізу часопісаў сродкаў абароны інфармацыі, АС і ПА у нашай IaaS-платформе, якая адпавядае патрабаванні 152-ФЗ, Cloud-152. 

Як наладзіць Elasticsearch, каб не было уцечак

Правяраем, "не тырчыць" ці база ў інтэрнэт

У большасці вядомых выпадкаў уцечак (вось, вось) зламыснік атрымаў доступ да дадзеных проста і немудрагеліста: база была апублікаваная ў інтэрнэце, і да яе можна было падлучыцца без аўтэнтыфікацыі.  

Спачатку разбяромся з публікацыяй у інтэрнэце. Чаму так атрымоўваецца? Справа ў тым, што для больш гнуткай працы Elasticsearch рэкамендуецца ствараць кластар з трох сервераў. Каб БД размаўлялі паміж сабой, трэба адчыняць парты. У выніку адміністратары ніяк не абмяжоўваюць доступ да базы, і да БД можна падлучыцца адусюль. Праверыць, ці няма да базы доступу звонку, лёгка. Проста ў браўзэры ўводны http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Калі атрымліваецца зайсці, значыць бягом зачыняць.

Абараняем падлучэнне да БД

Цяпер зробім так, каб да базы нельга было падключыцца без аўтэнтыфікацыі.

У Elasticsearch ёсць модуль аўтэнтыфікацыі, які абмяжоўвае доступ да базы, але ён толькі ў платным наборы плагінаў X-Pack (1 месяц бясплатнага выкарыстання).

Добрыя навіны ў тым, што ўвосень 2019 гады Amazon адкрыў свае напрацоўкі, якія перасякаюцца з X-Pack. Функцыя аўтэнтыфікацыі пры падлучэнні да базы стала даступная пад вольнай ліцэнзіяй для версіі Elasticsearch 7.3.2., і ўжо ў працы новы рэліз для Elasticsearch 7.4.0.

Усталёўваецца гэтая плягін проста. Заходзім у кансоль сервера і падлучальны рэпазітар:

RPM Based:

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

yum update

yum install opendistro-security


DEB Based:

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

Дадаць каментар