ความปลอดภัยสำหรับคอนเทนเนอร์ Docker

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

ความปลอดภัยสำหรับคอนเทนเนอร์ Docker

ฉันขอนำเสนอคำแนะนำเพื่อความปลอดภัยของนักเทียบท่า ยินดีรับคำติชม เนื่องจากนี่เป็นการรวบรวมข้อความที่ตัดตอนมาจากแหล่งข้อมูลต่างๆ มากกว่า และไม่ใช่ทั้งหมดที่ได้รับการตรวจสอบอย่างละเอียด คำแนะนำแบ่งออกเป็นสามประเภท:

  1. มาตรการที่จำเป็นภายในระบบปฏิบัติการโฮสต์เมื่อทำงานกับ Docker
  2. คำแนะนำที่เกี่ยวข้องกับไฟล์การกำหนดค่าบิลด์และการสร้างคอนเทนเนอร์
  3. เครื่องมือรักษาความปลอดภัยที่สามารถรวมเข้ากับคุณสมบัติเฉพาะของ Docker Enterprise


คู่มือนี้อิงจากแหล่งข้อมูลที่หลากหลาย ซึ่งหลายแหล่งมีรายการอยู่ด้านล่างนี้ ไม่ครอบคลุมแต่ครอบคลุมทุกฐาน สามารถดูข้อมูลเพิ่มเติมได้ในคำอธิบายการทดสอบ CIS (ลิงก์ท้ายคู่มือนี้) รวมถึงในเอกสารประกอบของ Docker

เกณฑ์มาตรฐานความปลอดภัยของนักเทียบท่า

Docker Bench เพื่อความปลอดภัย จะตรวจสอบ Docker ของคุณโดยอัตโนมัติกับแนวทางปฏิบัติที่ดีที่สุดทั่วไป สคริปต์นี้เป็นการทดสอบความปลอดภัยแบบฮิวริสติกที่ดี แต่ไม่ควรถือเป็นเครื่องมือวิเคราะห์ที่ครอบคลุม

ระบบปฏิบัติการโฮสต์

แน่นอนว่าคอนเทนเนอร์ Docker ไม่สามารถรักษาความปลอดภัยได้ เว้นแต่ระบบโฮสต์จะปลอดภัย ดังนั้นจึงจำเป็นต้องปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดในการรักษาความปลอดภัยของระบบปฏิบัติการ นอกจากนี้ ควรทำการวิเคราะห์ช่องโหว่เพิ่มเติมจากคำแนะนำต่อไปนี้

กฎการตรวจสอบ

สร้างและใช้กฎการตรวจสอบสำหรับไฟล์ที่เกี่ยวข้องกับ Docker โดยใช้ auditctl- ตัวอย่างเช่น คุณสามารถเพิ่ม -w /usr/bin/dockerd -k docker к /etc/audit.rules และรีสตาร์ทบริการตรวจสอบ

โหมด FIPS

การเปิดใช้งานโหมด FIPS จะบังคับให้เครื่องมือเข้ารหัสลับเปลี่ยนไปใช้อัลกอริธึมที่อยู่ในรายการ FIPS (อเมริกัน มาตรฐานการประมวลผลข้อมูลของรัฐบาลกลาง - ประมาณ แปล.)จึงเป็นไปตามกฎระเบียบและข้อกำหนดของรัฐบาลกลางและอุตสาหกรรม หากระบบปฏิบัติการโฮสต์รองรับโหมด FIPS คุณสามารถเปิดใช้งานได้โดยการรันคำสั่งต่อไปนี้:

sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="fips=1 /g' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg && reboot

คุณต้องเปิดใช้งาน FIPS ใน Docker Engine ด้วย:

mkdir -p /etc/systemd/system/docker.service.d 2>&1; echo -e "[Service]n Environment="DOCKER_FIPS=1"" > /etc/systemd/system/docker.service.d/fips-module.conf; systemctl daemon-reload; systemctl restart docker

สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบ นักเทียบท่า и หมวกสีแดง.

ความลับของนักเทียบท่า

ข้อมูลที่เป็นความลับจะต้องเก็บเป็นความลับ คุณสามารถเริ่มบริการที่เกี่ยวข้องได้โดยใช้คำสั่งสร้างบริการนักเทียบท่า:

docker service create --label com.docker.ucp.access.label=/prod --name nginx --publish 443 --secret source=orcabank_prod_mobile.ca.pem.v1,target=ca.pem nginx

