Linux kapsayıcısına (LXC kapsayıcısı) "ayrıcalıksız" adı verilirse ne anlama gelir?
Linux kapsayıcısına (LXC kapsayıcısı) "ayrıcalıksız" adı verilirse ne anlama gelir?
Yanıtlar:
Ayrıcalıksız LXC kapları, kullanıcı ad alanlarını ( kullananlar ) kullananlardır . Ana bilgisayardaki bir dizi UID'nin, içinde UID 0 olan bir kullanıcının tekrar var olabileceği bir ad alanına eşlenmesine izin veren bir çekirdek özelliğidir .
Bir süre için ayrıcalıksız LXC kapları hakkındaki ilk algımın aksine, kabın ayrıcalıksız bir ana bilgisayar kullanıcısına ait olması gerektiği anlamına gelmez. Bu sadece bir olasılık.
İlgili:
usermod [-v|-w|--add-sub-uids|--add-sub-gids]
)lxc.id_map = ...
) eşlendiğiniBu nedenle root
, ayrıcalıklı kapsayıcılara bile sahip olabilir, çünkü ana bilgisayardaki kapsayıcı süreçlerinin etkili UID'leri, eşleme tarafından tanımlanan aralığın içine girecektir.
Ancak, root
önce alt kimlikleri tanımlamanız gerekir. Aracılığıyla oluşturulan kullanıcıların aksine adduser
, root
varsayılan olarak tanımlanmış bir dizi bağımlı kimliğe sahip olmaz.
Ayrıca, verdiğiniz tüm aralığın elinizin altında olduğunu unutmayın, bu nedenle aşağıdaki yapılandırma satırlarına sahip 3 kabınız olabilir (yalnızca UID eşlemesi gösterilir):
lxc.id_map = u 0 100000 100000
lxc.id_map = u 0 200000 100000
lxc.id_map = u 0 300000 100000
varsayarak root
100000 ve buldum tüm dokümantasyon konteyner başına 65536 alt kimlikleri, bazı kullanım 100000 kullanmak önerir 400000 arasındaki ast UID'leri sahibi olsa da, daha insani-readbable yapmak.
Başka bir deyişle: Her kapsayıcıya aynı aralığı atamanız gerekmez.
4 milyardan fazla (~ 2^32
) olası alt kimlik ile bu, alt aralıkları ana bilgisayar kullanıcılarınıza dağıtırken cömert olabileceğiniz anlamına gelir.
Tekrar ovalamak için. Ayrıcalıksız bir LXC davetlisinin ana bilgisayarda ayrıcalıksız bir kullanıcı tarafından çalıştırılması gerekmez.
Kapsayıcınızı aşağıdaki gibi bir UID / GID eşlemesi ile yapılandırma:
lxc.id_map = u 0 100000 100000
lxc.id_map = g 0 100000 100000
root
ana bilgisayardaki kullanıcının alt kimlik aralığı verilen sahibi varsa, misafirleri daha da iyi sınırlamanıza olanak tanır.
Ancak, böyle bir senaryoda önemli bir ek avantaj var (ve evet, çalıştığını doğruladım): kapsayıcıyı sistem başlangıcında otomatik olarak başlatabilirsiniz.
Genellikle web'i LXC hakkında bilgi edinmek için araştırırken, ayrıcalıksız bir LXC misafirini otomatik olarak başlatmanın mümkün olmadığı söylenecektir. Ancak, bu yalnızca varsayılan olarak kapsayıcılar için sistem genelinde depoda olmayan kaplar için geçerlidir (genellikle böyle bir şey /var/lib/lxc
). Eğer öyleyse (bu genellikle kök tarafından yaratıldıkları ve kök tarafından başlatıldıkları anlamına gelir), tamamen farklı bir hikaye.
lxc.start.auto = 1
Konteyner yapılandırmanıza koyduktan sonra işi oldukça güzel yapacak.
Bununla kendimle biraz mücadele ettim, bu yüzden buraya bir bölüm ekliyorum.
lxc.include
Genellikle adla /usr/share/lxc/config/$distro.common.conf
( $distro
dağıtımın adı nerede) geçen yapılandırma snippet'ine ek olarak, /usr/share/lxc/config/$distro.userns.conf
sisteminizde de bir olup olmadığını kontrol etmeli ve bunu da eklemelisiniz . Örneğin:
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.include = /usr/share/lxc/config/ubuntu.userns.conf
Ayrıca alt kimlik eşlemelerini ekleyin:
lxc.id_map = u 0 100000 65535
lxc.id_map = g 0 100000 65535
bu, ana bilgisayar UID 100000'in LXC misafirinin kullanıcı ad alanı root
içinde olduğu anlamına gelir .
Şimdi izinlerin doğru olduğundan emin olun. Misafirinizin adı ortam değişkeninde saklanacaksa $lxcguest
aşağıdakileri çalıştırırsınız:
# Directory for the container
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest
chmod ug=rwX,o=rX $(lxc-config lxc.lxcpath)/$lxcguest
# Container config
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest/config
chmod u=rw,go=r $(lxc-config lxc.lxcpath)/$lxcguest/config
# Container rootfs
chown 100000:100000 $(lxc-config lxc.lxcpath)/$lxcguest/rootfs
chmod u=rwX,go=rX $(lxc-config lxc.lxcpath)/$lxcguest/rootfs
Bu, ilk denemeniz izinle ilgili bazı hatalar verdikten sonra kapsayıcıyı çalıştırmanıza izin vermelidir.
chroot
yardımcı olabilir, ancak LXC tüm sistemi kaplamak için çeşitli ad alanlarını (UTS, mount vb.) Birleştirir .
unshare
zaten çeşitli ad alanlarının herhangi biri / hepsi için takdire şayan bir şekilde yapıyor - ve hatta /proc
tek bir klips anahtarıyla ayrı, özel bir montaj alacak . Sizin ise tek bir uygulama olduğunu init
ve sizin chroot
olduğunu initramfs
o zaman saniye dairede bir bütün kabı olsun.
Çözümü benim için iyi çalışan 0xC0000022L üzerinde takip etmek için , LXC kapları içindeki dosyaların düzgün bir şekilde eşlenmesi için gerekli sahiplik değişikliklerini otomatikleştirmek için bir artış- uid-gid.pl perl betiği yazdım .
Onsuz, bu önerilen kurulumla, ana ana bilgisayardaki 0 / root'a ait LXC kapsayıcı kök dosyalarındaki bir dosya, LXC kapsayıcısının kendisinde, 65534 / hiç kimse ile eşlenmez. LXC kapsayıcısındaki 0 / root ile eşlenebilmeleri için, ana bilgisayarda 100000'e ait olmaları gerekir.
Bu, https://yeupou.wordpress.com/2017/06/23/setting-up-lxc-containers-with-mapped-giduid/ adresinde açıklanır ve komut dosyası doğrudan gitlab https://gitlab.com adresinden edinilebilir. /yeupou/stalag13/blob/master/usr/local/bin/increase-uid-gid.pl
lxc
bu tür bir şey için bir zorunluluk değildir.util-linux
Aracı kullanarak her türlü ad alanı kapsayıcısı oluşturabilirsinizunshare
. Söz konusu kapsayıcıyıutil-linux
aracı kullanarak girebilirsiniznsenter
. İkinci araç ayrıca önceden oluşturulmuş bir kapsayıcıya çalışan işlemler eklemenize olanak tanır. Ad alanı desteği çekirdek içinde uygulanır.