Izin pengguna di dalam dan di luar wadah LXC?

26

Saya menjalankan beberapa layanan di dalam wadah Docker LXC di server saya dan saya mulai benar-benar melakukan hal-hal serius dengan mereka.

Satu hal yang saya tidak jelas adalah bagaimana izin pengguna bekerja di dalam dan di luar wadah. Jika, misalnya, saya menjalankan MySQL dalam sebuah wadah dan mengatur direktori datanya /data, yang merupakan volume Docker, bagaimana izin di dalam dan di luar wadah memengaruhi kebijakan akses?

Jelas, idenya adalah untuk menjalankan MySQL sebagai penggunanya sendiri dalam wadah (yaitu mysql:mysql) dan memberikannya hak baca dan tulis ke direktori itu. Saya berasumsi bahwa ini akan cukup mudah, hanya chmoddirektori, dll. Tapi bagaimana cara kerjanya di luar wadah? Sekarang saya memiliki volume yang dibagikan Docker ini yang disebut 'data,' bagaimana cara saya mengatur kontrol akses?

Saya secara khusus ingin dapat menjalankan pengguna yang tidak memiliki hak di luar wadah Docker yang secara berkala akan mengakses volume bersama MySQL dan mencadangkan data.

Bagaimana saya bisa mengatur izin, pengguna, dan grup sehingga pengguna tertentu pada host dapat membaca / menulis file dan folder di volume yang dibagi Docker?

Naftuli Kay
sumber
2
Dengan userns (tetapi belum ada dockerdukungan untuk itu), wadah LXC dapat dijalankan sebagai pengguna yang tidak memiliki hak. Jika tidak, rootpengguna di dalam wadah berpotensi keluar jika wadah tidak dikonfigurasi dengan benar. Yaitu rootpada host rootdi wadah dalam wadah LXC istimewa.
0xC0000022L
1
rootomong-omong, bisa juga menjalankan kontainer yang tidak terjangkau . Penting adalah bahwa pemetaan untuk userns didefinisikan.
0xC0000022L

Jawaban:

21

Sejak rilis 0.9 Docker telah jatuh LXCdan menggunakan lingkungan eksekusi sendiri libcontainer,. Pertanyaan Anda agak tua tapi saya kira jawaban saya masih menggunakan versi yang Anda gunakan.

Jawaban Cepat: Untuk memahami izin volume, Anda dapat mengambil analogi dari mount --bind Host-Dir Container-Dir. Jadi untuk memenuhi kebutuhan Anda, Anda dapat menggunakan metode tradisional apa pun untuk mengelola izin. Saya kira ACL adalah yang Anda butuhkan .

Jawaban Panjang: Jadi seperti pada contoh Anda, kami memiliki wadah bernama dok dengan volume /data.

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

Di dalam wadah, server MySQL kami telah dikonfigurasi untuk menggunakan /datasebagai datanya direktori. Jadi kami memiliki basis data di /datadalam wadah. Dan di luar wadah pada OS Host, kami telah memasang /datavolume ini dari /usr/container/Databases/dan kami menetapkan pengguna bob normal untuk mengambil cadangan dari database. Dari mesin host kami akan mengonfigurasi ACL untuk pengguna 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/

Untuk mengujinya, mari buat cadangan dengan pengguna bob .

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

Dan tar akan keluar dan Anda dapat melihat bahwa pengguna kami dapat mengakses semua file.

Sekarang dari dalam wadah jika Anda memeriksa dengan getfaclAnda akan melihat bahwa bukannya bob itu menunjukkan 3000. Ini karena UID bob adalah 3000 dan tidak ada pengguna seperti itu di wadah sehingga hanya menampilkan UID yang diterimanya dari data meta . Sekarang jika Anda membuat pengguna di wadah useradd -u 3000 bobAnda dengan Anda akan melihat bahwa sekarang getfaclmenunjukkan bob nama bukan 3000.

Ringkasan : Jadi izin pengguna yang Anda tetapkan dari dalam atau luar wadah mencerminkan kedua lingkungan. Jadi untuk mengelola izin volume, UID di mesin host harus berbeda dari UID di wadah .

pemula
sumber
Docker untuk Ubuntu setidaknya memiliki nama paket lxc-docker, apakah itu berarti tidak menggunakan LXC? Apakah hal di atas masih berlaku dalam kasus ini?
Naftuli Kay
@NaftuliTzviKay oh, maaf. Maka harus menggunakan LXC (saya kira apt-get infomungkin memiliki detail) karena di ubuntu ada paket lain docker.ioyang saya gunakan. Saya tidak pergi dengan Ubuntu lama, karena Docker dan RedHat telah bergandengan tangan sekarang. Jadi lebih baik menggunakan RHEL atau CentOS sebagai OS dasar, atau Anda bisa menggunakan LXC.
beginer
Bahkan dalam lxc-dockerhal ini tampaknya bekerja sesuai rencana. Saya membuat pengguna dengan jumlah 3000, menyentuh file dalam volume bersama, dan dapat melihat dari OS host bahwa file tersebut ada dan dimiliki oleh pengguna dengan id 3000.
Naftuli Kay