สำหรับรายละเอียด โปรดดู เอกสาร.

ไฟล์คอนฟิกูเรชันนักเทียบท่า

สามารถเพิ่มการตั้งค่าต่อไปนี้ลงในไฟล์กำหนดค่าได้ /etc/docker/daemon.json:

  • "icc":false — ปิดการใช้งานการแลกเปลี่ยนข้อมูลระหว่างคอนเทนเนอร์เพื่อหลีกเลี่ยงการรั่วไหลของข้อมูลที่ไม่จำเป็น
  • log-level: "info" — รวบรวมบันทึกทั้งหมด ยกเว้นบันทึกการแก้ไขข้อบกพร่อง
  • {
      "log-driver": "syslog",
      "log-opts": {
        "syslog-address": "udp://1.2.3.4:1111"
      }
    }

    — เปิดใช้งานการบันทึกระยะไกลและส่งต่อไปยังที่อยู่ที่ระบุ ใช้งานได้เฉพาะในกรณีที่ syslog daemon กำลังทำงานอยู่ TCP และ UDP ได้รับการยอมรับเป็นตัวเลือก นอกจากนี้ยังสามารถเชื่อมต่อสำหรับแต่ละคอนเทนเนอร์เฉพาะได้อีกด้วย เพื่อจุดประสงค์นี้ แฟล็กพิเศษจะถูกตั้งค่าเมื่อเปิดใช้งาน Docker (--log-opt syslog-address=ADDRESS).

  • "userns-remap": "Your_User" — ป้องกันการเพิ่มระดับสิทธิ์โดยการแยกเนมสเปซสำหรับผู้ใช้เฉพาะ

ความปลอดภัยของเลเยอร์การขนส่ง

เฉพาะผู้ใช้ที่มีสิทธิ์เข้าถึงข้อมูลรับรองไคลเอ็นต์ TLS เท่านั้นจึงจะสามารถเชื่อมต่อกับ Docker daemon ได้ (หากจำเป็นต้องมีการเข้าถึงระยะไกล)

ปลั๊กอินการอนุญาต

ตัดสินใจว่าผู้ใช้รายใดได้รับอนุญาตให้ดำเนินการคำสั่งใด และสร้างปลั๊กอินการอนุญาตที่เหมาะสมสำหรับ Docker จากนั้นเริ่ม Docker daemon และเพิ่มปลั๊กอินเข้าไป:

dockerd --authorization-plugin=PLUGIN_ID

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการสร้างปลั๊กอินการอนุญาต โปรดดูที่ เอกสาร.

ตัวเลือกเดมอน

Docker daemon ทำงานด้วยชุดพารามิเตอร์เริ่มต้น

  • --live-restore — พารามิเตอร์นี้ช่วยลดเวลาหยุดทำงานของคอนเทนเนอร์เมื่อระบบถูกปิดหรือรีบูต การแพตช์หรืออัปเดตจะง่ายขึ้นโดยมีเวลาหยุดทำงานน้อยที่สุด
  • --userland-proxy=false — เมื่อมีหรือใช้ Hairpin NAT พร็อกซีในพื้นที่ผู้ใช้จะกลายเป็นบริการสำรอง ซึ่งจะเพิ่มจำนวนเวกเตอร์การโจมตีที่เป็นไปได้เท่านั้น
  • --no-new-privileges - ป้องกันไม่ให้คอนเทนเนอร์ได้รับสิทธิพิเศษเพิ่มเติมโดยใช้ suid หรือ sguid
  • --seccomp-profile /path/to/profile - หากคุณมีโปรไฟล์ seccomp ของคุณเอง คุณสามารถนำไปใช้ได้โดยใช้แฟล็กนี้ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ Seccomp และ Docker ที่นี่.

การกำหนดค่าไฟล์คอนเทนเนอร์และบิลด์

การสร้างผู้ใช้

ตรวจสอบให้แน่ใจว่าผู้ใช้ถูกสร้างขึ้นสำหรับคอนเทนเนอร์และรันภายใต้ผู้ใช้นั้น (อย่าเรียกใช้คอนเทนเนอร์ในฐานะรูท)

การเข้าถึงระยะไกล

ปิดการใช้งานการเข้าถึง daemon จากระยะไกล หากคุณยังคงจำเป็นต้องใช้ ให้ปกป้องด้วยใบรับรอง

