MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara mengonfigurasi SELinux untuk Kumpulan Replika MongoDB

Pada tahun 2025, dunia akan menyimpan sekitar 200 zettabytes data. Data tersebut akan disimpan baik di penyimpanan publik, pribadi, lokal atau cloud, PC, laptop, smartphone, dan juga perangkat Internet-of-Things (IoT). Secara proyeksi, jumlah perangkat yang terhubung ke internet juga diperkirakan akan meningkat menjadi hampir 75 miliar pada tahun 2025. Bagi sebagian dari kita atau orang yang kurang berlatar belakang IT, angka tersebut bukanlah apa-apa. Namun bagi para pecinta keamanan, hal ini mengkhawatirkan karena semakin banyak data yang terancam.

Dalam dunia teknologi dan database open-source, keamanan adalah salah satu topik penting. Dari waktu ke waktu akan banyak penemuan dan perkembangan baru yang berhubungan dengan keamanan. Salah satunya adalah Security-Enhanced Linux atau disingkat SELinux, yang dikembangkan hampir 21 tahun lalu oleh Badan Keamanan Nasional Amerika Serikat (NSA). Meskipun ini telah diperkenalkan bertahun-tahun yang lalu, ini telah berkembang pesat dan banyak digunakan sebagai salah satu langkah keamanan untuk sistem Linux. Meskipun tidak mudah untuk menemukan informasi tentang cara mengonfigurasinya dengan database, MongoDB telah memanfaatkannya. Dalam posting blog ini, kita akan membahas SELinux dan cara mengkonfigurasinya di set replika MongoDB.

Untuk tujuan ini, kami akan menggunakan 3 VM CentOS 8 untuk lingkungan pengujian kami dan menggunakan MongoDB 4.4. Sebelum kita mulai, mari selami lebih dalam tentang SELinux.

Mode Penegakan, Permisif, dan Dinonaktifkan

Ini adalah tiga mode yang dapat dijalankan SELinux pada waktu tertentu. Tentu saja, semuanya memiliki fungsi dan tujuan masing-masing dalam hal kebijakan keamanan. Kami akan membahasnya satu per satu.

Saat dalam mode penegakan, setiap kebijakan yang dikonfigurasi akan diterapkan pada sistem dan setiap upaya akses yang tidak sah baik oleh pengguna atau proses ditolak oleh SELinux. Tidak hanya itu, tindakan penolakan akses tersebut juga akan dicatat dalam file log terkait. Meskipun ini adalah mode yang paling direkomendasikan, sebagian besar sistem Linux saat ini tidak mengaktifkan mode ini oleh administrator sistem karena berbagai alasan seperti kerumitan SELinux itu sendiri.

Untuk mode permisif, kita dapat dengan aman mengatakan bahwa SELinux dalam keadaan semi-enabled. Dalam mode ini, tidak ada kebijakan yang akan diterapkan oleh SELinux, pada saat yang sama tidak ada akses yang ditolak. Meskipun demikian, setiap pelanggaran kebijakan tetap dicatat dan dicatat dalam log audit. Biasanya, mode ini digunakan untuk menguji SELinux sebelum menyelesaikan dan melanjutkan untuk menerapkannya.

Untuk mode terakhir yang dinonaktifkan, tidak ada peningkatan keamanan yang berjalan pada sistem. Apakah Anda tahu mode SELinux apa yang dijalankan sistem Anda sekarang? Cukup jalankan perintah berikut untuk melihat:

$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33

Untuk sistem pengujian kami, SELinux telah diaktifkan dan dikonfigurasi sebagai penerapan sehingga kami dapat melanjutkan dengan panduan lainnya. Jika SELinux dinonaktifkan atau diizinkan di sistem Anda, Anda dapat mengikuti langkah-langkah di bawah ini untuk mengaktifkannya dan mengubah ke penerapan.

  1. Edit file /etc/selinux/config untuk mengubah arahan menjadi penegakan

vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…

Anda perlu memastikan arahan di atas disetel ke penegakan.

  1. Reboot sistem untuk menerapkan pengaturan

$ reboot

Setelah sistem online, kita perlu mengonfirmasi bahwa SELinux telah dikonfigurasi dengan benar dan perubahan telah terjadi. Jalankan perintah berikut untuk memeriksa, ini adalah cara lain untuk memeriksanya selain dari yang pertama saya sebutkan tadi (sstatus).

$ getenforce

Menegakkan

