Bagaimana cara "memenjarakan" suatu proses tanpa menjadi root?

26

Kalau saya root, saya cukup membuat dummy pengguna / grup, mengatur izin file yang sesuai dan menjalankan proses sebagai pengguna itu. Namun saya tidak, jadi apakah ada cara untuk mencapai ini tanpa menjadi root?

Tobias Kienzler
sumber
1
@alex: Saya memiliki skrip yang menjalankan beberapa simulasi (dalam direktori yang berbeda) dan ingin memastikan tidak peduli seberapa buruk pemrogramannya, mereka hanya dapat mengakses file di direktori mereka sendiri dan tidak secara tidak sengaja memodifikasi misalnya output dari simulasi lain
Tobias Kienzler
2
@Tobias: Saya mengerti maksud Anda. chrootsecara alami cocok di sana, tetapi sekali lagi Anda tidak root.
alex
1
Saya pikir selinux, apparmor, dan grsecurity, mungkin bisa melakukan ini, tapi saya tidak yakin. tetapi kemudian jika itu tidak tersedia atau dikonfigurasi oleh admin sistem, Anda sol itu.
xenoterracide
4
Pertanyaan seperti itu telah membuat saya bertanya-tanya selama bertahun-tahun. Tampaknya menjadi keinginan alami: tanpa menjadi root, untuk dapat menjalankan proses dengan beberapa izin pengguna Anda dibuang, yaitu untuk dapat membatasi proses ke "penjara" pengaturan pengguna, yang akan memberikan proses lebih merata hak yang kurang dari yang dimiliki pengguna Anda. Sayang sekali bahwa Unices biasa tidak menawarkan ini secara standar!
imz - Ivan Zakharyaschev
2
Coba minta administrator sistem Anda untuk menjadikan Anda akun pengguna kedua.
LawrenceC

Jawaban:

23

Qs yang lebih mirip dengan lebih banyak jawaban yang patut diperhatikan:

CATATAN: Beberapa jawaban di sana menunjukkan solusi spesifik yang belum disebutkan di sini.

Sebenarnya, ada beberapa alat pemenjaraan dengan implementasi yang berbeda, tetapi banyak dari mereka yang tidak aman oleh desain (seperti fakeroot, LD_PRELOADberbasis), atau tidak lengkap (seperti fakeroot-ng, ptraceberbasis), atau akan membutuhkan root ( chroot, atau plashdisebutkan di fakechroot label peringatan ).

Ini hanya contoh; Saya berpikir untuk mendaftarkan mereka semua berdampingan, dengan indikasi 2 fitur ini ("dapat dipercaya?", "Memerlukan root untuk mengatur?"), Mungkin di Implementasi virtualisasi tingkat sistem Operasi .

Secara umum, jawaban di sana mencakup berbagai kemungkinan yang dijelaskan dan bahkan lebih banyak lagi:

mesin virtual / OS

ekstensi kernel (seperti SELinux)

  • (disebutkan dalam komentar di sini),

chroot

Pembantu berbasis chroot (yang bagaimanapun harus setUID root, karena chrootmemerlukan root; atau mungkin chrootbisa bekerja di namespace yang terisolasi - lihat di bawah):

[untuk memberi tahu lebih banyak tentang mereka!]

Alat isolasi berbasis chroot yang dikenal:

  • hasher dengan hsh-rundan hsh-shellperintahnya. ( Hasher dirancang untuk membuat perangkat lunak dengan cara yang aman dan berulang.)
  • schroot disebutkan dalam jawaban lain
  • ...

ptrace

Solusi isolasi lain yang dapat dipercaya (selain yang seccompberbasis ) adalah syscall-interception menyeluruh ptrace, seperti yang dijelaskan dalam halaman manual untuk fakeroot-ng:

