Salah satu alasan kesuksesan luar biasa OS Linux pada perangkat seluler dan server tertanam adalah tingkat keamanan kernel, layanan dan aplikasi terkait yang cukup tinggi. Tapi jika
Latar Belakang Modul Keamanan Linux dan SELinux
Security Enhanced Linux adalah seperangkat aturan dan mekanisme akses berdasarkan model akses wajib dan berbasis peran untuk melindungi sistem Linux dari potensi ancaman dan memperbaiki kekurangan Discretionary Access Control (DAC), sistem keamanan Unix tradisional. Proyek ini berasal dari Badan Keamanan Nasional AS, dan dikembangkan langsung terutama oleh kontraktor Secure Computing Corporation dan MITER, serta sejumlah laboratorium penelitian.
Modul Keamanan Linux
Linus Torvalds memberikan sejumlah komentar tentang pengembangan NSA baru agar dapat dimasukkan ke dalam kernel Linux arus utama. Dia menggambarkan lingkungan umum, dengan seperangkat pencegat untuk mengontrol operasi dengan objek dan serangkaian bidang pelindung tertentu dalam struktur data kernel untuk menyimpan atribut yang sesuai. Lingkungan ini kemudian dapat digunakan oleh modul kernel yang dapat dimuat untuk mengimplementasikan model keamanan apa pun yang diinginkan. LSM sepenuhnya memasuki kernel Linux v2.6 pada tahun 2003.
Kerangka kerja LSM mencakup bidang penjaga dalam struktur data dan panggilan ke fungsi intersepsi pada titik-titik penting dalam kode kernel untuk memanipulasinya dan melakukan kontrol akses. Itu juga menambahkan fungsionalitas untuk mendaftarkan modul keamanan. Antarmuka /sys/kernel/security/lsm berisi daftar modul aktif pada sistem. Kait LSM disimpan dalam daftar yang dipanggil dalam urutan yang ditentukan dalam CONFIG_LSM. Dokumentasi rinci tentang hook disertakan dalam file header include/linux/lsm_hooks.h.
Subsistem LSM memungkinkan untuk menyelesaikan integrasi penuh SELinux dengan versi yang sama dari kernel Linux stabil v2.6. SELinux segera menjadi standar de facto untuk lingkungan Linux yang aman dan termasuk dalam distribusi paling populer: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.
Glosarium SELinux
- Identitas β Pengguna SELinux tidak sama dengan id pengguna Unix/Linux biasa; mereka dapat hidup berdampingan di sistem yang sama, namun pada hakikatnya sangat berbeda. Setiap akun Linux standar dapat berhubungan dengan satu atau lebih di SELinux. Identitas SELinux adalah bagian dari konteks keamanan keseluruhan, yang menentukan domain mana yang bisa dan tidak bisa Anda gabung.
- domain - Di SELinux, domain adalah konteks eksekusi suatu subjek, yaitu suatu proses. Domain secara langsung menentukan akses yang dimiliki suatu proses. Domain pada dasarnya adalah daftar proses apa yang dapat dilakukan atau apa yang dapat dilakukan suatu proses dengan tipe berbeda. Beberapa contoh domain adalah sysadm_t untuk administrasi sistem, dan user_t yang merupakan domain pengguna biasa yang tidak memiliki hak istimewa. Sistem init berjalan di domain init_t, dan proses bernama berjalan di domain bernama_t.
- Peran β Yang berfungsi sebagai perantara antara domain dan pengguna SELinux. Peran menentukan domain mana yang dapat dimiliki pengguna dan jenis objek apa yang dapat mereka akses. Mekanisme kontrol akses ini mencegah ancaman serangan eskalasi hak istimewa. Peran ditulis ke dalam model keamanan Role Based Access Control (RBAC) yang digunakan di SELinux.
- jenis β Atribut daftar Penegakan Tipe yang ditetapkan ke suatu objek dan menentukan siapa yang dapat mengaksesnya. Mirip dengan definisi domain, hanya saja domain berlaku untuk suatu proses, dan tipe berlaku untuk objek seperti direktori, file, soket, dll.
- Subjek dan objek - Proses adalah subjek dan dijalankan dalam konteks tertentu, atau domain keamanan. Sumber daya sistem operasi: file, direktori, soket, dll., adalah objek yang diberi tipe tertentu, dengan kata lain, tingkat privasi.
- Kebijakan SELinux β SELinux menggunakan berbagai kebijakan untuk melindungi sistem. Kebijakan SELinux mendefinisikan akses pengguna ke peran, peran ke domain, dan domain ke tipe. Pertama, pengguna diberi otorisasi untuk mendapatkan peran, lalu peran tersebut diberi otorisasi untuk mengakses domain. Terakhir, sebuah domain hanya dapat memiliki akses ke jenis objek tertentu.
Arsitektur LSM dan SELinux
Terlepas dari namanya, LSM umumnya bukan modul Linux yang dapat dimuat. Namun, seperti SELinux, ia terintegrasi langsung ke dalam kernel. Setiap perubahan pada kode sumber LSM memerlukan kompilasi kernel baru. Opsi yang sesuai harus diaktifkan di pengaturan kernel, jika tidak, kode LSM tidak akan diaktifkan setelah boot. Namun meskipun demikian, ini dapat diaktifkan melalui opsi bootloader OS.
Tumpukan pemeriksaan LSM
LSM dilengkapi dengan pengait pada fungsi kernel inti yang relevan untuk pemeriksaan. Salah satu fitur utama LSM adalah sifatnya yang bertumpuk. Dengan demikian, pemeriksaan standar tetap dilakukan, dan setiap lapisan LSM hanya menambahkan kontrol dan kontrol tambahan. Artinya larangan tersebut tidak dapat dibatalkan. Hal ini ditunjukkan pada gambar, jika hasil pemeriksaan DAC rutin gagal, maka masalah tersebut bahkan tidak akan sampai ke LSM hooks.
SELinux mengadopsi arsitektur keamanan Flask dari sistem operasi penelitian Fluke, khususnya prinsip hak istimewa paling rendah. Inti dari konsep ini, seperti namanya, adalah memberikan pengguna atau proses hanya hak-hak yang diperlukan untuk melaksanakan tindakan yang dimaksudkan. Prinsip ini diimplementasikan dengan menggunakan pengetikan akses paksa, sehingga kontrol akses di SELinux didasarkan pada model tipe domain =>.
Berkat pengetikan akses paksa, SELinux memiliki kemampuan kontrol akses yang jauh lebih besar dibandingkan model DAC tradisional yang digunakan dalam sistem operasi Unix/Linux. Misalnya, Anda dapat membatasi nomor port jaringan yang akan dihubungkan dengan server ftp, mengizinkan penulisan dan perubahan file dalam folder tertentu, tetapi tidak menghapusnya.
Komponen utama SELinux adalah:
- Server Penegakan Kebijakan β Mekanisme utama untuk mengatur kontrol akses.
- Basis data kebijakan keamanan sistem.
- Interaksi dengan pencegat acara LSM.
- Selinuxfs - Pseudo-FS, sama seperti /proc dan dipasang di /sys/fs/selinux. Diisi secara dinamis oleh kernel Linux saat runtime dan berisi file yang berisi informasi status SELinux.
- Akses Cache Vektor β Mekanisme tambahan untuk meningkatkan produktivitas.
Bagaimana SELinux bekerja
Semuanya bekerja seperti ini.
- Subjek tertentu, dalam istilah SELinux, melakukan tindakan yang diizinkan pada objek setelah pemeriksaan DAC, seperti yang ditunjukkan pada gambar atas. Permintaan untuk melakukan operasi ini masuk ke pencegat peristiwa LSM.
- Dari sana, permintaan, bersama dengan konteks keamanan subjek dan objek, diteruskan ke modul SELinux Abstraksi dan Logika Hook, yang bertanggung jawab untuk berinteraksi dengan LSM.
- Otoritas pengambilan keputusan mengenai akses subjek ke suatu objek adalah Server Penegakan Kebijakan dan menerima data dari SELinux AnHL.
- Untuk membuat keputusan tentang akses atau penolakan, Server Penegakan Kebijakan beralih ke subsistem cache Access Vector Cache (AVC) untuk aturan yang paling sering digunakan.
- Jika solusi untuk aturan terkait tidak ditemukan di cache, maka permintaan diteruskan ke database kebijakan keamanan.
- Hasil pencarian dari database dan AVC dikembalikan ke Server Penegakan Kebijakan.
- Jika kebijakan yang ditemukan cocok dengan tindakan yang diminta, maka operasi diperbolehkan. Jika tidak, operasi tersebut dilarang.
Mengelola Pengaturan SELinux
SELinux beroperasi dalam salah satu dari tiga mode:
- Penegakan - Kepatuhan yang ketat terhadap kebijakan keamanan.
- Permisif - Pelanggaran batasan diperbolehkan; catatan terkait dibuat di jurnal.
- DisabledβKebijakan keamanan tidak berlaku.
Anda dapat melihat mode SELinux dengan perintah berikut.
[admin@server ~]$ getenforce
Permissive
Mengubah mode sebelum reboot, misalnya menyetelnya ke enforcing, atau 1. Parameter permisif sesuai dengan kode numerik 0.
[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅
Anda juga dapat mengubah mode dengan mengedit file:
[admin@server ~]$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=target
Bedanya dengan setenfoce adalah ketika sistem operasi melakukan booting, mode SELinux akan diatur sesuai dengan nilai parameter SELINUX pada file konfigurasi. Selain itu, perubahan pada penerapan <=> dinonaktifkan hanya berlaku dengan mengedit file /etc/selinux/config dan setelah reboot.
Lihat laporan status singkat:
[admin@server ~]$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
Untuk melihat atribut SELinux, beberapa utilitas standar menggunakan parameter -Z.
[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL PID TTY TIME CMD
system_u:system_r:httpd_t:s0 2914 ? 00:00:04 httpd
system_u:system_r:httpd_t:s0 2915 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2916 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2917 ? 00:00:00 httpd
...
system_u:system_r:httpd_t:s0 2918 ? 00:00:00 httpd
Dibandingkan dengan keluaran normal ls -l, ada beberapa kolom tambahan dalam format berikut:
<user>:<role>:<type>:<level>
Bidang terakhir menunjukkan sesuatu seperti klasifikasi keamanan dan terdiri dari kombinasi dua elemen:
- s0 - signifikansi, juga ditulis sebagai interval tingkat rendah-tingkat tinggi
- c0, c1β¦ c1023 - kategori.
Mengubah konfigurasi akses
Gunakan semodule untuk memuat, menambah, dan menghapus modul SELinux.
[admin@server ~]$ semodule -l |wc -l #ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ
ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ
408
[admin@server ~]$ semodule -e abrt #enable - Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ
[admin@server ~]$ semodule -d accountsd #disable - ΠΎΡΠΊΠ»ΡΡΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ
[admin@server ~]$ semodule -r avahi #remove - ΡΠ΄Π°Π»ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ
Tim pertama login semanage menghubungkan pengguna SELinux ke pengguna sistem operasi, yang kedua menampilkan daftar. Terakhir, perintah terakhir dengan tombol -r menghapus pemetaan pengguna SELinux ke akun OS. Penjelasan mengenai sintaks nilai MLS/MCS Range ada pada bagian sebelumnya.
[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol
Tim pengguna semanage digunakan untuk mengelola pemetaan antara pengguna dan peran SELinux.
[admin@server ~]$ semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
guest_u user s0 s0 guest_r
staff_u staff s0 s0-s0:c0.c1023 staff_r sysadm_r
...
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u
Parameter perintah:
- -a tambahkan entri pemetaan peran khusus;
- -l daftar pengguna dan peran yang cocok;
- -d menghapus entri pemetaan peran pengguna;
- -R daftar peran yang melekat pada pengguna;
File, Port, dan Nilai Boolean
Setiap modul SELinux menyediakan seperangkat aturan penandaan file, namun Anda juga dapat menambahkan aturan Anda sendiri jika perlu. Misalnya kita ingin web server mempunyai hak akses pada folder /srv/www.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/
Perintah pertama mendaftarkan aturan penandaan baru, dan perintah kedua mengatur ulang, atau lebih tepatnya menyetel, jenis file sesuai dengan aturan saat ini.
Demikian pula, port TCP/UDP ditandai sedemikian rupa sehingga hanya layanan yang sesuai yang dapat mendengarkannya. Misalnya, agar server web mendengarkan pada port 8080, Anda perlu menjalankan perintah.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080
Sejumlah besar modul SELinux memiliki parameter yang dapat mengambil nilai Boolean. Seluruh daftar parameter tersebut dapat dilihat menggunakan getsebool -a. Anda dapat mengubah nilai boolean menggunakan setsebool.
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off
Lokakarya, dapatkan akses ke antarmuka web Pgadmin
Mari kita lihat contoh praktisnya: kita menginstal pgadmin7.6-web di RHEL 4 untuk mengelola database PostgreSQL. Kami berjalan sedikit
Kita mulai dengan tersangka yang umum, memeriksa /var/log/httpd/error_log. Ada beberapa entri menarik di sana.
[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.
Pada titik ini, sebagian besar administrator Linux akan tergoda untuk menjalankan setencorce 0, dan itu akan menjadi akhir dari segalanya. Sejujurnya, saya melakukan hal itu untuk pertama kalinya. Ini tentu saja juga merupakan jalan keluar, tapi jauh dari yang terbaik.
Meskipun desainnya rumit, SELinux ramah pengguna. Cukup instal paket setroubleshoot dan lihat log sistem.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
Harap dicatat bahwa layanan auditd harus dimulai ulang dengan cara ini, dan tidak menggunakan systemctl, meskipun ada systemd di OS. Di log sistem akan ditunjukkan bukan hanya fakta pemblokiran, tetapi juga alasan dan cara untuk mengatasi larangan tersebut.
Kami menjalankan perintah ini:
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
Kami memeriksa akses ke halaman web pgadmin4-web, semuanya berfungsi.
Sumber: www.habr.com