GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Melakukan Chroot Dengan Ruang Nama Linux?

Setelah membaca tentang ruang nama Linux, saya mendapat kesan bahwa mereka, di antara banyak fitur lainnya, merupakan alternatif untuk chroot. Misalnya, dalam artikel ini:

Kegunaan lain [dari ruang nama] termasuk […] isolasi gaya chroot() dari suatu proses ke bagian dari hierarki direktori tunggal.

Namun, ketika saya mengkloning mount namespace, misalnya dengan perintah berikut, saya masih melihat seluruh pohon akar asli.

unshare --mount -- /bin/bash

Saya mengerti bahwa saya sekarang dapat melakukan pemasangan tambahan di namespace baru yang tidak dibagikan dengan namespace asli dan dengan demikian ini memberikan isolasi, tetapi masih root yang sama, mis. /etc masih sama untuk kedua namespace. Apakah saya masih memerlukan chroot untuk mengubah root atau apakah ada alternatif?

Saya berharap pertanyaan ini akan memberikan jawaban, tetapi jawabannya hanya menggunakan chroot , lagi.

EDIT #1

Ada komentar yang sekarang dihapus yang menyebutkan pivot_root . Karena ini sebenarnya adalah bagian dari linux/fs/namespace.c , itu sebenarnya bagian dari implementasi namespaces. Ini menunjukkan bahwa mengubah direktori root hanya dengan unshare dan mount tidak mungkin, tetapi ruang nama menyediakan versi chroot sendiri – lebih pintar – . Masih saya tidak mendapatkan ide utama dari pendekatan ini yang membuatnya berbeda secara fundamental dari chroot , bahkan setelah membaca kode sumber (dalam arti misalnya keamanan atau isolasi yang lebih baik).

EDIT #2

Ini bukan duplikat dari pertanyaan ini. Setelah menjalankan semua perintah dari jawaban, saya memiliki /tmp/tmp.vyM9IwnKuY (atau serupa), tetapi direktori root masih sama!

Jawaban yang Diterima:

Memasukkan mount namespace sebelum menyiapkan chroot , memungkinkan Anda menghindari kekacauan namespace host dengan mount tambahan, mis. untuk /proc . Anda dapat menggunakan chroot di dalam mount namespace sebagai peretasan yang bagus dan sederhana.

Saya pikir ada keuntungan untuk memahami pivot_root , tetapi memiliki sedikit kurva belajar. Dokumentasi tidak menjelaskan semuanya… meskipun ada contoh penggunaan di man 8 pivot_root (untuk perintah shell). man 2 pivot_root (untuk panggilan sistem) mungkin lebih jelas jika melakukan hal yang sama, dan menyertakan contoh program C.

Cara menggunakan pivot_root

Segera setelah memasuki mount namespace, Anda juga perlu mount --make-rslave / atau setara. Jika tidak, semua perubahan mount Anda menyebar ke mount di namespace asli, termasuk pivot_root . Anda tidak menginginkan itu :).

Jika Anda menggunakan unshare --mount perintah, perhatikan itu didokumentasikan untuk menerapkan mount --make-rprivate secara default. AFAICS ini adalah default yang buruk dan Anda tidak menginginkan ini dalam kode produksi. Misalnya. pada titik ini, itu akan menghentikan eject dari bekerja pada DVD atau USB yang terpasang di ruang nama host. DVD atau USB akan tetap terpasang di dalam pohon pemasangan pribadi, dan kernel tidak akan membiarkan Anda mengeluarkan DVD.

Setelah Anda selesai melakukannya, Anda dapat memasang mis. /proc direktori yang akan Anda gunakan. Cara yang sama Anda lakukan untuk chroot .

Tidak seperti saat Anda menggunakan chroot , pivot_root mengharuskan sistem file root baru Anda adalah titik mount. Jika belum, Anda dapat memenuhinya hanya dengan menerapkan pengikatan pengikatan:mount --rbind new_root new_root .

