ฉันจะใช้นักเทียบท่าโดยไม่มี sudo ได้อย่างไร


767

ในหน้าเอกสารของ Docker คำสั่งตัวอย่างทั้งหมดจะถูกแสดงโดยไม่มีsudoเช่นนี้

docker ps

บน Ubuntu docker.ioไบนารีที่เรียกว่า นอกจากนี้ยังใช้งานไม่ได้หากไม่มี sudo:

sudo docker.io ps

ฉันจะกำหนดค่า Docker ได้อย่างไรโดยที่ฉันไม่จำเป็นต้องใส่ prefix ทุกคำสั่งของ Docker ด้วย sudo


1
อย่าลืมเปิดใช้ ufw;)
Rinzwind

2
บน Ubuntu 14.04 ยังมีไบนารี 'นักเทียบท่า'
Anatoly techtonik

@anatolytechtonik ฉันยังใช้ 'นักเทียบท่า' แทน 'docker.io' ใน Ubuntu 14.04 LTS
Nabin

2
การติดตั้งที่แนะนำไม่ใช่ ตัวเทียบท่าในค่าเริ่มต้น ubuntu repos; ให้ทำตามคำแนะนำที่นี่ ( docs.docker.com/engine/installation/linux/ubuntulinux ) แนะนำให้ใช้ repo dockerแทน ลบสิ่งที่นักเทียบท่าที่มีอยู่ทั้งหมดและตรวจสอบว่าคุณได้รับสิ่งที่มาจากแหล่งที่ถูกต้อง: apt-cache policy docker-engine(URL ที่เหมาะสมควรมาจาก dockerproject.org)
michael

2
แล้วนามแฝงล่ะ: ด้วยวิธีนี้คุณยังคงใช้ sudo พร้อมการป้องกันด้วยรหัสผ่าน alias docker = "sudo
docker

คำตอบ:


1137