Setelah kita melihat kata “Menegakkan”, sekarang kita dapat mengonfirmasi bahwa ini sudah baik untuk dijalankan. Karena kita akan menggunakan set replika, kita perlu memastikan SELinux telah dikonfigurasi di semua node MongoDB. Saya yakin ini adalah bagian terpenting yang harus kita bahas sebelum kita melanjutkan konfigurasi SELinux untuk MongoDB.

Setelan “ulimit” yang disarankan 

Dalam contoh ini, kami berasumsi bahwa MongoDB 4.4 telah diinstal pada 3 node. Instalasinya sangat sederhana dan mudah, untuk menghemat waktu kami, kami tidak akan menunjukkan langkah-langkahnya kepada Anda tetapi di sini adalah tautan ke dokumentasinya.

Dalam beberapa kasus, "ulimit" sistem akan menyebabkan beberapa masalah jika batas memiliki nilai default yang rendah. Untuk memastikan MongoDB berjalan dengan benar, kami sangat menyarankan pengaturan "ulimit" sesuai rekomendasi MongoDB di sini. Meskipun setiap penerapan mungkin memiliki persyaratan atau setelan uniknya sendiri, sebaiknya ikuti setelan "ulimit" berikut:

-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-l (locked-in-memory size): unlimited
-n (open files): 64000
-m (memory size): unlimited
-u (processes/threads): 64000

Untuk mengubah nilai "ulimit", cukup jalankan perintah berikut, misalnya mengubah nilai untuk "-n" (membuka file):

$ ulimit -n 64000

Setelah semua batas diubah, instance mongod harus dimulai ulang untuk memastikan perubahan batas baru terjadi:

$ sudo systemctl restart mongod

Mengonfigurasi SELinux

Menurut dokumentasi MongoDB, Kebijakan SELinux saat ini tidak mengizinkan proses MongoDB mengakses /sys/fs/cgroup, yang diperlukan untuk menentukan memori yang tersedia di sistem Anda. Jadi untuk kasus kami, di mana SELinux dalam mode penegakan, penyesuaian berikut harus dilakukan.

Izinkan Akses ke cgroup

Langkah pertama adalah memastikan bahwa sistem kami telah menginstal paket "checkpolicy":

$ sudo yum install checkpolicy

yum install checkpolicy

Last metadata expiration check: 2:13:40 ago on Fri 11 Jun 2021 05:32:10 AM UTC.

Package checkpolicy-2.9-1.el8.x86_64 is already installed.

Dependencies resolved.

Nothing to do.

Complete!

Selanjutnya, kita perlu membuat file kebijakan khusus untuk “mongodb_cgroup_memory.te”:

cat > mongodb_cgroup_memory.te <<EOF
module mongodb_cgroup_memory 1.0;
require {
      type cgroup_t;
      type mongod_t;
      class dir search;
      class file { getattr open read };
}

#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };
EOF

Setelah file kebijakan dibuat, langkah terakhir adalah mengompilasi dan memuat modul kebijakan khusus dengan menjalankan tiga perintah berikut:

$ checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
$ semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
$ sudo semodule -i mongodb_cgroup_memory.pp

Perintah terakhir akan memakan waktu cukup lama dan setelah selesai, proses MongoDB akan dapat mengakses file yang benar dengan mode penegakan SELinux.

Izinkan Akses ke netstat untuk FTDC

/proc/net/netstat diperlukan untuk Pengambilan Data Diagnostik Penuh Waktu (FTDC). Singkatnya FTDC adalah mekanisme untuk memfasilitasi analisis server MongoDB. File data di FTDC dikompresi, tidak dapat dibaca manusia, dan mewarisi izin akses file yang sama dengan file data MongoDB. Oleh karena itu, hanya pengguna yang memiliki akses ke file data FTDC yang dapat mengirimkan data.

Langkah-langkah untuk mengkonfigurasinya hampir sama dengan yang sebelumnya. Hanya saja kebijakan kustomnya berbeda.

$ sudo yum install checkpolicy
Create a custom policy file “mongodb_proc_net.te”:
cat > mongodb_proc_net.te <<EOF
module mongodb_proc_net 1.0;
require {
    type proc_net_t;
    type mongod_t;
    class file { open read };
}

#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };
EOF

Langkah terakhir adalah mengompilasi dan memuat kebijakan khusus:

$ checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
$ semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
$ sudo semodule -i mongodb_proc_net.pp

