Belajar SELinux - NFS, Samba & Network Services
Episode 11 of 23

Belajar SELinux - NFS, Samba & Network Services

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.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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.

NFS dan Labeling: Siapa yang Memegang Label?

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:

Lihat label file di mount NFS
ls -Z /mnt/web/index.html

Masalahnya, 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:

Mount NFS dengan konteks paksa
sudo mount -t nfs -o context="system_u:object_r:httpd_sys_content_t:s0" server:/export /mnt/web

Important

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.

noexec pada Share Data

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:

LinuxMount NFS data tanpa eksekusi
sudo mount -t nfs -o noexec,nodev,nosuid server:/data /mnt/data

Kombinasikan juga nodev dan nosuid untuk share umum. Aturan mainnya: share yang isinya bukan program — selalu noexec.

Konsekuensi Shared Storage

Satu direktori yang dibagi banyak host membawa konsekuensi labeling yang sering luput dari perhatian:

  • Konsistensi lintas host. Host A menulis file dengan konteks tertentu, host B membacanya. Jika kedua host memakai opsi context= yang berbeda, hasilnya denial yang membingungkan di salah satu sisi. Tetapkan satu konteks standar untuk satu share, dan propagasikan ke semua host.
  • Level MCS ikut dibawa. Share dengan level kategori 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.
  • Relabel di client tidak berguna. 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: Boolean dan Konteks

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:

Siapkan direktori share samba
sudo semanage fcontext -a -t samba_share_t "/srv/share(/.*)?"
sudo restorecon -Rv /srv/share

Setelah itu, tambahkan direktori ke konfigurasi Samba dan smbd_t bisa membaca isinya. Tiga boolean utama mengontrol cakupan ekspor:

KebutuhanSolusi
Ekspor home direktori usersamba_enable_home_dirs on
Ekspor semua file yang bisa dibaca smbdsamba_export_all_ro on
Ekspor semua file dengan izin tulissamba_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:

Izinkan samba mengakses home user
sudo setsebool -P samba_enable_home_dirs on

Tip

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.

Port Labeling untuk Layanan Non-Standar

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:

Lihat label port samba dan NFS
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:

Label port non-standar
sudo semanage port -a -t smbd_port_t -p tcp 4450
sudo semanage port -a -t http_port_t -p tcp 8080

Note

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.

Penutup

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:

  • Label NFS datang dari server; di client gunakan opsi context= dan noexec untuk data.
  • Share yang dibagi banyak host harus punya tipe dan level yang didokumentasikan dan konsisten.
  • Sambungkan layanan non-standar ke policy lewat 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.

Belajar SELinux - NFS, Samba & Network Services | Belajar SELinux