GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Mengenalinya Saya Menjalankan Di Chroot?

Saya memiliki instalasi unix yang seharusnya dapat digunakan baik sebagai chroot dan sebagai sistem mandiri. Jika dijalankan sebagai chroot, saya tidak ingin menjalankan layanan apa pun (cron, inetd, dan sebagainya), karena akan bertentangan dengan sistem host atau menjadi berlebihan.

Bagaimana cara menulis skrip shell yang berperilaku berbeda tergantung pada apakah itu berjalan di chroot? Kebutuhan mendesak saya adalah sistem Linux modern, dengan /proc dipasang di chroot, dan skrip berjalan sebagai root, tetapi jawaban yang lebih portabel juga diterima. (Lihat Bagaimana cara mengetahui bahwa saya sedang menjalankan chroot jika /proc tidak di-mount? untuk kasus Linux tanpa /proc .)

Secara umum, saran yang cocok untuk metode penahanan lain akan menarik. Pertanyaan praktisnya adalah, apakah sistem ini seharusnya menjalankan layanan apa pun? (Jawabannya adalah tidak di chroot, dan ya di mesin virtual lengkap; saya tidak tahu tentang kasus perantara seperti jail atau container.)

Jawaban yang Diterima:

Apa yang saya lakukan di sini adalah untuk menguji apakah root dari init proses (PID 1) sama dengan root dari proses saat ini. Meskipun /proc/1/root selalu merupakan tautan ke / (kecuali init itu sendiri di-chroot, tapi itu bukan kasus yang saya pedulikan), mengikutinya mengarah ke direktori root "master". Teknik ini digunakan dalam beberapa skrip pemeliharaan di Debian, misalnya untuk melewatkan memulai udev setelah instalasi di chroot.

if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  echo "We are chrooted!"
else
  echo "Business as usual"
fi

(Omong-omong, ini adalah contoh lain mengapa chroot tidak berguna untuk keamanan jika proses chroot memiliki akses root. Proses non-root tidak dapat membaca /proc/1/root , tetapi mereka dapat mengikuti /proc/1234/root jika ada proses yang berjalan dengan PID 1234 berjalan sebagai pengguna yang sama.)

Jika Anda tidak memiliki izin root, Anda dapat melihat /proc/1/mountinfo dan /proc/$$/mountinfo (didokumentasikan secara singkat di filesystems/proc.txt dalam dokumentasi kernel Linux). File ini dapat dibaca dunia dan berisi banyak informasi tentang setiap titik pemasangan dalam tampilan proses sistem file. Jalur dalam file itu dibatasi oleh chroot yang memengaruhi proses pembaca, jika ada. Jika proses membaca /proc/1/mountinfo di-chroot ke sistem file yang berbeda dari root global (dengan asumsi root pid 1 adalah root global), maka tidak ada entri untuk / muncul di /proc/1/mountinfo . Jika proses membaca /proc/1/mountinfo di-chroot ke direktori pada sistem file root global, lalu entri untuk / muncul di /proc/1/mountinfo , tetapi dengan id pemasangan yang berbeda. Kebetulan, bidang root ($4 ) menunjukkan di mana chroot berada dalam sistem file masternya.

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]

Ini adalah solusi Linux murni. Ini mungkin dapat digeneralisasikan ke varian Unix lainnya dengan /proc . yang cukup mirip (Solaris memiliki /proc/1/root yang serupa , saya rasa, tapi bukan mountinfo ).

Terkait:Bagaimana cara memasang `img` yang dibuat dengan /bin/dd dari hard drive?
Linux
  1. Bagaimana cara membuat daftar sesi layar yang sedang berjalan?

  2. Bagaimana cara mengetahui apakah berjalan di konsol linux versus sesi ssh?

  3. Bagaimana saya tahu apakah saya ada di layar?

  1. Menjalankan notifikasi-kirim sebagai root

  2. Bagaimana saya bisa menentukan disk yang berbeda untuk menjadi root di grub.cfg saat menjalankan grub-mkconfig (dari skrip/noninteraktif)?

  3. Bagaimana cara mengetahui apakah httpd sedang berjalan atau tidak melalui baris perintah?

  1. Bagaimana cara mengetahui batas pengguna mana yang saya hadapi?

  2. Bagaimana Anda mengakses Webmin?

  3. Mengapa menjalankan named(bind) di chroot sangat penting untuk keamanan? Atau mungkin tidak?