Tidak seperti implementasi sebelumnya, fakeroot-ng menggunakan teknologi yang membuat proses yang dilacak tidak ada pilihan mengenai apakah ia akan menggunakan "layanan" fakeroot-ng atau tidak. Mengkompilasi program secara statis, memanggil kernel secara langsung dan memanipulasi ruang alamat sendiri adalah semua teknik yang dapat digunakan secara sepele untuk mem-bypass kontrol berbasis LD_PRELOAD atas suatu proses, dan tidak berlaku untuk fakeroot-ng. Secara teori, dimungkinkan untuk membentuk fakeroot-ng sedemikian rupa sehingga memiliki kontrol penuh atas proses yang dilacak.

Meskipun secara teori dimungkinkan, namun belum dilakukan. Fakeroot-ng memang berasumsi asumsi "berperilaku baik" tertentu tentang proses yang dilacak, dan proses yang melanggar asumsi tersebut mungkin dapat, jika tidak sepenuhnya melarikan diri maka setidaknya menghindari beberapa "palsu" lingkungan yang dikenakan padanya oleh fakeroot- ng. Karena itu, Anda sangat diperingatkan untuk tidak menggunakan fakeroot-ng sebagai alat keamanan. Laporan bug yang mengklaim bahwa suatu proses dapat dengan sengaja (berlawanan dengan tidak sengaja) lolos dari kontrol palsu-root akan ditutup sebagai "bukan bug" atau ditandai sebagai prioritas rendah.

Mungkin saja kebijakan ini dipikirkan kembali di masa depan. Namun, untuk saat ini, Anda telah diperingatkan.

Namun, seperti yang dapat Anda baca, fakeroot-ngitu sendiri tidak dirancang untuk tujuan ini.

(BTW, saya bertanya-tanya mengapa mereka memilih untuk menggunakan seccomppendekatan berbasis untuk Chromium daripada ptraceberbasis ...)

Dari alat-alat yang tidak disebutkan di atas, saya telah mencatat Geordi untuk diri saya sendiri, karena saya suka bahwa program pengendalian ditulis dalam Haskell.

Alat isolasi berbasis ptrace yang dikenal:

seccomp

Salah satu cara yang diketahui untuk mencapai isolasi adalah melalui pendekatan kotak pasir seccomp yang digunakan di Google Chromium . Tetapi pendekatan ini mengandaikan bahwa Anda menulis pembantu yang akan memproses beberapa (yang diizinkan) dari akses file "dicegat" dan syscall lainnya; dan juga, tentu saja, berusaha untuk "mencegat" syscalls dan mengarahkannya ke helper (mungkin, itu bahkan akan berarti menggantikan syscalls yang disadap dalam kode proses yang dikendalikan; jadi, itu tidak terdengar untuk menjadi cukup sederhana; jika Anda tertarik, Anda sebaiknya membaca detail daripada hanya jawaban saya).

Info terkait lainnya (dari Wikipedia):

(Item terakhir tampaknya menarik jika seseorang mencari seccompsolusi berbasis umum di luar Chromium. Ada juga posting blog yang layak dibaca dari penulis "seccomp-nurse": SECCOMP sebagai solusi Sandboxing?. )

Ilustrasi pendekatan ini dari proyek "perawat perawat" :

                      masukkan deskripsi gambar di sini

Seccomp "fleksibel" mungkin di masa depan Linux?

Dulu muncul pada tahun 2009 juga saran untuk menambal kernel Linux sehingga ada lebih banyak fleksibilitas ke seccompmode - sehingga "banyak akrobat yang saat ini kita butuhkan dapat dihindari". ("Akrobat" mengacu pada komplikasi penulisan pembantu yang harus mengeksekusi banyak syscall yang mungkin tidak bersalah atas nama proses yang dipenjara dan menggantikan syscall yang mungkin tidak bersalah dalam proses dipenjara.) Sebuah artikel LWN menulis tentang hal ini:

Satu saran yang keluar adalah menambahkan "mode" baru ke seccomp. API dirancang dengan gagasan bahwa aplikasi yang berbeda mungkin memiliki persyaratan keamanan yang berbeda; itu termasuk nilai "mode" yang menentukan batasan yang harus diberlakukan. Hanya mode asli yang pernah diterapkan, tetapi yang lain pasti bisa ditambahkan. Membuat mode baru yang memungkinkan proses memulai untuk menentukan panggilan sistem mana yang diizinkan akan membuat fasilitas lebih berguna untuk situasi seperti kotak pasir Chrome.

Adam Langley (juga dari Google) telah memposting tambalan yang melakukan hal itu. Implementasi "mode 2" yang baru menerima bitmask yang menggambarkan panggilan sistem mana yang dapat diakses. Jika salah satunya adalah prctl (), maka kode sandboxed selanjutnya dapat membatasi panggilan sistemnya sendiri (tetapi tidak dapat mengembalikan akses ke panggilan sistem yang telah ditolak). Semua mengatakan, sepertinya solusi yang masuk akal yang bisa membuat hidup lebih mudah bagi pengembang sandbox.

Karena itu, kode ini mungkin tidak pernah digabungkan karena diskusi telah beralih ke kemungkinan lain.

"Seccomp fleksibel" ini akan membawa kemungkinan Linux lebih dekat untuk menyediakan fitur yang diinginkan dalam OS, tanpa perlu menulis pembantu yang rumit.

(Posting blog dengan konten yang pada dasarnya sama dengan jawaban ini: http://geofft.mit.edu/blog/sipb/33 .)

ruang nama ( unshare)

Mengisolasi melalui namespaces ( unsharesolusi berbasis ) - tidak disebutkan di sini - misalnya, mount-point unsharing (dikombinasikan dengan FUSE?) Mungkin bisa menjadi bagian dari solusi yang berfungsi untuk Anda yang ingin membatasi akses sistem file dari proses yang tidak dipercaya.

Lebih banyak tentang ruang nama, sekarang, karena implementasinya telah selesai (teknik isolasi ini juga dikenal di bawah nme "Linux Containers", atau "LXC" , bukan? ..):

"Salah satu tujuan keseluruhan ruang nama adalah untuk mendukung implementasi wadah, alat untuk virtualisasi ringan (serta tujuan lain)" .

Bahkan mungkin untuk membuat namespace pengguna baru, sehingga "suatu proses dapat memiliki ID pengguna tidakrivil normal di luar namespace pengguna sementara pada saat yang sama memiliki ID pengguna 0 di dalam namespace. Ini berarti bahwa proses tersebut memiliki hak root root penuh untuk operasi di dalam namespace pengguna, tetapi tidak terjangkau untuk operasi di luar namespace ".

Untuk perintah kerja nyata untuk melakukan ini, lihat jawabannya di:

dan pemrograman / kompilasi ruang pengguna khusus

Namun, tentu saja, jaminan "jail" yang diinginkan dapat diimplementasikan dengan pemrograman dalam ruang pengguna ( tanpa dukungan tambahan untuk fitur ini dari OS ; mungkin itu sebabnya fitur ini belum dimasukkan di tempat pertama dalam desain OS) ); dengan sedikit banyak komplikasi.

Kotak pasir yang disebutkan ptrace- atau seccompberbasis dapat dilihat sebagai beberapa varian penerapan jaminan dengan menulis pembantu kotak pasir yang akan mengendalikan proses Anda yang lain, yang akan diperlakukan sebagai "kotak hitam", program Unix yang berubah-ubah.

Pendekatan lain bisa menggunakan teknik pemrograman yang dapat peduli tentang efek yang harus dilarang. (Pasti Anda yang menulis program itu; mereka bukan kotak hitam lagi.) Untuk menyebutkan satu, menggunakan bahasa pemrograman murni (yang akan memaksa Anda untuk memprogram tanpa efek samping) seperti Haskell hanya akan membuat semua efek dari program eksplisit, sehingga programmer dapat dengan mudah memastikan tidak akan ada efek yang dilarang.

