Cara mengkonfigurasi Elasticsearch untuk menghindari kebocoran

Selama setahun terakhir, banyak terjadi kebocoran dari database Elasticsearch (di sini, di sini ΠΈ di sini). Dalam banyak kasus, data pribadi disimpan dalam database. Kebocoran ini bisa dihindari jika, setelah menyebarkan database, administrator mau memeriksa beberapa pengaturan sederhana. Hari ini kita akan membicarakannya.

Mari segera buat reservasi bahwa dalam praktik kami, kami menggunakan Elasticsearch untuk menyimpan log dan menganalisis log alat keamanan informasi, OS, dan perangkat lunak di platform IaaS kami, yang mematuhi persyaratan 152-FZ, Cloud-152. 

Cara mengkonfigurasi Elasticsearch untuk menghindari kebocoran

Kami memeriksa apakah database β€œmenonjol” ke Internet

Dalam kebanyakan kasus kebocoran yang diketahui (di sini, di sini) penyerang memperoleh akses ke data dengan sederhana dan sederhana: database dipublikasikan di Internet, dan dimungkinkan untuk menyambungkannya tanpa otentikasi.  

Pertama, mari kita berurusan dengan penerbitan di Internet. Mengapa ini terjadi? Faktanya adalah untuk pengoperasian Elasticsearch yang lebih fleksibel direkomendasikan membuat cluster tiga server. Agar database dapat berkomunikasi satu sama lain, Anda perlu membuka port. Hasilnya, administrator tidak membatasi akses ke database dengan cara apa pun, dan Anda dapat menyambung ke database dari mana saja. Sangat mudah untuk memeriksa apakah database dapat diakses dari luar. Masuk saja ke browser http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Jika Anda bisa masuk, larilah untuk menutupnya.

Melindungi koneksi ke database

Sekarang kita akan membuatnya tidak mungkin untuk terhubung ke database tanpa otentikasi.

Elasticsearch memiliki modul otentikasi yang membatasi akses ke database, tetapi hanya tersedia di set plugin X-Pack berbayar (penggunaan gratis 1 bulan).

Kabar baiknya adalah pada musim gugur 2019, Amazon membuka pengembangannya yang tumpang tindih dengan X-Pack. Fungsi otentikasi saat menghubungkan ke database telah tersedia di bawah lisensi gratis untuk versi Elasticsearch 7.3.2, dan rilis baru untuk Elasticsearch 7.4.0 sedang dalam pengerjaan.

Plugin ini mudah dipasang. Buka konsol server dan sambungkan repositori:

Berbasis RPM:

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

yum update

yum install opendistro-security


Berbasis DEB:

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

Menyiapkan interaksi antar server melalui SSL

Saat menginstal plugin, konfigurasi port yang menghubungkan ke database berubah. Ini mengaktifkan enkripsi SSL. Agar server cluster dapat terus bekerja satu sama lain, Anda perlu mengonfigurasi interaksi di antara server tersebut menggunakan SSL.

Kepercayaan antar host dapat dibangun dengan atau tanpa otoritas sertifikatnya sendiri. Dengan metode pertama, semuanya jelas: Anda hanya perlu menghubungi spesialis CA. Mari kita langsung ke yang kedua.

  1. Buat variabel dengan nama domain lengkap:

    export DOMAIN_CN="example.com"

  2. Buat kunci pribadi:

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

  3. Tanda tangani sertifikat akar. Tetap aman: jika hilang atau disusupi, kepercayaan antara semua host perlu dikonfigurasi ulang.

    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 administrator:

    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 sertifikat:

    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 sertifikat administrator:

    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 sertifikat untuk node 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 tanda tangan:

    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 sertifikat:

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

  10. Tempatkan sertifikat di antara node Elasticsearch di folder berikut:

    /etc/elasticsearch/


    kami membutuhkan file:

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

  11. Mengkonfigurasi /etc/elasticsearch/elasticsearch.yml – ubah nama file dengan sertifikat menjadi yang kami buat:

    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

Mengubah kata sandi untuk pengguna internal

  1. Dengan menggunakan perintah di bawah ini, kami menampilkan hash kata sandi ke konsol:

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

  2. Ubah hash dalam file ke yang diterima:

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

Menyiapkan firewall di OS

  1. Izinkan firewall untuk memulai:

    systemctl enable firewalld

  2. Mari kita luncurkan:

    systemctl start firewalld

  3. Izinkan koneksi ke Elasticsearch:

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

  4. Muat ulang aturan firewall:

    firewall-cmd --reload

  5. Berikut aturan kerjanya:

    firewall-cmd --list-all

Menerapkan semua perubahan kami pada Elasticsearch

  1. Buat variabel dengan path lengkap ke folder dengan plugin:

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

  2. Mari kita jalankan skrip yang akan memperbarui kata sandi dan memeriksa pengaturan:

    ${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. Periksa apakah perubahan telah diterapkan:

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

Itu saja, ini adalah pengaturan minimum yang melindungi Elasticsearch dari koneksi tidak sah.

Sumber: www.habr.com

Tambah komentar