เครื่องมือสำหรับนักพัฒนา · Docker เรียกใช้ตัวแปลงการเขียน Docker
การรันคอนเทนเนอร์ในฐานะรูท: อะไร --user และผู้ใช้: เปลี่ยนแปลงและทำไม
· เหตุใดจึงสำคัญ
docker ตู้คอนเทนเนอร์ ความปลอดภัย
กระบวนการในคอนเทนเนอร์ของคุณถือเป็นราก เว้นแต่รูปภาพจะระบุไว้เป็นอย่างอื่น โพสต์นี้จะอธิบายความหมายของโฮสต์ วิธีที่ --user และผู้ใช้ Compose: เปลี่ยนแปลงคีย์ และปัญหาการเป็นเจ้าของไฟล์ที่ตามมา
ไฟล์ที่คุณไม่สามารถลบได้ — การเมานต์การผูกจะเต็มไปด้วยไฟล์ที่เป็นของรูทหลังจากรันคอนเทนเนอร์หนึ่งครั้ง
ไฟล์ที่คุณไม่สามารถลบได้ — การเมานต์การผูกจะเต็มไปด้วยไฟล์ที่เป็นของรูทหลังจากรันคอนเทนเนอร์หนึ่งครั้ง หลักฐาน: เอาต์พุตที่ผูกไว้สามารถเปิดเผยตัวตนที่ไม่ตรงกันที่แยกวิเคราะห์ไม่สามารถวินิจฉัยได้ สร้างเอกลักษณ์รันไทม์ด้วยตัวอักษรแบบใช้แล้วทิ้ง จับคู่แหล่งที่มาแต่ละรายการกับความสามารถในการเมานต์ของผู้ใช้ สงวนเนมสเปซและความเป็นเจ้าของสำหรับการตรวจสอบปลายทาง
เหตุการณ์ด้านความปลอดภัยยังเผยให้เห็นว่า ขอบเขตเหตุการณ์ด้านความปลอดภัยที่แยกจากกันคืออิมเมจ USER และสวิตช์จุดเข้าใช้งานจำเป็นต้องมีการตรวจสอบหรือแหล่งที่มาของรูปภาพ หลักฐาน: รูปภาพ USER และสวิตช์จุดเข้าจำเป็นต้องมีการตรวจสอบหรือแหล่งที่มาของรูปภาพ ข้อจำกัดเอกลักษณ์รันไทม์นี้เป็นจุดหยุด ตรวจสอบความสามารถในการเมานต์ของผู้ใช้โดยไม่มีพฤติกรรมการผลิต จากนั้นจัดทำเอกสารการตรวจสอบโฮสต์สำหรับเนมสเปซและความเป็นเจ้าของ
รูทภายในคือรูทภายนอก - ด้วยการตั้งค่าเนมสเปซผู้ใช้เริ่มต้น UID 0 ในคอนเทนเนอร์คือ UID 0 บนโฮสต์สำหรับไฟล์ที่เมาท์
รูทภายในคือรูทภายนอก - ด้วยการตั้งค่าเนมสเปซผู้ใช้เริ่มต้น UID 0 ในคอนเทนเนอร์คือ UID 0 บนโฮสต์สำหรับไฟล์ที่เมาท์ หลักฐาน: UID เอฟเฟกต์โฮสต์เป็นศูนย์ขึ้นอยู่กับการกำหนดค่าเนมสเปซที่ไม่ได้อ่านที่นี่ ติดตามโทเค็นข้อมูลประจำตัวรันไทม์ไปยังความสามารถในการเมานต์ของผู้ใช้ แยกค่าที่เรียงลำดับออกจากฟิลด์ค่าสุดท้าย เนมสเปซและความเป็นเจ้าของอยู่นอกคอลเลกชัน
ขอบเขตกลไกความปลอดภัยที่เกี่ยวข้องคือ ขอบเขตไวยากรณ์ความปลอดภัยที่แยกต่างหากคือ 1000:1000 ตัวอย่างแสดงให้เห็นถึงการเก็บรักษา ไม่ใช่การรับประกันความเป็นเจ้าของ หลักฐาน: ตัวอย่าง 1000:1000 แสดงให้เห็นถึงการเก็บรักษา ไม่ใช่การรับประกันความเป็นเจ้าของ ใช้ข้อมูลประจำตัวรันไทม์นี้เพื่อคาดการณ์สมาชิกหนึ่งรายหรือสเกลาร์ในความสามารถในการต่อเชื่อมผู้ใช้ ตรวจสอบคำเตือนก่อนตัดสินใจอะไรเกี่ยวกับเนมสเปซและความเป็นเจ้าของ
--user กลายเป็นผู้ใช้: — ตัวเลข UID:GID เทียบกับชื่อ และเหตุใดตัวเลขจึงปลอดภัยกว่าเมื่อรูปภาพไม่มีบัญชีที่ตรงกัน
--user กลายเป็นผู้ใช้: — ตัวเลข UID:GID เทียบกับชื่อ และเหตุใดตัวเลขจึงปลอดภัยกว่าเมื่อรูปภาพไม่มีบัญชีที่ตรงกัน หลักฐาน: --user กลายเป็นผู้ใช้และข้อความที่เป็นตัวเลข UID:GID ถูกยกมา ตัดสินการทำให้อนุกรมข้อมูลประจำตัวรันไทม์จากโมเดล การอ้างถึงความสามารถในการเมานต์ของผู้ใช้จะปกป้องประเภทต่างๆ แต่ไม่ได้ให้หลักฐานการปฏิบัติงานสำหรับเนมสเปซและความเป็นเจ้าของ
การสังเกตการทำให้เป็นอนุกรมความปลอดภัยครั้งที่สองคือ ขอบเขตเอาต์พุตความปลอดภัยที่แยกจากกันคือแมป cap_drop แบบอ่านอย่างเดียวและ security_opt ในขณะที่โหมดไร้รูทไม่มี หลักฐาน: read_only cap_drop และ security_opt map ในขณะที่โหมด rootless ไม่มี เอาต์พุตข้อมูลประจำตัวรันไทม์นี้จะแยกการตั้งค่าออกจากบริบทที่ไม่พร้อมใช้งาน ทำให้ผู้ใช้สามารถตรวจสอบความสามารถในการเมานต์และตรวจสอบเนมสเปซและความเป็นเจ้าของได้อย่างอิสระ
รูปภาพที่หมดสิทธิ์ไปแล้ว — USER ใน Dockerfile และรูปภาพที่สลับผู้ใช้ในจุดเข้าใช้งาน
รูปภาพที่หมดสิทธิ์ไปแล้ว — USER ใน Dockerfile และรูปภาพที่สลับผู้ใช้ในจุดเข้าใช้งาน หยุดที่ข้อยกเว้นข้อมูลประจำตัวรันไทม์แทนการคาดเดา การเพิ่มความสามารถใดๆ ที่ใกล้กับผู้ใช้จะต้องมีเหตุผลเฉพาะในการปรับใช้ซึ่งเชื่อมโยงกับเนมสเปซและความเป็นเจ้าของ
ข้อจำกัดข้อยกเว้นด้านความปลอดภัยอีกประการหนึ่งคือ ขอบเขตข้อยกเว้นด้านความปลอดภัยที่แยกต่างหากคือการแมปเนมสเปซใหม่และบริบท Kubernetes อยู่นอกขอบเขต หลักฐาน: การแมปเนมสเปซใหม่และบริบท Kubernetes อยู่นอกขอบเขต เก็บคำสั่งการระบุตัวตนรันไทม์เดิมไว้ข้างๆ คำเตือน การเปรียบเทียบแสดงให้เห็นว่าผู้ใช้เมานต์ความสามารถใดบ้าง และเนมสเปซและการตัดสินใจเป็นเจ้าของใดที่ยังคงเป็นแบบแมนนวล
ตัวอย่างการทำงาน: การแปลงนักเทียบท่ารัน --user 1000:1000 -v /srv/app:/app — ผู้ใช้: คีย์และความเป็นเจ้าของผลลัพธ์บนดิสก์
ตัวอย่างการทำงาน: การแปลงนักเทียบท่ารัน --user 1000:1000 -v /srv/app:/app — ผู้ใช้: คีย์และความเป็นเจ้าของผลลัพธ์บนดิสก์ สร้างตัวอย่างเอกลักษณ์รันไทม์จากชื่อสังเคราะห์ ทำให้ผู้ใช้ทุกคนสามารถติดตามรายการความสามารถได้ โดยไม่ต้องเปิดเผยเนมสเปซที่ใช้งานจริงและรายละเอียดการเป็นเจ้าของ
ตัวอย่างตัวอย่างการรักษาความปลอดภัยเดียวกันนี้แสดงให้เห็นว่า ขอบเขตตัวอย่างการรักษาความปลอดภัยที่แยกต่างหากคือข้อมูลประจำตัวจะปรากฏให้เห็นข้างการเมาท์และความสามารถในการตรวจสอบ หลักฐาน: ตัวตนจะปรากฏให้เห็นข้างพาหนะและความสามารถในการตรวจสอบ ข้อมูลประจำตัวรันไทม์ที่จับคู่ควรมองเห็นได้ในความสามารถในการเมานต์ของผู้ใช้ บันทึกบรรทัดนั้นและหลีกเลี่ยงสมมติฐานเกี่ยวกับเนมสเปซและความเป็นเจ้าของ
ปุ่มเสริมความแข็งแกร่งอื่น ๆ — read_only, cap_drop: [ALL], security_opt no-new-privileges และ Docker ที่ไม่มีรูทเป็นขั้นตอนที่ใหญ่กว่า
ปุ่มเสริมความแข็งแกร่งอื่นๆ — read_only, cap_drop: [ALL], security_opt no-new-privileges และ Docker ที่ไม่มีรูทเป็นขั้นตอนที่ใหญ่กว่า แปลผลลัพธ์ของข้อมูลประจำตัวรันไทม์เป็นความแตกต่างด้านความสามารถที่ผู้ใช้สังเกตได้หนึ่งราย นักเทียบท่าเป็นเจ้าของเนมสเปซในภายหลังและคำตัดสินความเป็นเจ้าของ
การใช้งานผลด้านความปลอดภัยยังแสดงขอบเขตผลด้านความปลอดภัยที่แยกต่างหากคือเอาต์พุตที่ผูกไว้สามารถเปิดเผยข้อมูลประจำตัวที่ไม่ตรงกันที่แยกวิเคราะห์ไม่สามารถวินิจฉัยได้ การแบ่งความรับผิดชอบด้านการระบุตัวตนรันไทม์: การแปลงเขียนความสามารถที่ผู้ใช้ต่อเชื่อม พื้นที่เก็บข้อมูลจะลบความลับออก และผู้ดำเนินการตรวจสอบเนมสเปซและความเป็นเจ้าของ
สิ่งนี้ไม่ครอบคลุม — การกำหนดค่าการแมปเนมสเปซผู้ใช้ใหม่และ Kubernetes securityContext
สิ่งนี้ไม่ครอบคลุม — การกำหนดค่าการแมปเนมสเปซผู้ใช้ใหม่และ Kubernetes securityContext จำกัดขอบเขตการระบุตัวตนรันไทม์ไว้ที่สาขาความสามารถที่ผู้ใช้เมานต์ที่แสดงไว้ที่นี่ แบบฟอร์มใกล้เคียงและค่าเริ่มต้นไม่สามารถตอบเนมสเปซและคำถามเกี่ยวกับความเป็นเจ้าของได้
ขีดจำกัดขอบเขตความปลอดภัยอีกประการหนึ่งตามมาจากขอบเขตขีดจำกัดความปลอดภัยที่แยกต่างหากคือ UID ผลกระทบของโฮสต์เป็นศูนย์ขึ้นอยู่กับการกำหนดค่าเนมสเปซที่ไม่ได้อ่านที่นี่ ถือว่าขอบเขตเอกลักษณ์รันไทม์นี้เป็นข้อยกเว้น ต้องการความสามารถในการเมานต์ที่ผู้ใช้แม่นยำมากกว่าการคาดเดาเกี่ยวกับเนมสเปซและความเป็นเจ้าของ
Takeaway: ตัดสินใจว่าใครคือกระบวนการของคุณ — และตรวจสอบผลลัพธ์ของตัวแปลงรวมถึงผู้ใช้: ก่อนที่คุณจะนำสแต็กขึ้นมา
Takeaway: ตัดสินใจว่าใครคือกระบวนการของคุณ — และตรวจสอบผลลัพธ์ของตัวแปลงรวมถึงผู้ใช้: ก่อนที่คุณจะนำสแต็กขึ้นมา ตรวจสอบข้อมูลประจำตัวรันไทม์เป็นตัวเลือกแหล่งที่มา ฟิลด์โมเดล บรรทัดความสามารถที่ผู้ใช้ต่อเชื่อม และคำเตือน ลบข้อมูลลับก่อนตรวจสอบเนมสเปซและความเป็นเจ้าของ
สุดท้ายนี้ แหล่งที่มาของการรักษาความปลอดภัยยืนยันขอบเขตการตัดสินใจด้านความปลอดภัยที่แยกต่างหากคือ --user กลายเป็นผู้ใช้ และข้อความที่เป็นตัวเลข UID:GID ได้รับการยกมา ปิดการระบุตัวตนรันไทม์ให้แคบลง: ความสามารถในการเมานต์ของผู้ใช้คือตัวเลือก ไม่รับประกันเนมสเปซและความเป็นเจ้าของและความเทียบเท่าของเชลล์