Bir kurulum adından önce bir montaj ad alanı girmek chroot
, ana bilgisayar ad alanını ek bağlarla, örneğin /proc
. Sen kullanabilirsiniz chroot
bir bir güzel ve basit bir hack olarak ad monte içeride.
Anlamanın avantajları olduğunu düşünüyorum pivot_root
, ancak biraz öğrenme eğrisi var. Belgeler her şeyi açıklamıyor ... man 8 pivot_root
(shell komutu için) içinde bir kullanım örneği olmasına rağmen . man 2 pivot_root
(sistem çağrısı için) aynısını yaptıysa ve bir örnek C programı içeriyorsa daha net olabilir.
Pivot_root nasıl kullanılır?
Montaj ad alanına girdikten hemen sonra, mount --make-rslave /
ya da eşdeğeri gerekir . Aksi takdirde, tüm mount değişiklikleriniz, orijinal ad alanındaki mountlara yayılır pivot_root
. Bunu istemiyorsun :).
unshare --mount
Komutu kullandıysanız, mount --make-rprivate
varsayılan olarak uygulamak için belgelendiğine dikkat edin . AFAICS bu kötü bir varsayılan değerdir ve bunu üretim kodunda istemezsiniz. Bu noktada, eject
ana bilgisayar ad alanında takılı bir DVD veya USB üzerinde çalışmayı durduracaktır . DVD veya USB özel montaj ağacının içinde takılı kalır ve çekirdek DVD'yi çıkarmanıza izin vermez.
Bunu yaptıktan sonra, örneğin /proc
kullanacağınız dizini bağlayabilirsiniz . Aynı şekilde chroot
.
Kullandığınızda aksine chroot
, pivot_root
yeni kök dosya sistemi bağlama noktası olmasını gerektirir. Zaten biri değilse, sadece bir bağlama monte uygulayarak bu tatmin edebilir: mount --rbind new_root new_root
.
Kullanım pivot_root
- sonra umount
eski kök dosya sistemi, -l
/ MNT_DETACH
seçeneğiyle. ( İhtiyacınız yok umount -R
, bu daha uzun sürebilir. ).
Teknik olarak, pivot_root
genellikle kullanmanın chroot
da kullanmayı içermesi gerekir ; "ya" ya da "değil.
Buna göre man 2 pivot_root
, yalnızca mount ad alanının kökünü değiştirmek olarak tanımlanır. İşlem kökünün işaret ettiği fiziksel dizini değiştirmek için tanımlanmamıştır. Veya geçerli çalışma dizini ( /proc/self/cwd
). Bunu yapar , ancak bu çekirdek ipliklerini işlemek için bir hack'tir. Manpage, bunun gelecekte değişebileceğini söylüyor.
Genellikle bu diziyi istersiniz:
chdir(new_root); // cd new_root
pivot_root(".", put_old); // pivot_root . put_old
chroot("."); // chroot .
Arasında postition chroot
bu sırayla yine bir başka ince bir detayıdır . Her ne kadar bağlantı noktası pivot_root
ad alanını yeniden düzenlemek olsa da , çekirdek kodu, chroot
ayarlanan işlem başına köke bakarak hareket edecek kök dosya sistemini bulur .
Neden pivot_root kullanılır?
Prensip olarak, pivot_root
güvenlik ve izolasyon için kullanmak mantıklıdır . Yetenek temelli güvenlik teorisini düşünmeyi seviyorum . Gerekli belirli kaynakların bir listesini iletirsiniz ve işlem başka hiçbir kaynağa erişemez. Bu durumda, bir mount ad alanına aktarılan dosya sistemlerinden bahsediyoruz. Bu fikir genellikle Linux "ad alanları" özelliği için geçerlidir, ancak muhtemelen çok iyi ifade etmiyorum.
chroot
yalnızca işlem kökünü ayarlar, ancak işlem yine de tam bağlama ad alanını belirtir. Bir işlem gerçekleştirme ayrıcalığını koruyorsa chroot
, dosya sistemi ad alanını geri alabilir. Daha ayrıntılı olarak açıklandığı gibi man 2 chroot
, "süper kullanıcı" ... bir hapishane hapishanesinden "kaçabilir."
Geri alma için başka düşündürücü yolu chroot
olduğunu nsenter --mount=/proc/self/ns/mnt
. Bu belki de ilke için daha güçlü bir argüman. nsenter
/ setns()
zorunlu olarak, işlem adının kök ad alanının kökünden yeniden yüklenmesine rağmen, ikisi farklı fiziksel dizinlere başvurduğunda bunun çalışması bir çekirdek hatası olarak kabul edilebilir. (Teknik not: kökte üst üste monte edilmiş birden fazla dosya sistemi olabilir; setns()
en son monte edilmiş olanı kullanır).
Bu, bir bağlanma ad alanını bir "PID ad alanı" ile birleştirmenin bir avantajını gösterir. Bir PID ad alanının içinde bulunmak, birleştirilmemiş bir işlemin bağlama ad alanına girmenizi önler. Ayrıca, birleştirilmemiş bir işlemin ( /proc/$PID/root
) köküne girmenizi de önler . Ve elbette bir PID ad alanı, bunun dışındaki herhangi bir işlemi öldürmenizi de önler :-).
pivot_root
vechroot
: I Docker kaynaklarına bir göz aldı ve yürütme başarısız olduğu bulunmuşturpivot_root
, bu geri düşerchroot
, yani bu mekanizmalar konteynerleflme amacıyla özelliklerin en azından benzer olduğu kabul edilir.