แยกเนมสเปซของผู้ใช้

สิ่งสำคัญอย่างยิ่งคือต้องแน่ใจว่าเนมสเปซผู้ใช้ใน Docker ถูกแยกออก เนื่องจากโดยค่าเริ่มต้นจะถูกแชร์กับเนมสเปซของโฮสต์ ในบางกรณี สามารถใช้เพื่อขยายสิทธิ์หรือแม้กระทั่งหลบหนีออกนอกคอนเทนเนอร์ได้ คุณสามารถแยกเนมสเปซผู้ใช้ได้โดยการแก้ไขไฟล์การกำหนดค่า (ตามที่อธิบายไว้ข้างต้นในส่วนไฟล์การกำหนดค่านักเทียบท่า) การกล่าวถึงปัญหานี้เพิ่มเติมที่นี่เนื่องมาจากความสำคัญ

ตรวจสุขภาพ

Healthcheck เป็นเครื่องมืออันทรงพลังที่ช่วยให้คุณสามารถตรวจสอบความสมบูรณ์ของคอนเทนเนอร์ได้ มันถูกกำหนดค่าใน Dockerfile โดยใช้คำแนะนำ HEALTHCHECK- การตรวจสุขภาพช่วยให้คุณมั่นใจได้ว่าคอนเทนเนอร์ทำงานอย่างถูกต้อง ในตัวอย่างด้านล่าง การตรวจสอบสภาพจะคืนค่า 0 หากเซิร์ฟเวอร์กำลังทำงานอยู่ และ 1 หากเซิร์ฟเวอร์ไม่ทำงาน:

HEALTHCHECK CMD curl --fail http://localhost || exit 1

SELinux

ถ้า SELinux รองรับโดยระบบปฏิบัติการโฮสต์ สร้างหรือนำเข้านโยบาย SELinux และเรียกใช้ Docker ในโหมด daemon โดยเปิดใช้งาน SELinux:

docker daemon --selinux-enable

ในกรณีนี้ คุณสามารถเปิดใช้คอนเทนเนอร์ Docker ได้ด้วยการตั้งค่าความปลอดภัย เช่น:

docker run --interactive --tty --security-opt label=level:TopSecret centos /bin/bash

อินเตอร์เฟสเครือข่าย

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

docker run --detach --publish 10.2.3.4:49153:80 nginx

รูปภาพเวอร์ชันแคช

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

สะพานเครือข่าย

โมเดลเครือข่ายเริ่มต้น docker0มีความเสี่ยงที่จะถูกโจมตี เช่น การปลอมแปลง ARP และน้ำท่วม MAC เมื่อต้องการแก้ไขปัญหานี้ ให้สร้างบริดจ์เครือข่ายตามข้อกำหนดเฉพาะของคุณตามที่อธิบายไว้ ที่นี่.

คำเตือนซ็อกเก็ตนักเทียบท่า

ห้ามส่งต่อซ็อกเก็ต Docker ภายในคอนเทนเนอร์ มิฉะนั้นคอนเทนเนอร์จะสามารถดำเนินการคำสั่ง Docker ได้ ดังนั้นจึงสื่อสารกับและควบคุมระบบปฏิบัติการของโฮสต์ อย่าทำอย่างนั้น.

การกำหนดค่านักเทียบท่าองค์กร

นักเทียบท่าเชื่อถือ

Docker Trust ช่วยให้คุณสร้างคีย์ที่สามารถใช้เพื่อตรวจสอบความสมบูรณ์ของการเข้ารหัสของรูปภาพ สามารถใช้คีย์ Docker Trust เพื่อลงนามอิมเมจ Docker ด้วยคีย์ส่วนตัว ซึ่งได้รับการตรวจสอบโดยคีย์สาธารณะบน Notary Server ข้อมูลเพิ่มเติม - ที่นี่- การเปิดใช้งาน Docker Trust ใน Enterprise Engine มีรายละเอียดอยู่ใน เอกสารส่วนนี้.

การสแกนช่องโหว่

Docker Enterprise มีเครื่องสแกนช่องโหว่ในตัวที่ให้คุณดาวน์โหลดฐานข้อมูล CVE สำหรับการสแกนช่องโหว่ในรูปภาพแบบออฟไลน์ การสแกนรูปภาพเป็นประจำช่วยเพิ่มความปลอดภัย: ผู้ใช้จะได้รับคำเตือนเกี่ยวกับช่องโหว่ที่พบทันที สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการดำเนินการดังกล่าว โปรดดูที่ ที่นี่.

