Bagaimana untuk mengkonfigurasi Elasticsearch untuk mengelakkan kebocoran

Sepanjang tahun lalu, terdapat banyak kebocoran daripada pangkalan data Elasticsearch (di sini, di sini ΠΈ di sini). Dalam banyak kes, data peribadi disimpan dalam pangkalan data. Kebocoran ini boleh dielakkan jika, selepas menggunakan pangkalan data, pentadbir telah bersusah payah menyemak beberapa tetapan mudah. Hari ini kita akan bercakap tentang mereka.

Mari segera membuat tempahan bahawa dalam amalan kami, kami menggunakan Elasticsearch untuk menyimpan log dan menganalisis log alat keselamatan maklumat, OS dan perisian dalam platform IaaS kami, yang mematuhi keperluan 152-FZ, Cloud-152. 

Bagaimana untuk mengkonfigurasi Elasticsearch untuk mengelakkan kebocoran

Kami menyemak sama ada pangkalan data "melekat" ke Internet

Dalam kebanyakan kes kebocoran yang diketahui (di sini, di sini) penyerang mendapat akses kepada data secara ringkas dan bersahaja: pangkalan data telah diterbitkan di Internet, dan ia mungkin untuk menyambung kepadanya tanpa pengesahan.  

Pertama, mari kita berurusan dengan penerbitan di Internet. Mengapa ini berlaku? Hakikatnya ialah untuk operasi Elasticsearch yang lebih fleksibel disyorkan buat kelompok tiga pelayan. Untuk membolehkan pangkalan data berkomunikasi antara satu sama lain, anda perlu membuka port. Akibatnya, pentadbir tidak menyekat akses kepada pangkalan data dalam apa jua cara, dan anda boleh menyambung ke pangkalan data dari mana-mana sahaja. Mudah untuk menyemak sama ada pangkalan data boleh diakses dari luar. Hanya masukkan dalam penyemak imbas http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Jika anda boleh masuk, kemudian lari untuk menutupnya.

Melindungi sambungan ke pangkalan data

Sekarang kami akan membuatnya supaya mustahil untuk menyambung ke pangkalan data tanpa pengesahan.

Elasticsearch mempunyai modul pengesahan yang mengehadkan akses kepada pangkalan data, tetapi ia hanya tersedia dalam set pemalam X-Pack berbayar (penggunaan percuma 1 bulan).

Berita baiknya ialah pada musim gugur 2019, Amazon membuka perkembangannya, yang bertindih dengan X-Pack. Fungsi pengesahan apabila menyambung ke pangkalan data telah tersedia di bawah lesen percuma untuk versi Elasticsearch 7.3.2, dan keluaran baharu untuk Elasticsearch 7.4.0 sudah pun dalam usaha.

Pemalam ini mudah dipasang. Pergi ke konsol pelayan dan sambungkan repositori:

Berdasarkan RPM:

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

yum update

yum install opendistro-security


Berdasarkan DEB:

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

Menyediakan interaksi antara pelayan melalui SSL

Apabila memasang pemalam, konfigurasi port yang menyambung ke pangkalan data berubah. Ia membolehkan penyulitan SSL. Untuk membolehkan pelayan kluster terus berfungsi antara satu sama lain, anda perlu mengkonfigurasi interaksi antara mereka menggunakan SSL.

Kepercayaan antara hos boleh diwujudkan dengan atau tanpa kuasa sijilnya sendiri. Dengan kaedah pertama, semuanya jelas: anda hanya perlu menghubungi pakar CA. Mari kita beralih terus ke yang kedua.

  1. Buat pembolehubah dengan nama domain penuh:

    export DOMAIN_CN="example.com"

  2. Buat kunci peribadi:

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

  3. Tandatangani sijil akar. Pastikan ia selamat: jika ia hilang atau terjejas, kepercayaan antara semua hos perlu dikonfigurasikan semula.

    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. Buat kunci pentadbir:

    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. Buat permintaan untuk menandatangani sijil:

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

  6. Buat sijil pentadbir:

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

  7. Buat sijil untuk nod 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. Buat permintaan tandatangan:

    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. Menandatangani sijil:

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

  10. Letakkan sijil antara nod Elasticsearch dalam folder berikut:

    /etc/elasticsearch/


    kami memerlukan fail:

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

  11. Mengkonfigurasi /etc/elasticsearch/elasticsearch.yml – tukar nama fail dengan sijil kepada yang dijana oleh kami:

    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

Menukar kata laluan untuk pengguna dalaman

  1. Menggunakan arahan di bawah, kami mengeluarkan cincang kata laluan ke konsol:

    sh ${OD_SEC}/tools/hash.sh -p [ΠΏΠ°Ρ€ΠΎΠ»ΡŒ]

  2. Tukar cincang dalam fail kepada yang diterima:

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

Menyediakan tembok api dalam OS

  1. Benarkan tembok api bermula:

    systemctl enable firewalld

  2. Mari kita lancarkan:

    systemctl start firewalld

  3. Benarkan sambungan ke Elasticsearch:

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

  4. Muat semula peraturan tembok api:

    firewall-cmd --reload

  5. Berikut adalah peraturan kerja:

    firewall-cmd --list-all

Menggunakan semua perubahan kami pada Elasticsearch

  1. Buat pembolehubah dengan laluan penuh ke folder dengan pemalam:

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

  2. Mari jalankan skrip yang akan mengemas kini kata laluan dan menyemak tetapan:

    ${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. Semak sama ada perubahan telah digunakan:

    curl -XGET https://[IP/Имя Elasticsearch]:9200/_cat/nodes?v -u admin:[ΠΏΠ°Ρ€ΠΎΠ»ΡŒ] --insecure

Itu sahaja, ini adalah tetapan minimum yang melindungi Elasticsearch daripada sambungan yang tidak dibenarkan.

Sumber: www.habr.com

Tambah komen