Quyền của người dùng trong và ngoài container LXC?


26

Tôi đang chạy một số dịch vụ bên trong các container Docker LXC trên máy chủ của mình và tôi bắt đầu thực sự làm những việc nghiêm túc với chúng.

Một điều tôi không rõ là làm thế nào quyền của người dùng hoạt động bên trong và bên ngoài container. Ví dụ: nếu tôi đang chạy MySQL trong một thùng chứa và có thư mục dữ liệu được đặt thành /datakhối lượng Docker, thì các quyền bên trong và bên ngoài của container ảnh hưởng đến các chính sách truy cập như thế nào?

Rõ ràng, ý tưởng là chạy MySQL với tư cách là người dùng của chính nó trong vùng chứa (tức là mysql:mysql) và cung cấp cho nó quyền đọc và ghi vào thư mục đó. Tôi giả định rằng điều này sẽ khá đơn giản, chỉ cần chmodnhập thư mục, vv Nhưng làm thế nào để nó hoạt động bên ngoài container? Bây giờ tôi có khối lượng chia sẻ Docker này được gọi là 'dữ liệu', làm cách nào để quản lý kiểm soát truy cập vào nó?

Tôi đặc biệt mong muốn có thể chạy một người dùng không có đặc quyền bên ngoài bộ chứa Docker, định kỳ sẽ truy cập vào khối lượng chia sẻ của MySQL và sao lưu dữ liệu.

Làm cách nào tôi có thể thiết lập quyền, người dùng và nhóm để người dùng cụ thể trên máy chủ có thể đọc / ghi tệp và thư mục trong ổ đĩa chia sẻ Docker?


2
Với userns (nhưng không dockerhỗ trợ cho điều đó, tuy nhiên), container LXC có thể được chạy như một người dùng không có quyền. Nếu không, rootngười dùng bên trong container có thể có khả năng thoát ra nếu container được cấu hình không phù hợp. Tức là roottrên máy chủ là roottrong container trong một container LXC đặc quyền.
0xC0000022L

1
rootNhân tiện, cũng có thể chạy các container không có đặc quyền . Quan trọng là một ánh xạ cho các userns được xác định.
0xC0000022L

Câu trả lời:


21

Kể từ khi phiên bản 0.9 Docker bị hủy LXCvà sử dụng môi trường thực thi riêng của nó , libcontainer. Câu hỏi của bạn hơi cũ nhưng tôi đoán câu trả lời của tôi vẫn áp dụng phiên bản bạn đang sử dụng.

Trả lời nhanh: Để hiểu các quyền của âm lượng, bạn có thể sử dụng phép tương tự mount --bind Host-Dir Container-Dir. Vì vậy, để đáp ứng yêu cầu của bạn, bạn có thể sử dụng bất kỳ phương pháp truyền thống nào để quản lý quyền. Tôi đoán ACL là những gì bạn cần .

Câu trả lời dài: Vì vậy, như trong ví dụ của bạn, chúng ta có một thùng chứa có tên dock với âm lượng /data.

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

Bên trong container, máy chủ MySQL của chúng tôi đã được cấu hình để sử dụng /datalàm thư mục dữ liệu của nó. Vì vậy, chúng tôi có cơ sở dữ liệu của chúng tôi /datatrong container. Và bên ngoài container trên hệ điều hành máy chủ, chúng tôi đã gắn kết này /datakhối lượng từ /usr/container/Databases/và chúng ta gán một người dùng bình thường bob để sao lưu của cơ sở dữ liệu. Từ máy chủ, chúng tôi sẽ cấu hình ACL cho người dùng 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/

Để kiểm tra nó, hãy sao lưu với người dùng bob .

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

Và tar sẽ liệt kê ra và bạn có thể thấy rằng người dùng của chúng tôi có thể truy cập tất cả các tệp.

Bây giờ từ bên trong container nếu bạn kiểm tra với getfaclbạn sẽ nhận thấy rằng thay vì bob nó hiển thị 3000. Điều này là do UID của bob là 3000 và không có người dùng nào trong container nên nó chỉ hiển thị UID mà nó nhận được từ dữ liệu meta . Bây giờ nếu bạn tạo một người dùng trong thùng chứa của mình, useradd -u 3000 bobbạn sẽ nhận thấy rằng bây giờ tên getfaclhiển thị bob thay vì 3000.

Tóm tắt : Vì vậy, quyền người dùng bạn gán từ bên trong hoặc bên ngoài vùng chứa phản ánh cả hai môi trường. Vì vậy, để quản lý quyền của khối lượng, UID trong máy chủ phải khác với UID trong vùng chứa .


Docker cho Ubuntu ít nhất có một tên gói lxc-docker, điều đó có nghĩa là nó không sử dụng LXC? Có phải ở trên vẫn áp dụng trong trường hợp này?
Naftuli Kay

@NaftuliTzviKay ồ, xin lỗi. Sau đó, nó đã được sử dụng LXC (tôi đoán apt-get infocó thể có các chi tiết) bởi vì trong ubfox có một gói khác docker.iomà tôi đã sử dụng. Tôi đã không đi với Ubuntu lâu, vì Docker và RedHat đã bắt tay với nhau. Vì vậy, tốt hơn hết là sử dụng RHEL hoặc CentOS làm HĐH cơ sở, hoặc nếu không, bạn chỉ cần sử dụng LXC.
beginer

Ngay cả trong lxc-dockernày dường như làm việc theo kế hoạch. Tôi đã tạo một người dùng với uid là 3000, chạm vào một tệp trong một ổ đĩa được chia sẻ và có thể thấy từ hệ điều hành máy chủ rằng tệp đó tồn tại và được sở hữu bởi một người dùng có id 3000.
Naftuli Kay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.