LXC kaplarının içindeki ve dışındaki kullanıcı izinleri?


26

Sunucumda Docker LXC kapsayıcılarının bazı servislerini çalıştırıyorum ve onlarla gerçekten ciddi şeyler yapmaya başladım.

Anlamadığım bir şey, kullanıcı izinlerinin kabın içinde ve dışında nasıl çalıştığıdır. Örneğin, bir konteynerde MySQL kullanıyorum ve /databir Docker birimi olan veri dizini ayarlanmışsa , konteynerin içindeki ve dışındaki izinler erişim ilkelerini nasıl etkiler?

Açıkçası, fikir MySQL'i kendi kullanıcısı olarak konteynerde (yani mysql:mysql) çalıştırmak ve bu dizine okuma ve yazma hakları vermektir. Bunun sadece chmoddizin vb. İşlerde oldukça basit olacağını varsayıyorum . Fakat bu kabın dışında nasıl çalışıyor ? Artık “veri” adlı Docker paylaşılan birimine sahip olduğum için erişim kontrolünü nasıl yönetirim?

Özellikle , düzenli aralıklarla MySQL paylaşılan birime erişecek ve verileri yedekleyecek Docker kabının dışında ayrıcalıklı bir kullanıcı çalıştırabilmeyi düşünüyorum .

Ana bilgisayardaki belirli bir kullanıcının Docker paylaşılan birimindeki dosyaları ve klasörleri okuyabilmesi / yazabilmesi için izinleri, kullanıcıları ve grupları nasıl ayarlayabilirim?


2
Kullanıcılarla (ancak bunun için destek verilmezdocker ), LXC kabı ayrıcalıklı kullanıcı olarak çalıştırılabilir. Aksi takdirde, rootkabın içindeki kullanıcı uygun bir şekilde yapılandırılmadığında kabın içindeki potansiyel olarak kopabilir. Örneğin root, ana bilgisayar üzerinde, rootayrıcalıklı bir LXC kabında kapsayıcı var.
0xC0000022L

1
rootBu arada, ayrıcalıklı olmayan konteynerleri de çalıştırabilir . Önemli bir haritalama olmasıdır userns tanımlanır.
0xC0000022L

Yanıtlar:


21

0.9 Docker piyasaya sürüldüğü için düştü LXCve kendi uygulama ortamını kullandı libcontainer. Sorunuz biraz eski ama cevabım hala kullandığınız sürümü uygular.

Hızlı Cevap: Birimlerin izinlerini anlamak için, benzerliğini alabilirsiniz mount --bind Host-Dir Container-Dir. Bu nedenle gereksinimlerinizi yerine getirmek için izinleri yönetmek için herhangi bir geleneksel yöntemi kullanabilirsiniz. Sanırım ihtiyacın olan şey ACL .

Uzun Cevap: Yani örnekte olduğu gibi bir kap adında var yuvası bir hacme sahip /data.

docker run -tid --name dock -v /usr/container/Databases/:/data \
    centos:latest /bin/bash

Kabın içinde MySQL sunucumuz /dataveri dizini olarak kullanılacak şekilde yapılandırılmıştır . Böylece veritabanımızın /dataiçinde kabın içinde var. Ve Host OS üzerindeki kabın dışına bu /databirimi monte /usr/container/Databases/ettik ve veritabanlarının yedeğini almak için normal bir kullanıcı bob'u atadık . Ana makinede itibaren kullanıcı için ACL yapılandırırız bob .

useradd -u 3000 bob
usermod -R o=--- /usr/container/Databases/
setfacl -R -m u:bob:rwx /usr/container/Databases/
setfacl -R -d -m u:bob:rwx /usr/container/Databases/

Test etmek için kullanıcı bob ile yedekleme yapalım .

su - bob
tar -cvf container-data.tar /usr/container/Databases/

Ve tar listeleyecek ve kullanıcılarımızın tüm dosyalara erişebildiğini göreceksiniz.

Şimdi konteynırın içinden kontrol getfaclederseniz, bob yerine 3000 olduğunu gösterir. Bu, bob'nin UID'sinin 3000 olduğunu ve kapta böyle bir kullanıcı bulunmadığından, yalnızca meta verilerden aldığı UID'yi görüntüler. . Şimdi, kapsayıcınızda bir kullanıcı oluşturursanız useradd -u 3000 bob, şimdi getfaclbunun 3000 yerine bob adını gösterdiğini fark edeceksiniz .

Özet : Dolayısıyla, kabın içinden veya dışından atadığınız kullanıcı izinleri her iki ortama da yansır. Bu nedenle , birimlerin izinlerini yönetmek için, ana makinedeki UID'ler, kaptaki UID'lerden farklı olmalıdır .


Ubuntu için Docker'ın en azından bir paket adı var lxc-docker, bu LXC kullanmadığı anlamına mı geliyor? Yukarıdakiler hala bu durumda geçerli midir?
Naftuli Kay

@NaftuliTzviKay oh, özür dilerim. Sonra LXC kullanıyor olmalı (sanırım apt-get infoayrıntılara sahip olabilir) çünkü ubuntu'da docker.iokullandığım başka bir paket var. Docker ve RedHat artık elele katıldıklarından, Ubuntu ile uzun süredir gitmedim. Bu nedenle, temel işletim sistemi olarak RHEL veya CentOS ile gitmek daha iyidir, aksi takdirde LXC'yi kullanabilirsiniz.
başlayanlar

lxc-dockerBu bile olsa planlandığı gibi çalışıyor gibi. 3000 kullanıcı kimliğine sahip bir kullanıcı oluşturdum, paylaşılan bir birimdeki bir dosyaya dokundum ve ana bilgisayar işletim sisteminden dosyanın var olduğunu ve kimliği 3000 olan bir kullanıcıya ait olduğunu
görebildim.
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.