Menerapkan Kontrol Akses Wajib dengan SELinux atau AppArmor di Linux


Untuk mengatasi keterbatasan dan meningkatkan mekanisme keamanan yang disediakan oleh izin ugo/rwx standar dan daftar kontrol akses, Badan Keamanan Nasional Amerika Serikat (NSA) merancang < MetodeKontrol Akses Wajib (MAC) yang dikenal sebagai SELinux (kependekan dari Security Enhanced Linux) untuk membatasi antara lain, kemampuan proses untuk mengakses atau melakukan operasi lain pada objek sistem (seperti file, direktori, port jaringan, dll) dengan izin sesedikit mungkin, namun tetap memungkinkan modifikasi selanjutnya pada model ini.

MAC lain yang populer dan banyak digunakan adalah AppArmor, yang selain fitur-fitur yang disediakan oleh SELinux, juga menyertakan mode pembelajaran yang memungkinkan sistem untuk “belajar ” bagaimana aplikasi tertentu berperilaku, dan menetapkan batasan dengan mengonfigurasi profil untuk penggunaan aplikasi yang aman.

Di CentOS 7, SELinux dimasukkan ke dalam kernel itu sendiri dan diaktifkan dalam mode Menerapkan secara default (lebih lanjut tentang ini di bagian berikutnya), dibandingkan dengan openSUSE dan Ubuntu yang menggunakan AppArmor.

Pada artikel ini kami akan menjelaskan esensi SELinux dan AppArmor dan cara menggunakan salah satu alat ini untuk keuntungan Anda tergantung pada distribusi pilihan Anda.

Pengenalan SELinux dan Cara Menggunakannya di CentOS 7

Linux yang Ditingkatkan Keamanan dapat beroperasi dengan dua cara berbeda:

  1. Menegakkan: SELinux menolak akses berdasarkan aturan kebijakan SELinux, yaitu serangkaian pedoman yang mengontrol mesin keamanan.
  2. Permisif: SELinux tidak menolak akses, namun penolakan dicatat untuk tindakan yang mungkin ditolak jika dijalankan dalam mode penegakan.

SELinux juga dapat dinonaktifkan. Meskipun ini bukan mode operasi, ini masih merupakan pilihan. Namun, mempelajari cara menggunakan alat ini lebih baik daripada mengabaikannya begitu saja. Ingatlah!

Untuk menampilkan mode SELinux saat ini, gunakan getenforce. Jika Anda ingin mengganti mode operasi, gunakan setenforce 0 (untuk menyetelnya ke Permissive) atau setenforce 1 (Enforcing).

Karena perubahan ini tidak akan bertahan setelah reboot, Anda perlu mengedit file /etc/selinux/config dan menyetel variabel SELINUX ke salah satu enforcing, permissive, atau disabled untuk mencapai persistensi saat reboot:

Sebagai catatan tambahan, jika getenforce mengembalikan Disabled, Anda harus mengedit /etc/selinux/config dengan mode operasi yang diinginkan dan melakukan boot ulang. Jika tidak, Anda tidak akan dapat menyetel (atau mengalihkan) mode operasi dengan setenforce.

Salah satu penggunaan setenforce yang umum adalah beralih antara mode SELinux (dari menegakkan ke permisif atau sebaliknya) untuk memecahkan masalah aplikasi yang berperilaku buruk atau tidak berfungsi seperti yang diharapkan. Jika ini berfungsi setelah Anda menyetel SELinux ke mode Permisif, Anda dapat yakin bahwa Anda sedang melihat masalah izin SELinux.

Dua kasus klasik yang kemungkinan besar harus kita hadapi dengan SELinux adalah:

  1. Mengubah port default tempat daemon mendengarkan.
  2. Menyetel direktif DocumentRoot untuk host virtual di luar /var/www/html.

Mari kita lihat kedua kasus ini dengan menggunakan contoh berikut.

CONTOH 1: Mengubah port default untuk daemon sshd

