Cara mengonfigurasi Elasticsearch sehingga tidak ada kebocoran

Selama setahun terakhir, ada banyak kebocoran dari database Elasticsearch (di sini , di sana - sini ). Dalam banyak kasus, data pribadi disimpan dalam database. Kebocoran ini dapat dihindari jika, setelah menggunakan basis data, administrator kesulitan untuk memeriksa beberapa pengaturan sederhana. Hari ini kita akan membicarakannya.

Kami akan segera membuat reservasi bahwa dalam praktik kami, kami menggunakan Elasticsearch untuk menyimpan log dan menganalisis log alat perlindungan informasi, OS, dan perangkat lunak dalam platform IaaS kami yang memenuhi persyaratan 152-, Cloud-152. 



Periksa apakah database "menempel"


Dalam kebanyakan kasus kebocoran yang diketahui (di sini , di sini ), penyerang memperoleh akses ke data secara sederhana dan sederhana: database diterbitkan di Internet, dan dimungkinkan untuk terhubung dengannya tanpa otentikasi.  

Pertama, kami akan berurusan dengan penerbitan di Internet. Kenapa begitu? Faktanya adalah bahwa untuk operasi Elasticsearch yang lebih fleksibel, disarankan untuk membuat sekelompok tiga server. Agar database dapat saling berkomunikasi, Anda perlu membuka porta. Akibatnya, administrator tidak membatasi akses ke database, dan Anda dapat terhubung ke database dari mana saja. Memeriksa apakah ada akses eksternal ke basis data itu mudah. Cukup masukkan http: // [IP / Nama Riset Elastik]: 9200 / _cat / node? Di browser ? V

Jika Anda berhasil masuk, maka jalankan untuk menutup.

Kami melindungi koneksi ke database


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

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

Berita baiknya adalah bahwa pada musim gugur 2019, Amazon membuka landasannya yang bersinggungan dengan X-Pack. Fungsi otentikasi ketika menghubungkan ke database telah tersedia di bawah lisensi gratis untuk versi Elasticsearch 7.3.2., Dan rilis baru untuk Elasticsearch 7.4.0 sudah beroperasi.

Menginstal plugin ini mudah. Kami masuk ke konsol server dan menghubungkan 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 -

Kami mengonfigurasi interaksi antara server melalui SSL


Saat memasang plugin, konfigurasi port koneksi database berubah. Ini termasuk enkripsi SSL. Agar server cluster dapat terus bekerja satu sama lain, Anda harus mengonfigurasi interaksi di antara mereka menggunakan SSL.

Kepercayaan antara host dapat dibangun dengan atau tanpa otoritas sertifikasi Anda sendiri. Dengan metode pertama, semuanya jelas: Anda hanya perlu menghubungi seorang spesialis di CA. Kami segera melanjutkan ke yang kedua.

  1. Buat variabel dengan nama domain yang sepenuhnya memenuhi syarat:

    export DOMAIN_CN="example.com"
  2. Buat kunci pribadi:

    openssl genrsa -out root-ca-key.pem 4096
  3. Kami menandatangani sertifikat root. Simpan sebagai apel mata Anda: jika hilang atau dikompromikan, 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 admin:

    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 simpul 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. Kami menandatangani sertifikat:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial \
    -sha256 -out node.pem
  10. Kami menguraikan sertifikat antara node Elasticsearch ke dalam folder:

    /etc/elasticsearch/

    kami membutuhkan file:

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem
  11. Siapkan /etc/elasticsearch/elasticsearch.yml - ubah nama file sertifikat menjadi yang dibuat 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

Kami mengubah kata sandi pengguna internal


  1. Menggunakan perintah di bawah ini, kami menampilkan hash kata sandi di konsol:

    sh ${OD_SEC}/tools/hash.sh -p []
  2. Ubah hash dalam file menjadi yang diterima:

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

Konfigurasikan firewall di OS


  1. Izinkan peluncuran firewall:

    systemctl enable firewalld
  2. Menjalankannya:

    systemctl start firewalld
  3. Kami mengizinkan koneksi ke Elasticsearch:

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent
  4. Mulai ulang aturan firewall:

    firewall-cmd --reload
  5. Kami menurunkan aturan kerja:

    firewall-cmd --list-all

Terapkan semua perubahan kami ke Elasticsearch


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

    export  OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"
  2. 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 diterapkan:

    curl -XGET https://[IP/ Elasticsearch]:9200/_cat/nodes?v -u admin:[] --insecure

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

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


All Articles