สิทธิ์ของผู้ใช้ทั้งภายในและภายนอกตู้คอนเทนเนอร์ LXC?


26

ฉันใช้บริการบางอย่างภายใน Docker LXC container บนเซิร์ฟเวอร์ของฉันและฉันเริ่มทำสิ่งที่ร้ายแรงกับพวกเขา

สิ่งหนึ่งที่ฉันไม่ชัดเจนคือการอนุญาตของผู้ใช้ทำงานภายในและภายนอกของคอนเทนเนอร์อย่างไร ตัวอย่างเช่นถ้าฉันใช้ MySQL ในคอนเทนเนอร์และตั้งค่าไดเรกทอรีข้อมูล/dataเป็นไดรฟ์ข้อมูลของนักเทียบท่าการอนุญาตภายในและภายนอกของคอนเทนเนอร์มีผลต่อนโยบายการเข้าถึงอย่างไร

เห็นได้ชัดว่าความคิดคือการใช้ MySQL เป็นผู้ใช้ของตัวเองในภาชนะ (เช่นmysql:mysql) และให้มันอ่านและเขียนสิทธิ์ในไดเรกทอรีนั้น ฉันคิดว่ามันจะตรงไปตรงมาพอเพียงแค่วางไดchmodเร็กตอรี่ ฯลฯ แต่วิธีนี้ทำงานนอกคอนเทนเนอร์ได้อย่างไร ตอนนี้ฉันมีโวลุ่มที่แชร์ที่เรียกว่า 'ข้อมูล' ฉันจะจัดการการควบคุมการเข้าถึงได้อย่างไร

ฉันกำลังมองหาเฉพาะเพื่อให้สามารถเรียกใช้ผู้ใช้ที่ไม่มีสิทธิพิเศษภายนอกคอนเทนเนอร์ Docker ซึ่งจะเข้าถึงปริมาณการแชร์ MySQL และสำรองข้อมูลเป็นระยะ

ฉันจะตั้งค่าการอนุญาตผู้ใช้และกลุ่มเพื่อให้ผู้ใช้เฉพาะบนโฮสต์สามารถอ่าน / เขียนไฟล์และโฟลเดอร์ในไดรฟ์ข้อมูลที่แชร์ของ Docker ได้อย่างไร


2
ด้วยuserns (แต่ยังไม่มีdockerการสนับสนุนสำหรับนั้น) คอนเทนเนอร์ LXC สามารถเรียกใช้ในฐานะผู้ใช้ที่ไม่มีสิทธิได้ ไม่เช่นนั้นrootผู้ใช้ที่อยู่ในคอนเทนเนอร์อาจแตกออกหากกำหนดค่าภาชนะอย่างไม่เหมาะสม Ie rootบนโฮสต์อยู่rootในคอนเทนเนอร์ในคอนเทนเนอร์ LXC ที่มีสิทธิใช้งาน
0xC0000022L

1
rootสามารถโดยวิธีการยังเรียกใช้ภาชนะบรรจุที่ไม่มีสิทธิพิเศษ ที่สำคัญคือการทำแผนที่สำหรับusernsถูกกำหนด
0xC0000022L

คำตอบ:


21

ตั้งแต่การวางจำหน่าย 0.9 Docker ได้ลดลงLXCและใช้สภาพแวดล้อมการดำเนินการของตัวเอง, libcontainer. คำถามของคุณค่อนข้างเก่า แต่ฉันคิดว่าคำตอบของฉันยังคงใช้เวอร์ชันที่คุณใช้อยู่

คำตอบด่วน:เพื่อให้เข้าใจถึงการอนุญาตของโวลุ่มคุณสามารถเปรียบเทียบmount --bind Host-Dir Container-Dirได้ ดังนั้นเพื่อตอบสนองความต้องการของคุณคุณสามารถใช้วิธีการดั้งเดิมสำหรับการจัดการสิทธิ์ ฉันเดา ACL คือสิ่งที่คุณต้องการ

นานคำตอบ:ดังนั้นในตัวอย่างของคุณเรามีภาชนะที่มีชื่อท่าเรือ/dataที่มีปริมาณ

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

ภายในคอนเทนเนอร์เซิร์ฟเวอร์ MySQL ของเราได้รับการกำหนดค่าให้ใช้/dataเป็นไดเรกทอรีข้อมูล ดังนั้นเราจึงมีฐานข้อมูลของเราอยู่/dataด้านในคอนเทนเนอร์ และนอกคอนเทนเนอร์บน Host OS เราได้ติดตั้ง/dataไดรฟ์ข้อมูลนี้จาก/usr/container/Databases/และเรากำหนดbobผู้ใช้ปกติเพื่อสำรองข้อมูลของฐานข้อมูล จากเครื่องโฮสต์เราจะกำหนด ACLs สำหรับผู้ใช้บ๊อบ

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/

การทดสอบออกจะช่วยให้การสำรองข้อมูลที่มีผู้ใช้บ๊อบ

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

และ tar จะแสดงรายการออกมาและคุณจะเห็นว่าผู้ใช้ของเราสามารถเข้าถึงไฟล์ทั้งหมดได้

ตอนนี้จากภายในคอนเทนเนอร์ถ้าคุณตรวจสอบกับgetfaclคุณคุณจะสังเกตเห็นว่าแทนที่จะเป็นbobมันแสดงให้เห็นถึง 3000 เพราะ UID ของ bob คือ 3000 และไม่มีผู้ใช้ดังกล่าวอยู่ในคอนเทนเนอร์ดังนั้นมันจะแสดง UID ที่ได้รับจากข้อมูลเมตา . ตอนนี้ถ้าคุณสร้างผู้ใช้ในภาชนะของคุณด้วยuseradd -u 3000 bobคุณจะสังเกตเห็นว่าตอนนี้getfaclแสดงชื่อบ๊อบแทน 3000

สรุป : ดังนั้นสิทธิ์ผู้ใช้ที่คุณกำหนดจากภายในหรือภายนอกคอนเทนเนอร์จะสะท้อนถึงสภาพแวดล้อมทั้งสอง ดังนั้นในการจัดการสิทธิ์ของปริมาณที่ UIDs ในเครื่องโฮสต์ต้องแตกต่างจาก UIDs ในภาชนะ


อย่างน้อย Docker สำหรับ Ubuntu มีชื่อแพ็กเกจอย่างน้อยlxc-dockerนั่นหมายความว่าไม่ได้ใช้ LXC หรือไม่? กรณีข้างต้นยังคงมีผลบังคับใช้หรือไม่?
Naftuli Kay

@NaftuliTzviKay โอ้ขอโทษ จากนั้นจะต้องใช้ LXC (ฉันเดาว่าapt-get infoอาจมีรายละเอียด) เพราะใน Ubuntu มีแพ็คเกจอื่นdocker.ioที่ฉันใช้ ฉันไม่ได้ไปกับ Ubuntu นานนักเนื่องจาก Docker และ RedHat ร่วมมือกันแล้ว ดังนั้นจะดีกว่าถ้าใช้ RHEL หรือ CentOS เป็นระบบปฏิบัติการพื้นฐานหรืออย่างอื่นคุณสามารถใช้ LXC ได้
beginer

แม้ในlxc-dockerครั้งนี้ดูเหมือนว่าจะทำงานได้ตามแผนที่วางไว้ ฉันสร้างผู้ใช้ที่มี uid จาก 3000 แตะไฟล์ในโวลุ่มที่แชร์และสามารถดูได้จากโฮสต์ระบบปฏิบัติการที่ไฟล์นั้นมีอยู่และเป็นของผู้ใช้ที่มี id 3000
Naftuli Kay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.