ข่าวดี: นักเทียบท่าใหม่ (รุ่น 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 หรือไม่


3
ใช่ แต่ทุกกระบวนการที่ได้รับการยกเว้นจะเปิดโอกาสในการหาประโยชน์ นักเทียบท่ากำลังเชื่อมต่อนั้นลึกเข้าไปในระบบปฏิบัติการเพื่อมอบสิทธิพิเศษในระดับนั้นหรือไม่?
แมตต์

3
newgrp dockerไม่ทำงานสำหรับฉันฉันต้องออกจากระบบ
lolmaus - Andrey Mikhaylov

43
มันคุ้มค่าที่ชี้ให้เห็นว่านี้จะช่วยให้ผู้ใช้ไม่ จำกัด , ที่ไม่ใช่รหัสผ่านเข้าถึงรากที่มีการป้องกัน ดูรายละเอียดของช่องโหว่ได้ที่นี่
Chris Foster

2
คุณไม่จำเป็นต้องรีสตาร์ทดีมอนนักเทียบท่าเพื่อให้การเปลี่ยนแปลงนี้เกิดขึ้น !! เพียงแค่มีผู้ใช้ที่คุณเพิ่งเพิ่มออกจากระบบแล้วกลับเข้ามาอีกครั้ง
Tommy

4
ถ้าคุณใช้docker loginคุณอาจพบว่าโฟลเดอร์ที่สร้างในโฟลเดอร์ที่บ้านของคุณเป็น.docker rootดังนั้นคุณจะพบคำเตือนนี้เมื่อเรียกใช้คำสั่งนักเทียบท่า: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. ฉันทำของผู้ใช้.dockerโฟลเดอร์ที่สามารถเข้าถึงได้โดยไม่ต้อง sudo sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.dockerชอบโดย: chgrpไม่ได้ดูเหมือนจะช่วยแม้ว่าดังนั้นอาจฉันควรจะแนะนำขั้นตอน chown
Birchlabs

202

ในการรันคำสั่งนักเทียบท่าโดยไม่sudoต้องเพิ่มผู้ใช้ของคุณ (ผู้ที่มีสิทธิ์รูท) ไปยังกลุ่มนักเทียบท่า สำหรับการรันคำสั่งต่อไปนี้:

 sudo usermod -aG docker $USER

ตอนนี้มีผู้ใช้ออกจากระบบแล้วเข้าสู่ระบบอีกครั้ง โซลูชันนี้อธิบายได้ดีที่นี่ด้วยกระบวนการติดตั้งที่เหมาะสม


14
หลังจากเพิ่มผู้ใช้ไปยังกลุ่มให้รันคำสั่งนี้: sg group_name -c "bash"
madjardi

4
คุณไม่จำเป็นต้องรีสตาร์ทระบบปฏิบัติการเพื่อให้การเปลี่ยนแปลงนี้เกิดขึ้น! นั่นจะระเบิดตู้คอนเทนเนอร์ที่วิ่งอยู่ทั้งหมด! เพียงแค่มีผู้ใช้ที่คุณเพิ่งเพิ่มออกจากระบบแล้ว
Tommy

5
คำสั่งนั้นแตกต่างจาก "sudo gpasswd -a $ {USER} docker" ในคำตอบอื่นอย่างไร ถ้าเป็นอย่างนั้น ...
แอชลีย์เอตเคน

9
คุณช่วยกรุณาเพิ่มคำเตือนที่กำหนดโดยเอกสาร: "กลุ่มนักเทียบท่า [ ... ] เป็นรากเทียบเท่า" เพื่อให้คนมีโอกาสที่จะคิดเกี่ยวกับมัน
Murmel

2
ผลเช่นเดียวกับคำตอบที่ยอมรับได้มากกว่า 2 ปี แต่ไม่มีคำเตือนเกี่ยวกับความเสี่ยงด้านความปลอดภัย
Gert van den Berg

57

กลไกที่เพิ่มผู้ใช้ไปยังกลุ่มมอบสิทธิ์ในการเรียกนักเทียบท่าคือการได้รับการเข้าถึงซ็อกเก็ตของนักเทียบท่าที่docker /var/run/docker.sockหากระบบไฟล์ที่มี/var/runถูกเมาท์ด้วย ACLs ที่เปิดใช้งานก็สามารถทำได้ผ่าน ACLs

sudo setfacl -m user:$USER:rw /var/run/docker.sock

ฉันแค่รวมสิ่งนี้เพื่อความสมบูรณ์เท่านั้น

โดยทั่วไปฉันขอแนะนำให้หลีกเลี่ยง ACL ทุกครั้งที่มีทางเลือกที่ดีขึ้นอยู่กับกลุ่ม: จะดีกว่าถ้าสามารถเข้าใจถึงสิทธิพิเศษในระบบโดยดูจากการเป็นสมาชิกกลุ่มเท่านั้น ต้องสแกนระบบไฟล์สำหรับรายการ ACL เพื่อให้เข้าใจถึงสิทธิพิเศษของระบบเป็นภาระเพิ่มเติมสำหรับการตรวจสอบความปลอดภัย

คำเตือน 1 : สิ่งนี้มีความrootเท่าเทียมกันเช่นเดียวกับการเพิ่มusernameไปยังdockerกลุ่ม คุณยังสามารถเริ่มต้นคอนเทนเนอร์ในวิธีที่rootเข้าถึงระบบไฟล์โฮสต์ได้

คำเตือน 2 : ACLs มีความยากในการตรวจสอบความปลอดภัยมากกว่าความปลอดภัยแบบกลุ่ม อาจหลีกเลี่ยง ACLs ถ้าเป็นไปได้เมื่อคุณสามารถใช้กลุ่มแทนอย่างน้อยก็ในสภาพแวดล้อมที่เกี่ยวข้องกับการตรวจสอบ


5
มันทำงานใน 16.04
edib

นี่คือสิ่งที่ฉันต้องการคำตอบอื่น ๆ ต้องการให้ผู้ใช้มีสิทธิ์รูท ขอบคุณมาก!
Mrinal Saurabh

1
imo วิธีที่ดีกว่ามาก นักเทียบท่ากลุ่มนั้นเทียบเท่ากับรูทและเป็นสัญญาณอันตรายเสมอ และฉันไม่เห็นข้อเสียเปรียบในการเป็นเจ้าของไฟล์นี้
Xerus

5
@ Xerus ถ้าฉันเข้าใจถูกต้องใครก็ตามที่สามารถเขียนไปยังซ็อกเก็ตนี้จะได้รับสิทธิพิเศษเทียบเท่ารูท ดังนั้นการให้ผู้อื่นเข้าถึงซ็อกเก็ตนี้ผ่าน ACL จึงมีผลกระทบด้านความปลอดภัยเช่นเดียวกับการเพิ่มบุคคลนั้นในกลุ่มนักเทียบท่า
Paŭlo Ebermann

1
ทำงานบน Linux Mint 19 สำหรับฉัน ขอบคุณ
เราคือ Borg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.