Apakah mungkin menjalankan skrip bash di semacam kotak pasir?

13

Produk kami memiliki kebutuhan untuk menjalankan skrip bash yang tidak dikenal pada server yang rumit untuk mencapai tujuan tertentu. Skrip bash ini disediakan oleh pengguna. Kami tertarik untuk memastikan bahwa hanya perintah khusus yang diizinkan, dan yang lainnya tidak. Selanjutnya, kita perlu mengganti beberapa perintah dengan yang lain.

Jadi, misalnya, kami ingin menjalankan skrip dan mengizinkan perintah berikut: echo cat awk

Tetapi tidak mengizinkan perintah lain (kami tidak ingin menyediakan daftar spesifik di sini).

Selanjutnya, jika skrip berisi perintah cp kami ingin menangkapnya dan mengalihkan ke perintah yang berbeda (yang dapat dilakukan dengan menggunakan alias).

Adakah yang tahu bagaimana hal ini dilakukan?

Yon
sumber

Jawaban:

9

Cara termudah adalah dengan menggunakan chroot jail yang hanya berisi perintah yang Anda inginkan agar skrip dapat dijalankan. Anda kemudian menjalankan skrip melalui pembungkus yang memanggil chrootke direktori dan kemudian mengeksekusi skrip.

Ignacio Vazquez-Abrams
sumber
17

Tidak ada kekurangan 100% untuk menjalankan skrip di dalam mesin virtual, yang mungkin akan mencegah skrip mencapai tujuannya. Tetapi ada dua fitur yang dapat membantu Anda. Jika Anda khawatir skrip ditulis oleh orang jahat, fitur-fitur ini tidak cukup; tetapi jika Anda hanya khawatir bahwa skrip dapat melakukan hal-hal buruk pada sistem Anda karena itu ditulis oleh programmer yang ceroboh atau dengan tujuan yang berbeda dalam pikiran, salah satu dari kedua fitur ini menyediakan lingkungan sandboxing yang layak.

  • Anda dapat menjalankan shell yang dibatasi dengan menjalankan bash as bash -r. Saya merujuk Anda ke manual bash untuk deskripsi terperinci; ide dasarnya adalah bahwa skrip tidak dapat menjalankan perintah yang tidak ada $PATH, tidak dapat berubah $PATH, tidak dapat mengalihkan ke atau dari file, dan beberapa batasan lagi. Ini cukup mudah untuk diatur, tetapi jika skrip yang tidak dikenal terlalu rumit untuk Anda tinjau, kemungkinan akan menggunakan banyak hal yang dilarang dalam shell terbatas.

  • Anda dapat mengatur jail chroot . Idenya adalah untuk mengatur pohon direktori /some/rootdan menjalankan skrip di lingkungan yang percaya bahwa itu /some/rootadalah keseluruhan sistem file ( chrootkependekan dari root perubahan). Setelah pohon direktori diatur, jalankan skrip (disalin ke /some/root/myscript) sebagai chroot /some/root /bin/bash /myscript. Misalnya, Anda akan mengatur direktori /some/root/bindengan perintah yang ingin Anda izinkan, dan program chroot akan melihat direktori ini sebagai /bin. Anda harus menyalin semua yang diperlukan untuk menjalankan program di dalam chroot: pustaka, file data bash,, skrip itu sendiri, dll. Skrip mungkin perlu /procdipasang di dalam chroot; Anda dapat melakukan ini dengan perintah seperti mount -t proc proc /proc.

    Jika Anda perlu membuat seluruh pohon direktori tersedia untuk skrip, katakanlah /var/example, Anda memiliki beberapa pilihan. Anda dapat membuat salinan di bawah /some/root. Anda bisa membuat tautan keras (jika itu berfungsi untuk aplikasi Anda dan chroot ada di sistem file yang sama). Di Linux, Anda bisa melakukan mount --bind /var/example /some/root/var/example"graft" /var/exampledi dalam chroot. Perhatikan bahwa tautan simbolis tidak dapat berfungsi karena target tautan ditentukan di dalam chroot.

    Perhatikan bahwa chroot tidak memberikan keamanan absolut, terutama terhadap proses yang berjalan sebagai root. Misalnya, proses root dapat membuat file perangkat di dalam chroot dan mengakses seluruh disk melalui itu. Proses chroot masih dapat membuat koneksi jaringan (Anda dapat melarang ini dengan tidak memasukkan program jaringan apa pun di dalam chroot dan memastikan bahwa program yang tidak dipercaya tidak dapat membuat file dan membuatnya dapat dieksekusi atau menimpa yang dapat dieksekusi).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Anda harus menyalin semua yang diperlukan , bisakah saya membuat tautan simbolis atau keras daripada menyalin?
kyb
1
@kyb Hard link: ya. Tautan simbolis: tidak, tautan simbolis hanya dapat mengarah ke file yang dapat Anda lihat, tidak memungkinkan Anda keluar dari chroot. Tautan keras sulit digunakan untuk ini dan berantakan: mereka putus jika Anda mengganti file, mereka mengekspos salinan asli kalau-kalau itu bisa ditulisi di dalam chroot. Jika Anda ingin membuat seluruh pohon tersedia, salin atau lakukan bind mount read-only.
Gilles 'SO- stop being evil'
Saya perlu membuat perintah umum yang tersedia seperti grep, awk, units, dll Apakah saya perlu menyalin setiap file bin dan semua dependancies manual atau ada beberapa hack berguna untuk memberitahu secara eksplisit apa util harus bekerja di chroot?
kyb