บันทึก. แปล: นอกจากนี้ยังมีเครื่องสแกนโอเพ่นซอร์สสำหรับช่องโหว่ในอิมเมจ Docker ซึ่งสามารถดูตัวอย่างได้ที่ส่วนท้ายของเนื้อหา

การบูรณาการ LDAP และ UCP

Universal Control Plane สามารถรวมเข้ากับ LDAP ได้ ผลลัพธ์ที่ได้คือระบบการตรวจสอบความถูกต้องที่เรียบง่ายซึ่งหลีกเลี่ยงการทำซ้ำโดยไม่จำเป็น คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในบทความ ผสานรวมกับไดเร็กทอรี LDAP.

วัสดุอื่นๆ

ข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยของ Docker สามารถดูได้ที่ docs.docker.com- เราขอแนะนำให้ดาวน์โหลดด้วย ศูนย์ทดสอบความปลอดภัยทางอินเทอร์เน็ตสำหรับ Docker.

โบนัสนักแปล

เพื่อเป็นการเพิ่มตรรกะให้กับบทความนี้ เราได้เผยแพร่รายการ 10 ยูทิลิตี้โอเพ่นซอร์สยอดนิยมสำหรับ Docker Security- มันถูกยืมมาจาก บทความอื่น (โดย Bill Doerrfeld จาก Doerrfeld.io)

