Menerapkan Landlock di Linux
(blog.prizrak.me)- Landlock adalah API keamanan Linux yang membuat aplikasi melakukan sandboxing mandiri di tingkat kernel dengan mendeklarasikan secara eksplisit sumber daya yang boleh diakses
- Dibandingkan SELinux atau AppArmor, Landlock lebih sederhana, dan kebijakan dapat dibuat serta diterapkan saat runtime tanpa hak istimewa pengembang
- Kebijakan didefinisikan dalam bentuk allowlist eksplisit untuk file, direktori, port, dan lainnya yang boleh diakses, serta memungkinkan penguatan keamanan bertahap melalui pembatasan hierarkis
- Tersedia binding untuk Rust, Go, Haskell, sehingga kontrol akses yang terperinci bisa diterapkan di berbagai lingkungan seperti aplikasi GUI, server, dan proses desktop
- Dalam ekosistem keamanan Linux, Landlock mendapat perhatian sebagai alat sandbox tanpa hak istimewa yang sederhana dan praktis, serta dipandang sebagai komponen kunci untuk memperkuat keamanan desktop ke depan
Gambaran umum Landlock
- Landlock adalah API yang memungkinkan aplikasi Linux mendeklarasikan secara eksplisit sumber daya yang dapat mereka akses
- Mirip dengan konsep
unveil()danpledge()di OpenBSD, berlandaskan prinsip “hanya izinkan sumber daya yang diperlukan, blokir sisanya”
- Mirip dengan konsep
- Menyediakan lapisan pertahanan yang ramah pengembang yang lebih mudah dipahami dan diintegrasikan dibanding mekanisme keamanan Linux yang sudah ada
- Tujuannya adalah memberi pengenalan yang mudah dipahami sekaligus mendorong penggunaan Landlock
Cara kerjanya
- Berbentuk Linux Security Module(LSM) dan tersedia sejak Linux 5.13
- Tidak seperti SELinux atau AppArmor, Landlock menerapkan pembatasan sementara tingkat proses (transient restriction)
- Kebijakan dibuat saat runtime, hanya berlaku untuk thread saat ini dan proses anaknya, lalu hilang saat proses berakhir
- Komponen kebijakan
- Handled accesses: kategori operasi yang akan dibatasi (misalnya baca/tulis sistem file)
- Access grants: daftar eksplisit objek yang diizinkan
- Contoh kebijakan
/home/userhanya-baca/tmpbaca/tulis- Mengizinkan bind ke port
2222
- Saat
landlock_restrict_self()dipanggil, thread tersebut dan proses anaknya secara permanen masuk ke area terbatas- Pembatasan tidak bisa dicabut, dan dapat ditumpuk hingga maksimum 16 lapisan (layer)
- Lapisan bawah dapat lebih mengurangi akses, tetapi hak yang sudah dihapus pada lapisan atas tidak dapat dipulihkan
- Bekerja secara tanpa hak istimewa (unprivileged), sehingga aplikasi biasa pun dapat melakukan sandboxing mandiri
- Melalui manajemen versi ABI, Landlock tetap dapat berjalan sejauh mungkin bahkan pada kernel yang lebih lama
- Sebagai Stackable LSM, Landlock dapat digunakan bersamaan dengan SELinux atau AppArmor
Alasan menggunakannya
- Cocok untuk aplikasi dengan pola akses file yang dapat diprediksi
- Contoh: membatasi web server agar hanya dapat mengakses
/var/www/htmldan/tmp
- Contoh: membatasi web server agar hanya dapat mengakses
- Tidak memerlukan campur tangan administrator atau pengaturan global sistem, karena kebijakan bisa didefinisikan langsung di dalam kode
- Dapat digunakan tanpa eskalasi hak akses, sehingga mudah diintegrasikan ke sebagian besar program
- Ada binding untuk Rust, Go, Haskell, dan juga banyak proyek pembungkus bergaya
unveil - Belum ada pustaka C resmi, tetapi sudah ada beberapa implementasi tidak resmi yang dapat digunakan
- Contoh kode Rust mengatur
/usr,/etc,/devsebagai hanya-baca, dan/home,/tmpsebagai baca/tulis
Kondisi sandboxing Linux saat ini dan kebutuhannya
- Seiring meningkatnya penggunaan Linux, malware yang menargetkan desktop juga meningkat
- Keamanan Linux yang relatif lebih baik lebih disebabkan oleh pangsa pasar dan hambatan teknis, bukan karena keamanan struktural
- Masalah pada distribusi umum
- Dapat menjalankan biner yang tidak tepercaya
- Dapat langsung menjalankan skrip dari internet
- Menggunakan sudo tanpa kata sandi
- Aplikasi biasa dapat mengakses file sensitif di dalam
$HOME - Dapat memantau penekanan tombol di lingkungan X11
- Dapat melakukan bind ke port arbitrer
Keterbatasan alat keamanan yang ada
- Containerization (Docker, Podman) : cocok untuk isolasi layanan, tetapi kurang sesuai untuk aplikasi desktop, dan ada kasus isolasi dinonaktifkan melalui opsi
--privileged - Flatpak / Snap: cocok untuk aplikasi GUI tetapi cakupan izinnya berlebihan, serta kurang cocok untuk alat CLI
- Firejail: memerlukan profil per aplikasi, dan harus dipanggil secara eksplisit setiap kali dijalankan
Mekanisme yang ada dari sudut pandang pengembang
- seccomp: kuat tetapi konfigurasi rumit, dan pendekatan blacklist rentan
- SELinux: kuat tetapi kompleks dan memerlukan kebijakan administrator; pada banyak distribusi dinonaktifkan secara bawaan
- AppArmor: lebih sederhana daripada SELinux tetapi tetap memerlukan profil administrator, dan dinonaktifkan di sebagian distribusi
Ringkasan keunggulan Landlock
- Tanpa hak istimewa, berpusat pada aplikasi, mudah diintegrasikan, deny-by-default
- Didukung luas sejak Linux 5.13, sambil tetap menjaga kompatibilitas maju dan mundur
- Meski tidak sempurna, Landlock menutup celah sebagai alat sandbox tanpa hak istimewa yang sederhana dan mandiri
Kemungkinan penerapan Landlock
- Pada proses daemon berhak tinggi yang berjalan lama, Landlock dapat digunakan untuk membatasi cakupan akses
- Pembaca PDF, penampil gambar, browser web, pengolah kata dan sejenisnya dapat dibatasi agar hanya mengakses file yang dibuka
- Server FTP/HTTP dapat dikonfigurasi agar hanya mengakses file yang diperlukan
- Contoh: meskipun nginx berjalan sebagai root, penyerang yang memperoleh shell tetap tidak dapat mengakses file di luar kebijakan
- Jika usulan Supervisor diterapkan, sistem izin mirip Android dapat diwujudkan di desktop Linux
- Bila digabungkan dengan GUI dan sistem penyimpanan izin, hal ini dapat menghadirkan pengalaman pengguna yang lebih aman
Pengembangan fitur Landlock yang sedang berlangsung
- Supervise Mode: menentukan izin/tolak akses secara interaktif dari user space, mirip prompt izin ala Android
- Socket Restrictions: kontrol rinci atas jenis socket dan port yang dapat digunakan proses
- LANDLOCK_RESTRICT_SELF_TSYNC: menyebarkan pembatasan ke semua thread dalam proses
- LANDLOCK_ADD_RULE_QUIET: menekan pesan log audit untuk objek tertentu
- LANDLOCK_ADD_RULE_NO_INHERIT: mencegah izin direktori induk diwariskan ke bawah, sehingga kontrol sistem file menjadi lebih rinci
Ringkasan
- Landlock adalah mekanisme sandbox deny-by-default yang sederhana dan berbasis tanpa hak istimewa
- Mudah dipahami dan diintegrasikan, serta memiliki potensi besar untuk meningkatkan keamanan desktop Linux dan aplikasi
- Pengembang dapat menerapkan Landlock langsung ke aplikasi untuk memperkuat tingkat keamanannya
1 komentar
Opini Hacker News
Saya menulis program sederhana dalam C agar hanya menerima pada satu port tertentu, lalu memblokir semua koneksi jaringan lainnya
Saya merujuk ke contoh
sandboxer.c, dan hanya mengontrol jaringan tanpa menyentuh pembatasan akses fileKoneksi yang diblokir terlihat di
dmesg, kemungkinan berkat fitur auditAlat ini bekerja dalam mode pengguna tanpa hak istimewa, dan juga berjalan baik di dalam kontainer tanpa pengaturan firewall
Namun, saya rasa ini tidak cocok untuk tujuan memblokir program jahat sepenuhnya
Jika melihat isu #28 dan thread email terkait, ada masalah bahwa aturan sandbox tidak bisa merujuk ke direktori yang belum ada
Misalnya, jika Anda menambahkan aturan saat
~/.sshbelum ada, maka meskipun direktori itu dibuat nanti, aksesnya tidak akan diblokirArtinya, bisa timbul celah keamanan
Menjalankannya dengan hak minimum ternyata cukup rumit
“Microlandia” tidak bisa berjalan, tetapi game Unity lain berjalan baik
Saya berharap akan ada lebih banyak alat berbasis Landlock agar pekerjaan seperti ini jadi lebih mudah
Sepertinya CRI mencoba mendefinisikan antarmuka mereka sendiri, tetapi pasti selalu tertinggal dari dukungan kernel
Saya rasa sebagian besar penanggung jawab infrastruktur tidak akan memelihara kebijakan sandbox per aplikasi
Menurut saya, lebih realistis bila aplikasi menggunakan Landlock secara langsung
dijelaskan bahwa jika runtime begitu saja meneruskan system call, akan muncul masalah harus mempercayai aplikasi untuk mengunci dirinya sendiri
Secara internal kami memakai API serupa untuk manajemen proses penting
Riset seperti ini akan sangat membantu juga di industri yang diregulasi
Jika ini fitur kernel, bukankah wajar jika API C hadir lebih dulu; saya jadi bertanya-tanya kenapa tidak ada
libc hanyalah lapisan di atasnya, dan sampai sekarang banyak syscall yang tetap ada tanpa wrapper di libc
Anda juga bisa membuat header sendiri dan memanggilnya dengan makro
_syscallNAnda bisa memakai wrapper sederhana seperti landbox,
dan Rust atau Go juga bisa mengekspos C FFI
Cukup melihat contoh sandboxer.c dari kernel
Memang berbeda dari Landlock, tetapi bisa dipakai secara saling melengkapi
/sysMungkin itu karena prinsip tanpa hak istimewa
Saya juga penasaran apakah syscall Landlock bisa diblokir dengan seccomp
Jika kebijakan seccomp lama tidak memasukkan nomor Landlock, bukankah bisa memicu SIGSYS?
API berbasis filesystem punya banyak footgun, dan untuk kontrol akses berbasis dirfd, syscall lebih cocok
Filter seccomp yang ditulis dengan baik akan mengembalikan -ENOSYS sehingga hanya terlihat seperti “tidak didukung”
Karena Landlock hanya membatasi hak yang sudah ada, bukan memberikan hak baru
Saya sedang bersiap benar-benar pindah ke Linux dari Mac, dan penasaran seberapa besar Landlock membantu untuk pertahanan terhadap malware
Misalnya, saya ingin membuat lingkungan yang otomatis menolak akses ke
~/.sshSaya juga ingin tahu apakah ini bisa dipakai untuk membuat peluncur aplikasi
Fungsinya agar aplikasi membatasi sendiri hak yang tidak dibutuhkannya, sehingga penyerang tidak bisa mengambil alih sistem
~/.sshmemerlukan model MAC seperti AppArmor atau SELinuxLandlock berguna saat aplikasi membatasi dirinya sendiri atau proses anaknya
Misalnya npm membatasi skrip post-install hanya ke direktori build
Ini adalah API yang dipakai langsung oleh pengembang aplikasi, seperti pledge di OpenBSD
Namun karena ekosistem Linux terfragmentasi, penerapannya kemungkinan akan lambat
Untuk sementara, bentuk wrapper atau launcher adalah pendekatan yang lebih realistis
Pada akhirnya ini hanya efektif jika program tahu hak aksesnya sendiri
Aplikasi pada awal eksekusi menetapkan whitelist sumber daya yang diperlukan lalu memblokir sisanya
Ini bukan untuk pertahanan terhadap program jahat, melainkan melindungi prosesnya sendiri
Syscall sudah ada di pustaka standar, jadi apakah benar perlu pustaka terpisah?
Dokumentasi man7 juga sudah ada
Saya penasaran apakah maksudnya hanya menginginkan lapisan abstraksi
jadi cukup mengejutkan bahwa glibc masih belum menyediakan antarmuka Landlock
Mungkin alasannya karena masalah kompatibilitas non-Linux