Gunakan pivot_root – lalu umount sistem file root lama, dengan -l / MNT_DETACH pilihan. (Anda tidak perlu umount -R , yang bisa memakan waktu lebih lama.).

Terkait:AT+CSQ tanpa Memutuskan Koneksi PPP di ARCH Linux?

Secara teknis, menggunakan pivot_root umumnya perlu melibatkan penggunaan chroot demikian juga; ini bukan “salah satu atau dua”.

Sesuai man 2 pivot_root , itu hanya didefinisikan sebagai menukar root dari mount namespace. Tidak ditentukan untuk mengubah direktori fisik mana yang ditunjuk oleh root proses. Atau direktori kerja saat ini (/proc/self/cwd ). Kebetulan ya melakukannya, tetapi ini adalah peretasan untuk menangani utas kernel. Halaman manual mengatakan itu bisa berubah di masa depan.

Biasanya Anda menginginkan urutan ini:

chdir(new_root);            // cd new_root
pivot_root(".", put_old);   // pivot_root . put_old
chroot(".");                // chroot .

Posisi chroot dalam urutan ini adalah detail halus lainnya. Meskipun intinya pivot_root adalah untuk mengatur ulang mount namespace, kode kernel tampaknya menemukan sistem file root untuk dipindahkan dengan melihat root per-proses, yang merupakan chroot set.

Mengapa menggunakan pivot_root

Pada prinsipnya, masuk akal untuk menggunakan pivot_root untuk keamanan dan isolasi. Saya suka berpikir tentang teori keamanan berbasis kemampuan. Anda memasukkan daftar sumber daya tertentu yang diperlukan, dan proses tidak dapat mengakses sumber daya lain. Dalam hal ini kita berbicara tentang sistem file yang diteruskan ke namespace mount. Ide ini berlaku secara umum untuk fitur "ruang nama" Linux, meskipun saya mungkin tidak mengungkapkannya dengan baik.

chroot hanya menyetel root proses, tetapi prosesnya masih mengacu pada namespace mount penuh. Jika suatu proses mempertahankan hak istimewa untuk melakukan chroot , kemudian dapat melintasi kembali ruang nama sistem file. Seperti yang dijelaskan dalam man 2 chroot , “pengguna super dapat melarikan diri dari ‘penjara chroot’ dengan…”.

Cara lain yang menggugah pikiran untuk membatalkan chroot adalah nsenter --mount=/proc/self/ns/mnt . Ini mungkin argumen yang lebih kuat untuk prinsip tersebut. nsenter / setns() perlu memuat ulang akar proses, dari akar mount namespace… meskipun fakta bahwa ini berfungsi ketika keduanya merujuk ke direktori fisik yang berbeda, mungkin dianggap sebagai bug kernel. (Catatan teknis:mungkin ada beberapa sistem file yang dipasang di atas satu sama lain di root; setns() menggunakan yang paling atas, yang paling baru dipasang).

Ini menggambarkan satu keuntungan dari menggabungkan namespace mount dengan "namespace PID". Berada di dalam namespace PID akan mencegah Anda memasuki mount namespace dari proses yang tidak dibatasi. Ini juga mencegah Anda memasuki root dari proses yang tidak dibatasi (/proc/$PID/root ). Dan tentu saja namespace PID juga mencegah Anda mematikan proses apa pun yang berada di luarnya :-).


Linux
  1. Cara Memasang Windows Share Jarak Jauh di Linux

  2. Bagaimana cara memasang perangkat di Linux?

  3. Bagaimana cara memeriksa kata sandi dengan Linux?

  1. Bagaimana saya menggunakan Vagrant dengan libvirt

  2. Cara mengenkripsi file dengan gocryptfs di Linux

  3. Cara mengatur jail chroot Linux

  1. Linux – Bagaimana Cara Memasang Sistem File Jarak Jauh Dengan Menentukan Nomor Port?

  2. Cara memasang file iso di Linux

  3. Bagaimana cara memasang file ISO di Linux?