Jalur Direktori MongoDB Kustom

Satu hal penting yang perlu diperhatikan adalah jika Anda menginstal MongoDB di direktori kustom, Anda juga perlu menyesuaikan kebijakan SELinux. Langkah-langkahnya sedikit berbeda dari yang sebelumnya tetapi tidak terlalu rumit.

Pertama, kita perlu memperbarui kebijakan SELinux untuk mengizinkan layanan mongod menggunakan direktori baru, perlu diperhatikan bahwa kita perlu memastikan untuk menyertakan .* di akhir direktori :

$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
  • mongod_var_lib_t untuk direktori data

  • mongod_log_t untuk direktori file log

  • mongod_var_run_t untuk direktori file pid

Kemudian, perbarui kebijakan pengguna SELinux untuk direktori baru:

$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
  • mongod_var_lib_t untuk direktori data

  • mongod_log_t untuk direktori log

  • mongod_var_run_t untuk direktori file pid

Langkah terakhir adalah menerapkan kebijakan SELinux yang diperbarui ke direktori:

restorecon -R -v </some/MongoDB/directory>

Karena MongoDB menggunakan jalur default untuk data dan file log, kita dapat melihat contoh berikut tentang cara menerapkannya:

Untuk jalur data MongoDB non-default dari /mongodb/data:

$ sudo semanage fcontext -a -t mongod_var_lib_t '/mongodb/data.*'
$ sudo chcon -Rv -u system_u -t mongod_var_lib_t '/mongodb/data'
$ restorecon -R -v '/mongodb/data'
For non-default MongoDB log directory of /mongodb/log (e.g. if the log file path is /mongodb/log/mongod.log):

$ sudo semanage fcontext -a -t mongod_log_t '/mongodb/log.*'
$ sudo chcon -Rv -u system_u -t mongod_log_t '/mongodb/log'
$ restorecon -R -v '/mongodb/log'

Port MongoDB Khusus

Untuk beberapa situasi, beberapa instalasi MongoDB menggunakan nomor port yang berbeda selain yang default yaitu 27017. Dalam kasus khusus ini, kita perlu mengkonfigurasi SELinux juga dan perintahnya cukup sederhana :

$ sudo semanage port -a -t mongod_port_t -p tcp <portnumber>
For example, we are using port 37017:
$ sudo semanage port -a -t mongod_port_t -p tcp 37017

Menyebarkan MongoDB SELinux Diaktifkan Dengan ClusterControl

Dengan ClusterControl, Anda memiliki opsi untuk mengaktifkan SELinux selama penerapan set replika MongoDB Anda. Namun, Anda masih perlu mengubah mode ke penegakan karena ClusterControl hanya mengaturnya ke permisif. Untuk mengaktifkannya selama penerapan, Anda dapat menghapus centang “Nonaktifkan AppArmor/SELinux” seperti gambar di bawah.

Setelah itu, Anda dapat melanjutkan dan menambahkan node untuk kumpulan replika MongoDB Anda dan memulai penyebaran. Di ClusterControl, kami menggunakan versi 4.2 untuk MongoDB.

Setelah cluster siap, kita perlu mengubah SELinux menjadi enforcing for semua node dan lanjutkan dengan mengonfigurasinya dengan mengacu pada langkah-langkah yang baru saja kita lalui.

Kesimpulan

Ada 3 mode SELinux yang tersedia untuk semua sistem Linux. Untuk mode penegakan SELinux, ada beberapa langkah yang perlu diikuti untuk memastikan MongoDB berjalan tanpa masalah. Perlu juga diperhatikan bahwa beberapa setelan “ulimit” juga perlu diubah agar sesuai dengan persyaratan dan spesifikasi sistem.

Dengan ClusterControl, SELinux dapat diaktifkan selama penerapan, namun Anda masih perlu mengubah ke mode penerapan dan mengonfigurasi kebijakan setelah kumpulan replika siap.

Kami berharap posting blog ini akan membantu Anda menyiapkan SELinux untuk server MongoDB Anda


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menggunakan .sort dengan PyMongo

  2. Menutupi PII di MongoDB, Cassandra, dan Elasticsearch dengan DarkShield:…

  3. Bagaimana cara membuat indeks bersarang di MongoDB?

  4. Faktor yang Perlu Dipertimbangkan Saat Memilih MongoDB untuk Aplikasi Big Data

  5. Mengelola Beberapa Teknologi Basis Data dengan ClusterControl