Mengamankan layanan jaringan dengan SELinux: labeling dan opsi mount NFS termasuk noexec, konsekuensi storage terbagi antar host, boolean dan konteks samba untuk ekspor direktori dan home, serta labeling port untuk layanan non-standar.

Di episode 10, kalian melindungi container — tetapi data tetap harus berpindah antar host. File sharing melalui NFS dan Samba adalah tulang punggung lingkungan enterprise: storage bersama untuk aplikasi, home direktori pengguna, hingga data yang dipakai banyak server sekaligus. Sayangnya, begitu data melewati jaringan, aturan labeling SELinux yang selama ini kalian pelajari menjadi lebih rumit.
Episode 11 ini membahas tiga hal: bagaimana label bertahan (atau tidak bertahan) di NFS, bagaimana Samba berinteraksi dengan tipe file dan boolean, serta labeling port untuk layanan non-standar.
Di filesystem lokal, label file ditentukan dan dikelola oleh host itu sendiri. Di NFS, ceritanya berbeda: file yang di-export tidak membawa serta sistem label SELinux secara otomatis. Konsekuensinya, dari sisi client, file NFS tampil dengan tipe khusus bernama nfs_t:
ls -Z /mnt/web/index.htmlMasalahnya, nfs_t adalah tipe yang sangat permisif: hampir semua domain diizinkan membacanya. Untuk data biasa itu tidak masalah, tetapi untuk data sensitif itu undangan terbuka. Labeling dengan semanage fcontext di sisi client tidak berpengaruh untuk file NFS — label datang dari server, bukan dari client.
Solusinya adalah memaksa label saat mount dengan opsi context:
sudo mount -t nfs -o context="system_u:object_r:httpd_sys_content_t:s0" server:/export /mnt/webImportant
Opsi context= memaksa seluruh isi share memakai satu tipe yang sama — fleksibilitasnya rendah, tetapi justru itu kekuatannya: kalian tahu persis siapa yang boleh membaca data tersebut. Alternatifnya, gunakan NFS dengan dukungan labeling NFS (security label) bila kedua sisi dan filesystem mendukungnya, sehingga label dikirim dari server bersama setiap file. Sayangnya tidak semua kernel dan filesystem siap, jadi context= tetap jadi pilihan paling portabel.
Perhatikan bahwa NFS secara default memperbolehkan eksekusi binary dari mount. Untuk share yang hanya menyimpan data (backup, upload, arsip), eksekusi adalah risiko murni: penyerang yang berhasil menaruh binary di share tersebut tidak perlu usaha ekstra untuk menjalankannya. Mount dengan noexec menutup celah ini:
sudo mount -t nfs -o noexec,nodev,nosuid server:/data /mnt/dataKombinasikan juga nodev dan nosuid untuk share umum. Aturan mainnya: share yang isinya bukan program — selalu noexec.
Satu direktori yang dibagi banyak host membawa konsekuensi labeling yang sering luput dari perhatian:
context= yang berbeda, hasilnya denial yang membingungkan di salah satu sisi. Tetapkan satu konteks standar untuk satu share, dan propagasikan ke semua host.s0:c1 hanya bisa dibaca host atau proses yang levelnya cocok. Pastikan rentang level semua konsumen share sama, atau denial MCS akan muncul diam-diam.restorecon di sisi client tidak mengubah label file NFS. Perubahan label harus lewat server atau opsi mount — jangan buang waktu debug di arah yang salah.Warning
Jangan menjadikan share NFS sebagai tempat "asal taruh" tanpa memikirkan level dan tipe. Dua host dengan policy berbeda yang menulis ke share yang sama adalah salah satu sumber denial SELinux paling sulit didiagnosis di production — karena error-nya muncul di sisi yang tidak menulis. Dokumentasikan tipe dan level setiap share, dan terapkan dengan tooling provisioning agar konsisten dari awal.
Samba (protokol SMB/CIFS) mengekspor direktori Linux ke klien Windows dan Linux. Daemon smbd berjalan dalam domain smbd_t, dan aturannya mirip dengan pola yang sudah kalian kenal: direktori yang dibagi harus berlabel khusus, dan boolean mengontrol cakupan ekspor.
Direktori share khusus dibuat berlabel samba_share_t:
sudo semanage fcontext -a -t samba_share_t "/srv/share(/.*)?"
sudo restorecon -Rv /srv/shareSetelah itu, tambahkan direktori ke konfigurasi Samba dan smbd_t bisa membaca isinya. Tiga boolean utama mengontrol cakupan ekspor:
| Kebutuhan | Solusi |
|---|---|
| Ekspor home direktori user | samba_enable_home_dirs on |
| Ekspor semua file yang bisa dibaca smbd | samba_export_all_ro on |
| Ekspor semua file dengan izin tulis | samba_export_all_rw on |
Home user memerlukan boolean khusus karena direktori home berlabel user_home_t — tipe yang tidak boleh dibaca smbd_t secara default. Mengaktifkan samba_enable_home_dirs mengizinkan smbd masuk ke home secara terkontrol:
sudo setsebool -P samba_enable_home_dirs onTip
samba_export_all_rw dan samba_export_all_ro adalah pintu darurat: keduanya mengizinkan smbd membaca hampir semua file di sistem, bukan hanya direktori berlabel samba_share_t. Gunakan hanya untuk migration jangka pendek, lalu beralih ke labeling direktori yang benar. "Export all" yang menetap sama dengan membuka SELinux untuk seluruh layanan Samba.
Prinsip yang kalian pelajari di episode 9 berlaku untuk semua layanan jaringan: port yang tidak dikenal policy adalah port tanpa label, dan domain yang mencoba bind atau connect ke port itu akan kena denial name_bind atau name_connect. Lihat label port yang sudah dikenal:
semanage port -l | grep -E 'smbd|nfs'Port standar sudah berlabel: smbd_port_t untuk 139 dan 445, nfsd_port_t untuk 2049. Saat layanan berjalan di port non-standar — misalnya Samba di port 4450 atau aplikasi web di 8080 — tambahkan label baru:
sudo semanage port -a -t smbd_port_t -p tcp 4450
sudo semanage port -a -t http_port_t -p tcp 8080Note
Bayangkan port sebagai pintu masuk gedung. Policy SELinux punya daftar "pintu resmi" untuk setiap domain: http_port_t untuk httpd, smbd_port_t untuk samba, dan seterusnya. Membuka pintu baru tanpa mendaftarkannya di semanage port membuat penjaga keamanan (SELinux) menolak siapa pun yang lewat — meski secara UNIX permission semuanya terlihat normal. Inilah sumber denial yang paling membingungkan bagi yang belum paham.
Pada episode 11 ini kalian sudah memahami keunikan labeling lintas jaringan: file NFS berlabel nfs_t yang permisif dan solusi context= saat mount dengan noexec, konsekuensi berbagi storage antar host dengan policy berbeda, boolean dan konteks samba_share_t untuk ekspor Samba, serta labeling port non-standar dengan semanage port.
Kunci yang harus dibawa pulang:
context= dan noexec untuk data.semanage port, bukan dengan mematikan SELinux.Mulai episode ini, kita akan bergeser dari mengamankan layanan bawaan ke membangun proteksi untuk kasus khusus. Di episode 12, kita akan membahas Virtualization & Custom Policies — melindungi hypervisor KVM dan mesin virtual, serta menulis policy kustom dari nol untuk aplikasi yang tidak punya policy bawaan.