อะไรคือวิธีปฏิบัติที่ดีที่สุดและครอบคลุมในการพิจารณาเมื่อใช้นักเทียบท่าในการผลิต


42

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

รายการตรวจสอบของ Building Block ที่ต้องพิจารณาสำหรับสภาพแวดล้อมการผลิต Docker คืออะไร หนึ่งไม่ต้องการทั้งหมดของพวกเขา แต่ทุกคนควรมีความสำคัญที่จะได้รับการประเมิน

คำเตือน: ฉันรู้ว่ามีนโยบาย SE เพื่อหลีกเลี่ยง "รายการที่ไม่มีที่สิ้นสุดขนาดใหญ่" แต่ฉันคิดว่ารายการตรวจสอบนี้ไม่สามารถใหญ่มาก ... และไม่มีที่สิ้นสุดในตอนนี้

ตึกตึกเหล่านี้คืออะไร?

  1. หากยังไม่ได้ปรับใช้ให้ลองใช้ระบบโฮสต์ Linux ที่มีการตั้งค่าความปลอดภัยขั้นสูง - เคอร์เนลที่มีความแข็ง, SELinux เป็นต้น
  2. ลองใช้ภาพฐานขนาดเล็กของ Docker เช่นอัลไพน์ busybox หรือเริ่มต้นเช่นเริ่มต้นด้วยภาพฐานเปล่า
  3. ใช้การตั้งค่า USER นอกเหนือจากรูท
  4. ประเมินอย่างรอบคอบเพื่อลดชุดของความสามารถเคอร์เนลที่หดตัวไปแล้วให้กับคอนเทนเนอร์
  5. พิจารณามีไบนารีที่ปฏิบัติการได้เพียงหนึ่งรายการต่อคอนเทนเนอร์เพื่อเริ่มกระบวนการของคุณเชื่อมโยงแบบคงที่
  6. ผู้ที่ต้องการทำลายระบบของคุณเพื่อรับสิทธิ์การเข้าถึงเชลล์อาจสงสัยว่าพวกเขาพบว่าคอนเทนเนอร์ของคุณปิดการใช้งานเชลล์หรือไม่
  7. เมานต์โวลุ่มอ่านอย่างเดียวที่ทำได้เท่านั้น

คำถาม: มีอะไรอีกบ้าง?


ฉันพบสิ่งนี้กว้างมาก แต่ในเวลาเดียวกันฉันชอบคำถาม ดังนั้นฉันจะให้ชุมชนตัดสินใจในเรื่องนี้ :)
Dawny33

แท็กdevsecopsหมายถึงอะไร
030

โอเคน่าสนใจ - devsecops.org/blog/2015/2/15/what-is-devsecops
030

คุณช่วยอธิบายได้ไหมว่าทำไมสิ่งนี้ถึงConsider using a tiny Docker base image, like alpine, busybox or even scratch e.g. start with an empty base imageเพิ่มความปลอดภัย
030

3
@ 030 ยิ่งคุณติดตั้งน้อยเท่าไรคุณก็ยิ่งสามารถป้องกันบริการ / ซอฟต์แวร์ที่ไม่จำเป็นที่ไม่ได้รับการดูแลและ / หรือใช้ประโยชน์ไม่ได้ การดึงลงไปจนถึงค่าต่ำสุดที่เปลือยจะทำงานได้ดีขึ้นเนื่องจากภาชนะแต่ละอันควรใช้เพื่อให้บริการเพียงครั้งเดียว / เป้าหมาย
Leon

คำตอบ:


23

โฮสต์ที่คอนเทนเนอร์กำลังทำงาน

รัน bench bench security บนทุกโหนดที่รันคอนเทนเนอร์ docker https://github.com/docker/docker-bench-security

การรันคำสั่งต่อไปนี้บนโหนดที่รันคอนเทนเนอร์ docker:

docker run -it --net host --pid host --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security

ส่งคืนรายการตรวจสอบ:

[INFO] 1 - Host Configuration

[WARN] 1.1  - Ensure a separate partition for containers has been created

[NOTE] 4.2  - Ensure that containers use trusted base images

