Sistem keamanan Linux

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 Lihat lebih dekat dengan arsitektur kernel Linux, maka tidak mungkin menemukan di dalamnya kotak yang bertanggung jawab atas keamanan. Di mana subsistem keamanan Linux bersembunyi dan terdiri dari apa?

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.

Sistem keamanan Linux
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.

Sistem keamanan Linux
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.

Sistem keamanan Linux
Bagaimana SELinux bekerja

Semuanya bekerja seperti ini.

  1. 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.
  2. 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.
  3. Otoritas pengambilan keputusan mengenai akses subjek ke suatu objek adalah Server Penegakan Kebijakan dan menerima data dari SELinux AnHL.
  4. Untuk membuat keputusan tentang akses atau penolakan, Server Penegakan Kebijakan beralih ke subsistem cache Access Vector Cache (AVC) untuk aturan yang paling sering digunakan.
  5. Jika solusi untuk aturan terkait tidak ditemukan di cache, maka permintaan diteruskan ke database kebijakan keamanan.
  6. Hasil pencarian dari database dan AVC dikembalikan ke Server Penegakan Kebijakan.
  7. 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 Pencarian dengan pengaturan pg_hba.conf, postgresql.conf dan config_local.py, mengatur izin folder, menginstal modul Python yang hilang dari pip. Semuanya sudah siap, kami luncurkan dan terima 500 Internal Server Error.

Sistem keamanan Linux

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.

Sistem keamanan Linux

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.

Sistem keamanan Linux

Sistem keamanan Linux

Sumber: www.habr.com

Tambah komentar