‫ไม่เป็นไร. เรารู้ว่าจะไม่ทำงานเป็นรูทในคอนเทนเนอร์
‫แต่นอกคอนเทนเนอร์นั้น รูทในคอนเทนเนอร์นั้นไม่สามารถเข้าถึงสิ่งใด
‫ๆ บนโฮสต์ได้โดยตรงใช่ไหม
‫เพียงเพราะคุณรูทในคอนเทนเนอร์
‫คุณยังถูกจำคุกอยู่ในนั้น
‫แต่ถ้าคุณต้องการก้าวไปอีกระดับ
‫โดยที่หากผู้ใช้มีรูทในคอนเทนเนอร์แล้ว อยากแยกออกไปที่โฮสต์
‫เพราะมีเคอร์เนลของช่องโหว่อย่างที่เราพูดถึง เช่น Cow สกปรกหรือช่องโหว่อื่นใน
‫Docker หรือบางสิ่งบางอย่าง.
‫จากนั้น ขั้นตอนต่อไปที่คุณทำคือเปิดใช้งานเนมสเปซผู้ใช้ ซึ่งไม่ได้เปิดใช้งานตามค่าเริ่มต้น
‫ฉันมีลิงก์ที่นี่ซึ่งจะนำไปยังบทความในบล็อกที่พูดถึงเรื่องนี้ทั้งหมด
‫โดยทั่วไป เป็นการตั้งค่าต่อโฮสต์ที่คุณตั้งค่าไว้ในการกำหนดค่า
‫Docker นักเทียบท่า JSON
‫มันบอก Docker ว่าทุกครั้งที่สร้างคอนเทนเนอร์ใหม่เพื่อเรียกใช้คอนเทนเนอร์นั้นในฐานะผู้ใช้ที่ไม่ใช่รูทบนโฮสต์
‫โดยทั่วไปแล้วจะมีโปรแกรมอยู่สองสามโปรแกรม
‫นั่นคือ containerd และ runC ซึ่งเป็นโปรแกรมอื่นๆ ที่ Docker ใช้เพื่อเริ่มคอนเทนเนอร์ของคุณ
‫โดยค่าเริ่มต้น สิ่งเหล่านี้จะทำงานเป็นรูท
‫คุณลักษณะที่ Docker มีคือการเปิดใช้งานเนมสเปซของผู้ใช้
‫ซึ่งหมายความว่าเมื่อ Docker สร้างคอนเทนเนอร์เหล่านี้
‫จะไม่ทำให้เกิดกระบวนการย่อยที่ทำงานเหมือนรูทเหมือนที่
‫Docker ทำ
‫มันจะวางไข่เป็นผู้ใช้ที่มีหมายเลขสูง
‫ไม่จำเป็นต้องเป็นผู้ใช้แบบสุ่ม แต่เป็นผู้ใช้ระดับสูง
‫ซึ่งหมายความว่าหากคอนเทนเนอร์นั้นเคยมีช่องโหว่ด้านความปลอดภัยที่ผู้ใช้สามารถหลบหนีจากคอนเทนเนอร์ได้
‫ก็จะมีเพียงผู้ใช้บนโฮสต์เท่านั้น
‫เพราะนั่นคือพวกเขาจะทำหน้าที่เป็นผู้ใช้ที่กระบวนการที่กำลังเรียกใช้คอนเทนเนอร์นั้นใช้อยู่
‫โดยพื้นฐานแล้ว runC
‫โปรแกรม runC คือสิ่งที่เปิดใช้คอนเทนเนอร์นั้น
‫และจะทำงานในฐานะผู้ใช้ที่มีหมายเลขสูง
‫ไม่ใช่รูท ผู้ใช้รายนั้นไม่มีสิทธิ์ใด
‫ๆ นอกคอนเทนเนอร์นั้นจริงๆ ดังนั้น คุณลักษณะนั้นเป็นการตั้งค่าต่อโฮสต์
‫ไม่ใช่การตั้งค่าต่อคอนเทนเนอร์ และไม่ใช่ทุกอย่างที่ทำงานภายใต้เนมสเปซของผู้ใช้
‫คุณแค่ต้องพยายามและฝึกฝน
‫คุณจะต้องเปิดใช้งานบนเซิร์ฟเวอร์บางตัว ลองใช้แอปพลิเคชันของคุณบนเซิร์ฟเวอร์นั้น
‫ดูว่าทำงานได้หรือไม่
‫หากไม่เป็นเช่นนั้น คุณจะต้องแบ่งกลุ่มสถาปัตยกรรมของคุณ
‫เมื่อใดก็ตามที่ฉันใช้เนมสเปซผู้ใช้ในคลัสเตอร์
‫เรามักจะมีโหนดผู้ปฏิบัติงานเฉพาะที่เปิดใช้งานเนมสเปซผู้ใช้
‫นั่นคือที่ที่โปรแกรมเหล่านั้นทำงานและรองรับได้
‫และใช้งานได้จริง
‫อย่างอื่นต้องทำงานบนเซิร์ฟเวอร์ Docker
‫ปกติที่อื่น นั่นเป็นวิธีที่เราแบ่งออก
‫เราแบ่งเซิร์ฟเวอร์ออกเป็นสองคลาส
‫อย่างที่คุณรู้ เช่น ถ้าคุณใช้ DMZ นั่นคือสิ่งที่ฉันจะทำคือ
‫เรียกใช้ ฉันจะเปิดใช้งาน ใน DMZ เนมสเปซผู้ใช้ทั้งหมด
‫บนเซิร์ฟเวอร์ทั้งหมด และคอนเทนเนอร์ที่ทำงาน
‫จะต้องมีจะต้องสนับสนุนเนมสเปซผู้ใช้
‫คุณไม่สามารถไปดูแอปพลิเคชันและดูว่ารองรับเนมสเปซผู้ใช้หรือไม่
‫มันคือ... เนมสเปซผู้ใช้ไม่จำเป็นต้องเป็นคุณลักษณะเฉพาะของ
‫Docker โดยพื้นฐานแล้วหมายความว่าคอนเทนเนอร์ของคุณทำงานในเนมสเปซและตอนนี้แอปพลิเคชันที่รันคอนเทนเนอร์นั้นถูกล็อคไว้เล็กน้อยเช่นกัน
‫ไม่ใช่ทุกสิ่งที่จะรองรับได้ คุณจะต้องฝึกฝนหรือทำวิจัยเพื่อดูว่าคนอื่นสามารถทำให้มันทำงานที่นั่นได้หรือไม่
‫คุณรู้ไหม
‫สำหรับสิ่งทั่วไปเช่น MySQL และอะไรทำนองนั้น แต่แน่นอนว่า สำหรับโปรแกรมของคุณเองที่คุณกำลังพัฒนา
‫คุณจะต้องทดสอบโปรแกรมเหล่านั้นเพื่อดูว่าจะได้ผลหรือไม่
‫ฉันจะบอกว่าโปรแกรมและภาษาทั่วไปส่วนใหญ่ที่ฉันใช้นั้นทำงานได้ดีในเนมสเปซผู้ใช้
‫ปัญหาที่แท้จริงเกี่ยวกับเนมสเปซผู้ใช้คือเมื่อคุณมีแอปพลิเคชันที่ต้องการเขียนลงในวอลุ่มหรือผูกเมานต์
‫ซึ่งบางทีคุณอาจมีการอัปโหลดไฟล์ผู้ใช้และคุณกำลังแชร์ไฟล์เหล่านั้นในคอนเทนเนอร์ต่างๆ มากมาย
‫นั่นคือสิ่งที่เป็นไปไม่ได้ที่เนมสเปซผู้ใช้
‫มันยุ่งยากเล็กน้อยเพราะตอนนี้ไฟล์ที่เขียนลงดิสก์บนโฮสต์กำลังถูกเขียนเป็นผู้ใช้อื่น
‫เนื่องจากกระบวนการนั้นบนโฮสต์ที่จัดการคอนเทนเนอร์นั้นเป็นผู้ใช้ที่แตกต่างกัน
‫ดังนั้น คุณจะเห็น ID ผู้ใช้ที่แตกต่างกันในไฟล์เหล่านั้น และคุณจะต้องจัดการกับมัน
‫มีสิทธิ์ลินุกซ์มาตรฐาน ณ จุดนั้น และคุณเพียงแค่ต้องทำให้เป็นอัตโนมัติและแก้ปัญหาเหล่านั้นด้วยวิธีมาตรฐานต่างๆ
‫ของลินุกซ์
‫มันไม่ใช่ปัญหา Docker เลยแม้แต่น้อย ณ จุดนั้น
‫มันเป็นเพียงปัญหาการอนุญาตบนโฮสต์