[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image

อ้างอิงจากที่เก็บ README:

Docker Bench for Security เป็นสคริปต์ที่ตรวจสอบแนวทางปฏิบัติที่ดีที่สุดหลายสิบประการเกี่ยวกับการปรับใช้คอนเทนเนอร์ Docker ในการผลิต การทดสอบจะมีทั้งหมดโดยอัตโนมัติและมีแรงบันดาลใจจากเกณฑ์มาตรฐาน v1.1.0

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

  • ป้องกันซ็อกเก็ตนักภูต daemon โดยใช้ ssl
  • ความไว้วางใจเนื้อหาโดยใช้ทนายความและDOCKER_CONTENT_TRUSTตัวแปร

7

นักเทียบท่ายังอยู่ในการพัฒนา

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

เว้นแต่คุณจะต้องไม่อัปเดตเป็นเวอร์ชันล่าสุด ใช้เวอร์ชันที่ผ่านการทดสอบอย่างดีล่าสุดแทน

นักเทียบท่าไม่ใช่การจำลองเสมือน

หากมีคนหนีออกจากคอนเทนเนอร์ Docker ผู้โจมตีรายนั้นจะอยู่ในเครื่องจริงทันที ไม่มีเกทที่สองเหมือนเวอร์ชวลไลเซชันที่จะป้องกันการฝ่าฝืน

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

นักเทียบท่าไม่มีการป้องกัน

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

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


7

ภาพนักเทียบท่าเอง

ตัวเลือกเพิ่มเติมคือการใช้แคลร์

Clair เป็นโครงการโอเพ่นซอร์สสำหรับการวิเคราะห์แบบคงที่ของช่องโหว่ในคอนเทนเนอร์ของแอปพลิเคชัน (ปัจจุบันรวมถึง appc และ docker)

ในช่วงเวลาปกติ Clair จะนำเมทาดาทาความเสี่ยงด้านช่องโหว่จากชุดแหล่งที่กำหนดค่าไว้และเก็บไว้ในฐานข้อมูล

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

ลูกค้าใช้ Clair API เพื่อสืบค้นฐานข้อมูลเพื่อหาช่องโหว่ของภาพโดยเฉพาะ ช่องโหว่ที่สัมพันธ์กันและฟีเจอร์ทำสำหรับแต่ละคำขอโดยหลีกเลี่ยงความจำเป็นในการสแกนภาพซ้ำ

เมื่อมีการอัปเดตข้อมูลเมตาของช่องโหว่เกิดขึ้นสามารถส่งการแจ้งเตือนไปยังระบบเตือนที่มีการเปลี่ยนแปลงเกิดขึ้น

เป้าหมายของเราคือการเปิดใช้งานมุมมองที่ชัดเจนยิ่งขึ้นเกี่ยวกับความปลอดภัยของโครงสร้างพื้นฐานที่ใช้คอนเทนเนอร์ ดังนั้นโครงการนี้มีชื่อว่าแคลร์หลังจากเทอมภาษาฝรั่งเศสซึ่งแปลว่าชัดเจนสดใสและโปร่งใส


5

นอกเหนือจากคะแนนในหัวข้อนี้ ต่อไปนี้จะเป็นคำแนะนำของฉัน:

  • รับการควบคุมนักเทียบท่า PID1 ด้วย dumb-init
  • ห้ามรันตัวเทียบท่าในการผลิตโดยไม่มีระบบการจัดตู้คอนเทนเนอร์
    • เลือกจาก Kubernetes, Mesos, Swarm และอื่น ๆ
  • ใช้gosuเพื่อควบคุมผู้ใช้ภายในอิมเมจdocker
  • ทำตามกระบวนทัศน์ของแอพ 12 ตัวหากคุณใช้แอพแบบ stateful ในตู้คอนเทนเนอร์ให้เปลี่ยนมัน
    • หากคุณจำเป็นต้องเรียกใช้แอปที่ทำงานไม่ได้จริง (mysql, zookeeper, elasticsearch) ในตู้คอนเทนเนอร์ใช้ประโยชน์จากกระบวนทัศน์ของ orchestrator ที่มีประโยชน์เช่นKubernetes Statefulsets
  • ทำการจัดการความลับ / การกำหนดค่าที่แข็งแกร่งด้วยเครื่องมือเช่น hashicorp vault / consul
  • จัดส่งคอนเทนเนอร์เดียวกันที่สร้างขึ้นโดย devs เพื่อแย่งชิงไปป์ไลน์ CI ที่นำไปใช้ผ่านการจัดเตรียมการทดสอบแบบบูรณาการอย่างละเอียด
  • สร้างการแจ้งเตือนเกี่ยวกับ CVE และแพทช์เรียกใช้งานบิลด์แจ้งเตือน
  • มีการบันทึกที่ครอบคลุมเพื่อรับข้อมูลเชิงลึกเกี่ยวกับคอนเทนเนอร์ที่กำลังทำงานคุณไม่ต้องการให้ devs SSH เข้าถึงโฮสต์หรือคอนเทนเนอร์
    • คำแนะนำ: fluentd
  • มีทั้งเมตริกคอนเทนเนอร์และโฮสต์
    • ข้อเสนอแนะ: โพร + โหนดผู้ส่งออก

2

หากคุณเติมจุดเข้าใช้งานนักเทียบท่าของคุณsedให้พิจารณาแนวทางปฏิบัตินี้:

  • ใช้เครื่องมือเช่นconfdเพื่อจัดการไฟล์กำหนดค่าอิมเมจสำหรับนักเทียบท่าของคุณและอัพเดตให้อยู่เสมอ

Confdจะอ่านข้อมูลจากที่เก็บคีย์ - ค่าที่รองรับจำนวนมากและแสดงเทมเพลตการกำหนดค่าแบบไดนามิก


0

หนึ่งสามารถใช้A2Dเพื่ออบแอปเป็นภาพนักเทียบท่าในขณะที่คำนึงถึงบางสิ่งเช่นไม่ใช่สิทธิ์การอนุญาตตำแหน่งของแอพ:

docker run -v $PWD:/projectName utrecht/a2d:1.0.0 \
       -projectName someProjectName -dockerfile /projectName/Dockerfile

ผลตอบแทน:

FROM golang:1.12.4-alpine as builder
COPY . ./someProjectName/
WORKDIR someProjectName
RUN adduser -D -g '' someProjectName && \
    apk add git && \
    CGO_ENABLED=0 go build && \
    cp someProjectName /someProjectName && \
    chmod 100 /someProjectName

FROM scratch
COPY --from=builder /etc/group /etc/group
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder --chown=someProjectName:someProjectName /someProjectName /usr/local/someProjectName
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
USER someProjectName
ENTRYPOINT ["/usr/local/someProjectName"]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.