ข่าวดี: นักเทียบท่าใหม่ (รุ่น 19.03 (ปัจจุบันอยู่ระหว่างการทดลอง)) จะสามารถเรียกใช้ rootless negating ปัญหาที่อาจเกิดขึ้นได้โดยใช้ผู้ใช้รูท ไม่ยุ่งกับการยกระดับสิทธิ์รูทและสิ่งใด ๆ ที่อาจเปิดเครื่องของคุณเมื่อคุณไม่ต้องการ
วิดีโอเกี่ยวกับเรื่องนี้จาก[DockerCon 2019] Hardening Docker daemon ด้วยโหมด Rootless
Caveats สองสามตัวไปที่โหมดนักเทียบท่ารูท
วิศวกรของนักเทียบท่ากล่าวว่าโหมดรูทเลสนั้นไม่สามารถนำมาใช้แทนคุณสมบัติที่สมบูรณ์ของฟีเจอร์เอนจิ้นของ Docker ข้อ จำกัด บางประการสำหรับโหมดรูตรวมถึง:
- การควบคุมทรัพยากร cgroups, โปรไฟล์ความปลอดภัยของ apparmor, จุดตรวจสอบ / คืนค่า, เครือข่ายแบบโอเวอร์เลย์และอื่น ๆ ไม่ทำงานในโหมดรูท
- การเปิดเผยพอร์ตจากตู้คอนเทนเนอร์ในปัจจุบันต้องการกระบวนการช่วยเหลือด้วยตนเอง
- เฉพาะ distros ที่ใช้ Ubuntu เท่านั้นที่รองรับระบบไฟล์ซ้อนทับในโหมดรูท
- ขณะนี้โหมดรูทนั้นมีไว้สำหรับการสร้างในตอนกลางคืนเท่านั้นซึ่งอาจไม่เสถียรเท่าที่คุณคุ้นเคย
ในฐานะนักเทียบท่า 19.3 สิ่งนี้ล้าสมัย (และอันตรายกว่าที่ต้องการ):
คู่มือนักเทียบท่ามีนี้จะพูดเกี่ยวกับมัน
ให้การเข้าถึงที่ไม่ใช่รูท
docker daemon จะรันในฐานะผู้ใช้รูทเสมอและตั้งแต่ Docker เวอร์ชัน 0.5.2 แล้ว docker daemon จะผูกกับซ็อกเก็ต Unix แทนที่จะเป็นพอร์ต TCP โดยค่าเริ่มต้นแล้วซ็อกเก็ต Unix จะเป็นเจ้าของโดยผู้ใช้รูทและตามค่าเริ่มต้นคุณสามารถเข้าถึงได้ด้วย sudo
การเริ่มต้นในเวอร์ชั่น 0.5.3 ถ้าคุณ (หรือตัวติดตั้ง Docker) สร้างกลุ่ม Unix ชื่อนักเทียบท่าและเพิ่มผู้ใช้เข้ากับมันแล้ว docker daemon จะทำให้ความเป็นเจ้าของซ็อกเก็ต Unix อ่าน / เขียนได้โดยกลุ่มนักเทียบท่าเมื่อ daemon เริ่ม . นักเทียบท่า daemon จะต้องเรียกใช้ในฐานะผู้ใช้รูทเสมอ แต่ถ้าคุณเรียกใช้ไคลเอ็นต์นักเทียบท่าในฐานะผู้ใช้ในกลุ่มนักเทียบท่าคุณไม่จำเป็นต้องเพิ่ม sudo ลงในคำสั่งไคลเอนต์ทั้งหมด ตั้งแต่ 0.9.0 คุณสามารถระบุได้ว่ากลุ่มอื่นที่ไม่ใช่นักเทียบท่าควรเป็นเจ้าของซ็อกเก็ต Unix พร้อมกับตัวเลือก -G
คำเตือน: กลุ่มนักเทียบท่า (หรือกลุ่มที่ระบุด้วย -G) นั้นเทียบเท่ากับรูท; ดูรายละเอียด Docker Daemon Attack Surfaceและบล็อกนี้บนทำไมเราไม่อนุญาตให้ผู้ใช้ที่ไม่ใช่รูทเรียกใช้ Docker ใน CentOS, Fedora หรือ RHEL (ขอบคุณ michael-n)
ในรุ่นล่าสุดของโหมดรูทแบบทดลองบน GitHubวิศวกรกล่าวถึงโหมดรูทแบบไม่อนุญาตให้รัน dockerd ในฐานะผู้ใช้ที่ไม่มีสิทธิใช้ user_namespaces (7), mount_namespaces (7), network_namespaces (7)
ผู้ใช้จำเป็นต้องเรียกใช้ dockerd-rootless.sh แทน dockerd
$ dockerd-rootless.sh --experimental
เนื่องจากโหมด Rootless กำลังทดลองผู้ใช้จำเป็นต้องเรียกใช้ dockerd-rootless.sh ด้วย –experimental
สิ่งสำคัญที่ต้องอ่าน: ขั้นตอนหลังการติดตั้งสำหรับ Linux (นอกจากนี้ยังเชื่อมโยงไปยังDocker Daemon Attack Surface Details )
จัดการ Docker ในฐานะผู้ใช้ที่ไม่ใช่รูท
นักเทียบท่า daemon ผูกกับซ็อกเก็ต Unix แทนพอร์ต TCP โดยค่าเริ่มต้นแล้วซ็อกเก็ต Unix จะเป็นเจ้าของโดยผู้ใช้รูทและผู้ใช้รายอื่นสามารถเข้าถึงได้โดยใช้ sudo นักเทียบท่า daemon จะทำงานในฐานะผู้ใช้รูทเสมอ
หากคุณไม่ต้องการใช้ sudo เมื่อคุณใช้คำสั่งนักเทียบท่าให้สร้างกลุ่ม Unix ชื่อนักเทียบท่าและเพิ่มผู้ใช้ เมื่อ docker daemon เริ่มขึ้นมันจะทำให้ความเป็นเจ้าของซ็อกเก็ต Unix อ่าน / เขียนได้โดยกลุ่มนักเทียบท่า
เพิ่มกลุ่มนักเทียบท่าหากยังไม่มี:
sudo groupadd docker
เพิ่มผู้ใช้ที่เชื่อมต่อ "$ USER" เข้ากับกลุ่มนักเทียบท่า เปลี่ยนชื่อผู้ใช้เพื่อให้ตรงกับผู้ใช้ที่คุณต้องการหากคุณไม่ต้องการใช้ผู้ใช้ปัจจุบันของคุณ:
sudo gpasswd -a $USER docker
ทำnewgrp docker
หรือออกจากระบบ / เพื่อเปิดใช้งานการเปลี่ยนแปลงในกลุ่ม
คุณสามารถใช้ได้
docker run hello-world
เพื่อตรวจสอบว่าคุณสามารถรันนักเทียบท่าโดยไม่ใช้ sudo หรือไม่