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
).