Semua pengaman yang kita pasang sejauh ini — permission, SSH key, firewall — masih percaya bahwa proses yang sah tidak akan berbuat jahat. Kenyataannya, serangan sering justru berangkat dari proses yang sah lalu dibajak: bug pada web server membuat proses httpd yang sah menjalankan perintah penyerang, dan permission biasa tidak tahu bahwa httpd tidak seharusnya membaca /etc/shadow. SELinux menjawab celah itu dengan mandatory access control (MAC): kernel memeriksa setiap operasi terhadap kebijakan, bukan hanya permission pemilik file. Chapter ini membedah label context, tiga mode, dan cara membaca denial — bekal yang langsung terpakai di RHEL, Fedora, dan Android. Mesin Debian latihan kita tidak memasang SELinux, jadi label kita urai sebagai data latihan dan file konfigurasinya kita tulis dalam format aslinya.

Batas Permission Biasa (DAC) #

Permission rwx yang kita kenal dari awal course adalah discretionary access control (DAC): pemilik file menentukan siapa boleh mengakses, dan root melewati semua pemeriksaan. Model ini punya dua lubang. Pertama, permission tidak membedakan maksud — file catatan.txt bernilai rw-r--r-- terbaca oleh semua program yang berjalan sebagai user kita, termasuk program jahat. Kedua, proses yang dibajak mewarisi seluruh hak user-nya: pembajak atas www-data bisa membaca semua yang bisa dibaca www-data. MAC menutup celah itu dengan pertanyaan yang berbeda: bukan “siapa pemiliknya”, melainkan “apakah proses jenis ini memang boleh menyentuh objek jenis itu”.

Label context: Identitas yang Menempel di Objek #

SELinux memberi setiap proses, file, port, dan objek lain sebuah label context berformat user:role:type:level. Keputusan hampir selalu diambil dari bagian type: kebijakan mendefinisikan pasangan “type proses boleh mengakses type objek” — httpd_t boleh membaca httpd_sys_content_t, dan kombinasi lain ditolak walau permission DAC-nya terbuka lebar. Label terlihat dengan ls -Z untuk file dan ps -Z untuk proses. Berikut contoh tampilan ls -Z di direktori milik server web:

text
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 style.css
-rw-------. 1 root root unconfined_u:object_r:admin_home_t:s0 catatan-server.txt

Titik di ujung kolom permission (-rw-r--r--.) adalah penanda bahwa file ini punya label SELinux. Dua file pertama bertipe httpd_sys_content_t — sah dibaca web server — sedangkan catatan-server.txt bertipe admin_home_t: walau dimiliki root dan permission-nya ketat, web server tetap ditolak karena type itu tidak ada dalam daftar yang boleh diakses httpd_t.

Mari kita urai format label itu dengan alat yang sudah kita kenal:

bash
printf 'unconfined_u:object_r:admin_home_t:s0\nsystem_u:object_r:etc_t:s0\nsystem_u:object_r:httpd_sys_content_t:s0\nunconfined_u:object_r:etc_t:s0\n' > daftar-context
cat daftar-context
echo '== hanya bagian type (dipisah :) =='
cut -d: -f3 daftar-context | sort | uniq -c

Output yang Dihasilkan:

text
unconfined_u:object_r:admin_home_t:s0
system_u:object_r:etc_t:s0
system_u:object_r:httpd_sys_content_t:s0
unconfined_u:object_r:etc_t:s0
== hanya bagian type (dipisah :) ==
      1 admin_home_t
      2 etc_t
      1 httpd_sys_content_t

Empat bagian label dipisah titik dua, dan blok di atas membedahnya:

  1. Baris 2 (printf ... > daftar-context): menulis empat label contoh — formatnya persis yang ditampilkan ls -Z dan ps -Z.
  2. Baris 4 (cut -d: -f3): mengambil kolom ketiga, yaitu type — bagian yang paling sering menentukan keputusan.
  3. Baris 5 (sort | uniq -c): menghitung type apa saja yang muncul; etc_t ada dua karena label memang bisa sama untuk banyak file.
  4. Empat bagian label: user (identitas SELinux, bukan user Linux), role (lapisan RBAC, jarang kita sentuh), type (aktor utama kebijakan), dan level (untuk klasifikasi multi-level; nilainya s0 pada kebijakan targeted).