Saya kira, ada fasilitas sandboxing yang tersedia untuk pemrograman dalam bahasa lain, misalnya, Java.


Beberapa halaman yang mengumpulkan info tentang topik ini juga ditunjukkan dalam jawaban di sana:

imz - Ivan Zakharyaschev
sumber
GoboLinux tanpa akar mungkin juga bisa menjadi pilihan ...
Tobias Kienzler
@tobias Tetapi apakah Rootless Gobolinux memberikan jaminan bahwa program yang ditulis oleh pengguna tidak akan mengakses lingkungan luar? ..
imz - Ivan Zakharyaschev
1
Tidak juga - saya entah bagaimana berada di bawah kesalahpahaman bahwa itu juga akan memungkinkan seseorang untuk menjadi pengguna root "lokal" yang kemudian dapat dengan mudah membuat pengguna virtual untuk proses semacam itu - meskipun mungkin untuk menggunakannya chroot, tetapi itu mungkin masih akan membutuhkan hak akses root yang nyata ...
Tobias Kienzler
8

Ini adalah batasan mendasar dari model izin unix: hanya root yang dapat didelegasikan.

Anda tidak perlu menjadi root untuk menjalankan mesin virtual (tidak berlaku untuk semua teknologi VM), tetapi ini adalah solusi kelas berat.

User-mode Linux adalah solusi virtualisasi Linux-on-Linux yang relatif ringan. Tidak mudah diatur; Anda perlu mengisi partisi root (dalam direktori) dengan setidaknya jumlah minimum yang diperlukan untuk mem-boot (beberapa file /etc, /sbin/initdan dependensinya, program login, shell, dan utilitas).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Saya kira Anda dapat memiliki sedikit keberuntungan dengan LD_PRELOADmencegat akses ke file tertentu, tetapi ini mungkin sangat sulit.

alex
sumber
Kotak pasir seccomp Google Chromium melakukan hal yang lebih andal - syscall interception, secara efektif. - unix.stackexchange.com/questions/6433/…
imz - Ivan Zakharyaschev
Perbedaan antara hanya mencoba mencegat sesuatu dan sanboxing (seperti dalam kasus Chromium) adalah jaminan isolasi.
imz - Ivan Zakharyaschev
1
Intersepsi melalui LD_PRELOADtidak dapat dipercaya (dapat dielakkan), tetapi intersepsi melaluiptrace dapat.
imz - Ivan Zakharyaschev
1
Contoh sederhana disajikan di sini < joey.kitenet.net/blog/entry/fakechroot_warning_label > yang menunjukkan bahwa LD_PRELOADsolusi berbasis tidak dapat dipercaya sebagai langkah keamanan.
imz - Ivan Zakharyaschev
0

Dari daftar lengkap saya hanya akan menambahkan:

  • fakeroot (dari pengelola paket debian): bertujuan membuat paket dengan alat "ramah". Ini bukan isolasi lengkap, tetapi membantu membangun paket dengan pengguna yang berbeda dan perangkat palsu dan file pseudo khusus lainnya.

  • fakechroot (yang menggunakan fakeroot). Program ini memiliki banyak bug. Misalnya, "/ etc / hosts" adalah hardcoded di glibc: Anda tidak dapat mengubahnya melalui alat ini.

  • qemu: Anda perlu mengkompilasi kernel linux, tetapi hasilnya sangat cepat, dan ini adalah mesin "palsu" (yaitu virtual) dengan hak root nyata. Anda dapat membuat dan memasang gambar boot apa saja.

Vouze
sumber
0

Firejail adalah alat yang bagus untuk memenjarakan proses apa pun, dengan atau tanpa akses root dengan banyak opsi dan sangat fleksibel:

Anyone_ph
sumber
2
Sedikit lebih detail tentang cara menggunakan firejail akan diterima. Setelah tautan itu mati, konten informasi jawaban Anda akan turun hanya ke nama utilitas. (termasuk di sini jika tersedia paket distribusi, cara menggunakannya dll).
Anthon