Salah satu hal pertama yang dilakukan sebagian besar administrator sistem untuk mengamankan server mereka adalah mengubah port tempat daemon SSH mendengarkan, sebagian besar untuk mencegah pemindai port dan penyerang eksternal. Untuk melakukan ini, kita menggunakan direktif Port di /etc/ssh/sshd_config diikuti dengan nomor port baru sebagai berikut (kita akan menggunakan port 9999 dalam kasus ini):


Port 9999

Setelah mencoba memulai ulang layanan dan memeriksa statusnya, kita akan melihat bahwa layanan gagal dimulai:


systemctl restart sshd
systemctl status sshd

Jika kita melihat /var/log/audit/audit.log, kita akan melihat bahwa sshd dicegah untuk memulai pada port 9999 oleh SELinux karena itu adalah port yang dicadangkan untuk layanan JBoss Management (pesan log SELinux menyertakan kata “AVC” sehingga dapat dengan mudah diidentifikasi dari pesan lain):


cat /var/log/audit/audit.log | grep AVC | tail -1

Pada titik ini kebanyakan orang mungkin akan menonaktifkan SELinux namun kami tidak akan melakukannya. Kita akan melihat bahwa ada cara bagi SELinux, dan sshd mendengarkan di port yang berbeda, untuk hidup bersama secara harmonis. Pastikan Anda telah menginstal dan menjalankan paket policycoreutils-python:


yum install policycoreutils-python

Untuk melihat daftar port dimana SELinux mengizinkan sshd untuk mendengarkan. Pada gambar berikut kita juga dapat melihat bahwa port 9999 dicadangkan untuk layanan lain sehingga kita tidak dapat menggunakannya untuk menjalankan layanan lain untuk sementara waktu:


semanage port -l | grep ssh

Tentu saja kita dapat memilih port lain untuk SSH, tetapi jika kita yakin bahwa kita tidak perlu menggunakan mesin khusus ini untuk layanan terkait JBoss apa pun, kita kemudian dapat memodifikasi aturan SELinux yang ada dan menetapkan port tersebut ke SSH:


semanage port -m -t ssh_port_t -p tcp 9999

Setelah itu, kita dapat menggunakan perintah semanage pertama untuk memeriksa apakah port telah ditetapkan dengan benar, atau opsi -lC (kependekan dari list custom):


semanage port -lC
semanage port -l | grep ssh

Sekarang kita dapat memulai ulang SSH dan terhubung ke layanan menggunakan port 9999. Perhatikan bahwa perubahan ini AKAN bertahan saat reboot.

CONTOH 2: Memilih DocumentRoot di luar /var/www/html untuk host virtual

Jika Anda perlu menyiapkan host virtual Apache menggunakan direktori selain /var/www/html sebagai DocumentRoot (misalnya, /websrv/sites /gabriel/public_html):


DocumentRoot “/websrv/sites/gabriel/public_html”

Apache akan menolak menyajikan konten karena index.html telah diberi label dengan tipe default_t SELinux, yang tidak dapat diakses oleh Apache:


wget http://localhost/index.html
ls -lZ /websrv/sites/gabriel/public_html/index.html

Seperti contoh sebelumnya, Anda dapat menggunakan perintah berikut untuk memverifikasi bahwa ini memang masalah terkait SELinux:


cat /var/log/audit/audit.log | grep AVC | tail -1

Untuk mengubah label /websrv/sites/gabriel/public_html secara rekursif menjadi httpd_sys_content_t, lakukan:


semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

Perintah di atas akan memberikan Apache akses read-only ke direktori tersebut dan isinya.

Terakhir, untuk menerapkan kebijakan tersebut (dan segera menerapkan perubahan label), lakukan:


restorecon -R -v /websrv/sites/gabriel/public_html

Sekarang Anda seharusnya dapat mengakses direktori:


wget http://localhost/index.html

Untuk informasi lebih lanjut tentang SELinux, lihat panduan Fedora 22 SELinux dan Administrator.