Tiga Mode dan File Konfigurasinya #

SELinux berjalan dalam tiga keadaan, dan mengenali ketiganya adalah setengah dari pekerjaan diagnosis:

ModePerilaku saat aturan dilanggarKapan dipakai
enforcingoperasi ditolak dan dicatatkondisi normal sistem produksi
permissivedicatat saja, tidak ditolakmengumpulkan daftar denial sebelum menyalakan enforcing
disabledkebijakan tidak dimuat sama sekalidipilih sadar, bukan pelarian

getenforce menampilkan mode saat ini, sudo setenforce 1 mengaktifkan enforcing, dan sudo setenforce 0 turun ke permissive — keduanya hanya sampai reboot. Keadaan saat boot dibaca dari /etc/selinux/config:

bash
cat > config-selinux <<'AKHIR'
# Keadaan SELinux saat boot: enforcing, permissive, atau disabled
SELINUX=enforcing
# Kebijakan yang dimuat: targeted, minimum, atau mls
SELINUXTYPE=targeted
AKHIR
cat config-selinux
echo '== nilai efektif =='
grep -E '^(SELINUX|SELINUXTYPE)=' config-selinux

Output yang Dihasilkan:

text
# Keadaan SELinux saat boot: enforcing, permissive, atau disabled
SELINUX=enforcing
# Kebijakan yang dimuat: targeted, minimum, atau mls
SELINUXTYPE=targeted
== nilai efektif ==
SELINUX=enforcing
SELINUXTYPE=targeted

Kita bedah blok di atas:

  1. Baris 1-8 (cat > config-selinux): menulis salinan latihan berisi dua arahan seperti file aslinya — path sungguhnya /etc/selinux/config di RHEL dan Fedora.
  2. SELINUX=enforcing: mode saat boot; mengubahnya memerlukan reboot agar benar-benar ambil efek.
  3. SELINUXTYPE=targeted: kebijakan yang dimuat — dibahas setelah ini.
  4. Baris terakhir (grep -E '^(SELINUX|...)'): pola ^ hanya mengambil arahan aktif dan melewati baris komentar — trik yang sama untuk membaca file konfigurasi apa pun yang penuh komentar.

Targeted Policy dan Membaca Denial #

Kebijakan targeted, bawaan RHEL dan Fedora, hanya mengurung service tertentu — httpd, sshd, named — dalam type masing-masing; sisanya berjalan sebagai unconfined_t yang bebas dari pemeriksaan. Kebijakan mls mengurung semuanya dan dipakai lingkungan berklasifikasi ketat. Saat aturan dilanggar, kernel mencatat baris AVC ke log audit. Berikut contoh tampilan satu denial:

text
type=AVC msg=audit(1768240447.312:441): avc:  denied  { read } for  pid=2841 comm="httpd" name="catatan-server.txt" dev="sda1" ino=918273 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file permissive=0

Tiga kunci membacanya: scontext adalah label si pengakses (proses httpd_t), tcontext label si diakses (file admin_home_t), dan permissive=0 berarti operasi benar-benar ditolak. Diagnosisnya: file itu dipindahkan dari home directory — mv membawa label lama, cp membuat label baru sesuai lokasi tujuan — sehingga perbaikannya sudo restorecon -v catatan-server.txt yang mengembalikan label sesuai aturan kebijakan lokasi itu. Untuk pengecualian permanen, semanage fcontext mengubah aturan labelnya dulu, baru restorecon menerapkannya.

SELinux mengunci sistem dengan label yang menempel pada setiap objek — kuat, tetapi kebijakannya memang bukan bacaan santai. Distribusi lain mengambil filosofi yang lebih ramah editor teks: AppArmor, yang menulis kebijakan sebagai daftar jalur file. Chapter berikutnya membandingkan keduanya.

Referensi lanjut: Fedora quick docs tentang mengubah keadaan dan mode SELinux , wiki Debian tentang SELinux , serta wiki Arch Linux tentang SELinux untuk langkah pemasangannya di distro lain.