Ayrıcalıksız LXC konteyneri nedir?


20

Linux kapsayıcısına (LXC kapsayıcısı) "ayrıcalıksız" adı verilirse ne anlama gelir?

Yanıtlar:


20

Ayrıcalıksız LXC kapları, kullanıcı ad alanlarını ( ) . 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:

  1. alt UIDlerin ve GID'leri bir aralığı (ana kullanıcı tanımlı olduğu usermod [-v|-w|--add-sub-uids|--add-sub-gids])
  2. ... ve bu aralığın kap yapılandırmasında ( lxc.id_map = ...) eşlendiğini

Bu 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, rootvarsayı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):

  1. lxc.id_map = u 0 100000 100000
  2. lxc.id_map = u 0 200000 100000
  3. lxc.id_map = u 0 300000 100000

varsayarak root100000 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.

Sahip olunan ve kök tarafından yönetilen ayrıcalıklı kapsayıcı

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

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

İzinleri ve yapılandırmayı doğru yapma

Bununla kendimle biraz mücadele ettim, bu yüzden buraya bir bölüm ekliyorum.

lxc.includeGenellikle adla /usr/share/lxc/config/$distro.common.conf( $distrodağıtımın adı nerede) geçen yapılandırma snippet'ine ek olarak, /usr/share/lxc/config/$distro.userns.confsisteminizde 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 $lxcguestaş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.


4
İyi cevap - ama lxcbu tür bir şey için bir zorunluluk değildir. util-linuxAracı kullanarak her türlü ad alanı kapsayıcısı oluşturabilirsiniz unshare. Söz konusu kapsayıcıyı util-linuxaracı kullanarak girebilirsiniz nsenter. İ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.
mikeserv

4
@mikeserv: Yani kullanıcılardan yararlanmak için LXC'ye ihtiyacınız yok mu? Bunu biliyordum. Docker'ın artık bu tesislerden yararlanan kendi kütüphanesi olduğunu da biliyorum. Peki, LXC tarafından sunulan tesislerin yardımı olmadan tüm bir sistemi nasıl kaplarsınız? Ve neden yaptın? Tek bir uygulama içerir ve bununla birlikte chrootyardımcı olabilir, ancak LXC tüm sistemi kaplamak için çeşitli ad alanlarını (UTS, mount vb.) Birleştirir .
0xC0000022L

2
Eh ... Dediğim gibi, bunu unsharezaten çeşitli ad alanlarının herhangi biri / hepsi için takdire şayan bir şekilde yapıyor - ve hatta /proctek bir klips anahtarıyla ayrı, özel bir montaj alacak . Sizin ise tek bir uygulama olduğunu initve sizin chrootolduğunu initramfso zaman saniye dairede bir bütün kabı olsun.
mikeserv

0

Çö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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.