NB: อ่านเพิ่มเติมเกี่ยวกับหลายโครงการที่กล่าวถึงในบทความ “เครื่องมือรักษาความปลอดภัย 33+ Kubernetes'

  1. Docker Bench เพื่อความปลอดภัย เป็นสคริปต์ที่กล่าวถึงแล้วในตอนต้นของบทความที่จะตรวจสอบคอนเทนเนอร์ Docker ว่าสอดคล้องกับหลักปฏิบัติด้านความปลอดภัยทั่วไปหรือไม่

    ความปลอดภัยสำหรับคอนเทนเนอร์ Docker

  2. ชัดเจน — เป็นยูทิลิตี้ที่ได้รับความนิยมมากที่สุดสำหรับการวิเคราะห์ช่องโหว่แบบคงที่ในคอนเทนเนอร์ มันใช้ฐานข้อมูลช่องโหว่ CVE จำนวนมาก (รวมถึงตัวติดตามช่องโหว่ชั้นนำ) Linux- ระบบปฏิบัติการต่างๆ เช่น Red Hat, Debian, Ubuntu(มี API สำหรับนักพัฒนาและฟังก์ชันการขยายที่ง่าย (โดยการเพิ่ม "ไดรเวอร์") มีการใช้งานในแหล่งรวมอิมเมจคอนเทนเนอร์สาธารณะยอดนิยม (คล้ายกับ Docker Hub) อย่าง Quay.io
  3. ซีเลีย เป็นโซลูชั่นสำหรับการรับรองความปลอดภัยของเครือข่ายในระดับเคอร์เนล โดยใช้เทคโนโลยีการกรองแพ็กเก็ตเครือข่าย BPF
  4. แองเคอเร่ — ยูทิลิตี้สำหรับการวิเคราะห์เนื้อหาของรูปภาพเพื่อดูช่องโหว่ด้านความปลอดภัยตาม CVE นอกจากนี้ยังช่วยให้คุณใช้นโยบายที่กำหนดเอง (ตามข้อมูลต่างๆ รวมถึงรายการขาว/ดำ เนื้อหาไฟล์ ฯลฯ) เพื่อประเมินความปลอดภัยของคอนเทนเนอร์
  5. โต๊ะทำงาน OpenSCAP — ระบบนิเวศทั้งหมดสำหรับการสร้างและรักษานโยบายความปลอดภัยบนแพลตฟอร์มต่างๆ เสนอยูทิลิตี้ในการตรวจสอบภาชนะบรรจุ oscap-docker.
  6. แดกด้า — ยูทิลิตี้สำหรับการสแกนคอนเทนเนอร์ Docker เพื่อหาช่องโหว่ โทรจัน ไวรัส และมัลแวร์ ฐานข้อมูล CVE ประกอบด้วยการตรวจสอบการขึ้นต่อกันจาก OWASP, ฐานข้อมูล Red Hat Oval และพื้นที่เก็บข้อมูล Exploit Database Exploit
  7. ทนายความ เป็นเฟรมเวิร์กสำหรับการลงนามอิมเมจ Docker ซึ่งเดิมสร้างขึ้นที่ Docker Inc (จากนั้นถ่ายโอนเพื่อการพัฒนาไปยัง CNCF) การใช้งานทำให้คุณสามารถมอบหมายบทบาทและกระจายความรับผิดชอบระหว่างคอนเทนเนอร์ รวมถึงตรวจสอบความสมบูรณ์ของการเข้ารหัสของรูปภาพ
  8. กราฟิค — API สำหรับข้อมูลเมตา ออกแบบมาเพื่อจัดการนโยบายความปลอดภัยภายใน ตัวอย่างเช่น ช่วยให้คุณปรับปรุงประสิทธิภาพของเครื่องสแกนความปลอดภัยของคอนเทนเนอร์ได้ Shopify ใช้ API นี้เพื่อจัดการข้อมูลเมตาของรูปภาพจำนวน 500 รูป
  9. ซิสดิก ฟัลโก — ยูทิลิตี้ของ Kubernetes ที่ตรวจสอบพฤติกรรมของระบบ: กิจกรรมในคอนเทนเนอร์ บนโฮสต์ และบนเครือข่าย ช่วยให้คุณสามารถกำหนดค่าการตรวจสอบโครงสร้างพื้นฐานอย่างต่อเนื่อง การตรวจจับความผิดปกติ และการแจ้งเตือนสำหรับการเรียกใช้ระบบใดๆ Linux.
  10. นักสะสมบันยันพส์ - อีกเครื่องมือหนึ่งสำหรับการวิเคราะห์แบบคงที่ของอิมเมจคอนเทนเนอร์ Docker ช่วยให้คุณ “ดู” ไฟล์รูปภาพ รวบรวมข้อมูลที่จำเป็น ใช้นโยบายที่จำเป็น ฯลฯ

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

สำหรับผู้ที่ต้องการเจาะลึกหัวข้อนี้โดยละเอียดยิ่งขึ้น ได้รับการเผยแพร่เมื่อปีที่แล้ว หนังสือ "การรักษาความปลอดภัยนักเทียบท่า: การอ้างอิงด่วน»ชิ้นส่วนที่มีให้ใช้อย่างอิสระ ที่นี่.

สุดท้ายนี้ สำหรับการแนะนำเชิงปฏิบัติเกี่ยวกับแง่มุมบางประการของความปลอดภัยของ Docker ได้แก่ โปรไฟล์ Seccomp และการใช้ความสามารถ (capabilities) Linux-คอร์ในคอนเทนเนอร์ - คุณสามารถตรวจสอบรายละเอียดที่เกี่ยวข้องได้ ทำงานในห้องปฏิบัติการ ทรัพยากรเล่นกับ Docker* - ดูส่วน "ความปลอดภัย"

ความปลอดภัยสำหรับคอนเทนเนอร์ Docker

* เกี่ยวกับแหล่งข้อมูลนี้เองเรา บอก เมื่อสองปีที่แล้วและในเดือนพฤศจิกายน 2018 เรื่องราวที่น่าสนใจมาก (จากมุมมองด้านความปลอดภัย) เกิดขึ้นกับเขา กล่าวโดยย่อคือผู้เชี่ยวชาญจาก CyberArk Software Ltd. จัดการเพื่อแฮ็กมัน: เพื่อให้บรรลุความสามารถในการรันคำสั่งนอกคอนเทนเนอร์เช่น บนระบบโฮสต์ ภาพประกอบที่สมบูรณ์แบบของปัญหาด้านความปลอดภัยใน Docker ใช่ไหม อ่านรายละเอียดทั้งหมดของสิ่งที่เกิดขึ้น ที่นี่.

ปล.จากผู้แปล

อ่านเพิ่มเติมในบล็อกของเรา:

ที่มา: will.com

ซื้อโฮสติ้งที่เชื่อถือได้สำหรับไซต์ที่มีการป้องกัน DDoS เซิร์ฟเวอร์ VPS VDS 🔥 ซื้อบริการเว็บโฮสติ้งที่เชื่อถือได้ พร้อมระบบป้องกัน DDoS และเซิร์ฟเวอร์ VPS/VDS | ProHoster