‫อันต่อไป.
‫นี่เป็นเรื่องใหญ่
‫อย่าเรียกใช้แอปของคุณในฐานะรูทในคอนเทนเนอร์ หากคุณหลีกเลี่ยงได้
‫ถ้าฉันทำสิ่งนี้อย่างรวดเร็วจริง ๆ ในการสาธิตเล็กน้อยที่นี่
‫ไม่เป็นไร. ฉันมี Docker ทำงานอยู่ อย่างน้อยฉันก็ควร
‫ไม่เป็นไร.
‫แล้วถ้าผมวิ่ง...
‫ถ้าฉันเพิ่งเรียกใช้ Nginx ถูกต้อง
‫และฉันทำการเทียบท่าบนคอนเทนเนอร์นั้น
‫เราเห็นอะไรที่นี่?
‫ภายในคอนเทนเนอร์ Nginx เริ่มกระบวนการที่รูท จากนั้นจึงสร้างกระบวนการใหม่ในฐานะผู้ใช้ที่ไม่ใช่รูท
‫ดูว่าผู้ใช้คนนั้นเป็น 101 อย่างไร
‫นี่เป็นเรื่องปกติของโปรแกรมที่ใช้ daemon เช่น
‫MySQL, Postgres, Nginx
‫ส่วนใหญ่ที่ไม่ใช่ภาษาโปรแกรมจะทำสิ่งนี้โดยอัตโนมัติ
‫ดังนั้นสิ่งนี้จึงปลอดภัย
‫การทำเช่นนี้คือการอนุญาตให้ Nginx วางไข่จากกระบวนการของผู้ปฏิบัติงานที่ไม่ได้ทำงานเป็นรูทเพื่อทำงานส่วนใหญ่
‫ดังนั้น พวกเขามีกระบวนการหลักที่รันเป็นรูท แต่นั่นไม่ใช่การยอมรับการเชื่อมต่อและทำงานส่วนใหญ่
‫ส่วนใหญ่อยู่ในกระบวนการของผู้ปฏิบัติงานเหล่านี้
‫พวกเขาทำงานเหมือนผู้ใช้ทั่วไป
‫ซึ่งหมายความว่าหากมีช่องโหว่ใน Nginx มีโอกาสที่การเชื่อมต่อขาเข้าเข้ามาและมีคนพยายามใช้ประโยชน์จากโปรโตคอล Nginx
‫HTTP จะถูกล็อคหรือติดคุกในผู้ใช้รายนี้ที่..
‫. ส่วนใหญ่เว้นแต่จะมีช่องโหว่ร้ายแรงอยู่ด้านบนนี้
‫ข้างล่างนี้ และจากนั้นพวกเขาก็จำกัดเฉพาะสิ่งที่พวกเขาสามารถทำได้ใช่ไหม
‫แม้ว่าพวกเขาจะเข้าควบคุมกระบวนการนั้นก็ตาม
‫พวกเขาก็ยังถูกจำกัดในฐานะผู้ใช้
‫เท่านี้ก็เรียบร้อย
‫นี่ยังไม่ทำงานเป็นรูทจริงภายในคอนเทนเนอร์
‫ที่ฉันกำลังพูดถึงคือถ้าคุณจะเรียกใช้แอพ
‫Python หรือแอพ Node หรืออะไรทำนองนั้นที่เป็นภาษาโปรแกรม
‫มันจะเป็นสิ่งที่ตั้งค่าเริ่มต้นให้รูทเพราะภาษาการเขียนโปรแกรมในคอนเทนเนอร์ไม่ ไม่รู้ว่าโปรแกรมของคุณทำงานอย่างไร
‫มันไม่รู้ว่าคุณต้องการทำอะไร
‫ดังนั้น มันจะทำการรูทโดยค่าเริ่มต้น และนั่นคือเพิ่มเติมเกี่ยวกับความเข้ากันได้ของแอปพลิเคชัน
‫เราอาจบอกว่าเราต้องการให้สิ่งนี้ปลอดภัยโดยค่าเริ่มต้น
‫แต่ Docker เลือกให้คอนเทนเนอร์อย่างเป็นทางการเหล่านี้ทำงานเป็นรูทสำหรับภาษาการเขียนโปรแกรมจริงๆ
‫ไปเช็คกันเลย
‫อ๊ะ. ไม่ใช่อันนั้น.
‫ไฟร์ฟอกซ์.
‫ถ้าเราไป สมมติว่า ไปที่ฮับ
‫มาทำ Node กันเถอะ
‫นี่เป็นเรื่องปกติของภาษาส่วนใหญ่
‫ฉันจะเลือกโหนดเป็นตัวอย่าง
‫ภายใน Node ถ้าฉันเข้าไปใน
‫Dockerfiles ตัวใดตัวหนึ่งที่นี่
‫จากนั้นฉันก็ค้นหาผู้ใช้
‫คุณจะสังเกตเห็นว่าฉันไม่พบอะไรเลย
‫ผู้ใช้รายนี้เท่านั้นที่เพิ่มที่นี่
‫คุณจะสังเกตเห็นว่ามันทำอย่างนี้ใช่ไหม
‫ในทางเทคนิคแล้วจะเพิ่มกลุ่มที่เรียกว่า Node และกำลังเพิ่มผู้ใช้ชื่อ
‫Node
‫หากคุณค้นหาส่วนที่เหลือของไฟล์นี้ คุณจะรู้ว่าไฟล์นี้ไม่เคยเปลี่ยนผู้ใช้รายนั้นด้วย
‫stanza U S E R ใช่ไหม
‫คุณควรเห็นโหนดผู้ใช้ในที่ใดที่หนึ่งเป็นบรรทัด
‫พวกเขาไม่ทำอย่างนั้นเพราะนั่นเป็นงานของคุณ
‫ดังนั้นสิ่งที่คุณควรทำใน Dockerfile
‫ระดับล่างของคุณ ดังนั้น Dockerfile ใดๆ ที่คุณกำลังสร้างจากอิมเมจอย่างเป็นทางการเหล่านี้สำหรับภาษาการเขียนโปรแกรม
‫คุณควรใช้ประโยชน์จากผู้ใช้ที่พวกเขากำลังสร้างให้คุณ
‫หากพวกเขาไม่ได้สร้างผู้ใช้เหล่านั้น
‫คุณสามารถสร้างได้เองด้วยวิธีเดียวกัน คุณสามารถขโมยสิ่งสองบรรทัดเล็ก
‫ๆ นี้และเปลี่ยนเป็นผู้ใช้ที่คุณต้องการให้เป็น
‫หากเป็น
‫Python คุณอาจเรียกมันว่าผู้ใช้ Python ก็ได้
‫หากคุณกำลังทำเช่นนั้น แอปพลิเคชันที่คุณเรียกใช้จะไม่ทำงานเป็นรูทในคอนเทนเนอร์
‫ตามค่าเริ่มต้น
‫หากคุณเรียกใช้แอป Node มาตรฐานใดๆ แอปนั้นจะใช้ผู้ใช้รูทในคอนเทนเนอร์
‫ทำไมสิ่งนี้จึงสำคัญ?
‫สองสิ่ง
‫หนึ่ง ถ้ามีคนสามารถเจาะผ่านแอปพลิเคชันของคุณและแฮ็คเข้าสู่แอปพลิเคชันของคุณและเข้าถึงระบบไฟล์ได้
‫หากพวกเขา... ถ้าแอปพลิเคชันนั้นเป็นรูท จากนั้นในคอนเทนเนอร์
‫พวกเขาสามารถทำทุกอย่างที่ต้องการในคอนเทนเนอร์ได้เลย
‫พวกเขาสามารถเขียนไฟล์ไปยังระบบไฟล์
‫พวกเขาสามารถติดตั้งโปรแกรมเพิ่มเติมในคอนเทนเนอร์นั้นที่สามารถทำงานได้ทุกเมื่อที่ต้องการในคอนเทนเนอร์นั้น
‫ดังนั้นเราจึงไม่ต้องการให้พวกเขาทำอย่างนั้นจริงๆ
‫เราอยากให้พวกเขาถูกจำกัดมาก
‫ดังนั้น หากแอปพลิเคชันของคุณรองรับ
‫คุณก็ควรทำสิ่งนี้ โดยทั่วไปคุณต้องแน่ใจว่าคุณมีผู้ใช้ที่พร้อมใช้งาน
‫ผมมีตัวอย่างจาก DockerCon ตรงนี้
‫ที่ DockerCon ฉันได้พูดคุยเกี่ยวกับ Node.js js และหนึ่งในหัวข้อนั้นเกี่ยวกับผู้ใช้
‫ให้ฉันดูว่าฉันจะหามันเจอไหม
‫ดูสิ่งที่ฉันทำที่นี่? มันเป็นไฟล์ที่ค่อนข้างง่าย
‫ฉันจะเชื่อมโยงสิ่งนี้และใส่เข้าไป
‫ใน Dockerfile นี้
‫ดังนั้นใน Dockerfile นี้ ฉันมี...
‫ฉันไม่ได้สร้างผู้ใช้เพราะอิมเมจ
‫Node สร้างให้ฉันแล้ว ฉันแค่เปลี่ยนเป็นโหนดผู้ใช้
‫ฉันกำลังติดตั้งแพ็คเกจของฉันด้วยสองบรรทัดนี้ และหลังจากนั้น
‫ฉันจะเริ่มใช้งาน
‫คุณจะสังเกตเห็นว่าฉันต้องเริ่มใช้ตัวเลือก
‫chown ในคำสั่งคัดลอกเพื่อให้แน่ใจว่าไฟล์ของฉันเป็นผู้ใช้เดียวกันกับผู้ใช้ที่โปรแกรมของฉันจะทำงาน
‫ไม่อย่างนั้นอาจจะมีปัญหาก็ได้
‫ใบสมัครของฉันน่าจะ... ถ้ามันอ่านไฟล์ไม่ได้ก็ใช้งานไม่ได้ใช่ไหม
‫ดังนั้น ฉันต้องการการเปลี่ยนแปลงการอนุญาตเหล่านั้น
‫ฉันสามารถทำได้ด้วยคำสั่งคัดลอก
‫คุณจะเห็นบนนี้ด้วยว่าฉันกำลังสร้างไดเร็กทอรีและ
‫chowning ด้วยเช่นกัน ดังนั้นเมื่อใดก็ตามที่มีการคัดลอกแอป
‫ฉันแค่ต้องการให้แน่ใจว่ามีการอนุญาต เพื่อให้สามารถเขียนได้
‫เนื่องจากนาทีที่ฉันเปลี่ยนผู้ใช้รายนี้ คำสั่ง copy
‫นี้ หรือเฉพาะคำสั่ง run นี้ จะทำงานในฐานะผู้ใช้รายนั้น
‫หากไม่มีสิทธิ์ในการเขียนไปยังไดเร็กทอรีก็จะล้มเหลวเช่นกัน
‫เหตุผลที่ Docker ไม่ทำสิ่งนี้ให้คุณเพราะพวกเขารู้ว่าสิ่งของของคุณอาจจะพัง
‫ดังนั้น คุณต้องทำตามขั้นตอนเพิ่มเติมเหล่านี้
‫แต่ก็ไม่ได้ยากขนาดนั้น มันไม่ได้จริงๆ
‫คุณอาจทำการทดสอบทั้งหมดนี้ได้ในหนึ่งวัน จากนั้นคุณจะต้องเรียกใช้ระบบของคุณผ่าน
‫CI เต็มรูปแบบและการทดสอบเต็มรูปแบบบนเซิร์ฟเวอร์ของคุณ
‫เพราะบางครั้ง PHP ก็เป็นหนึ่งในระบบที่ไม่ดีในเรื่องนี้
‫PHP ชอบเรียกใช้ไฟล์บันทึกจำนวนมากและเขียนลงดิสก์เป็นจำนวนมาก
‫จริงๆ สิ่งที่อนุญาตให้ผู้ใช้อัปโหลดจะเขียนลงดิสก์
‫ดังนั้น
‫คุณต้องตรวจสอบให้แน่ใจว่าการอนุญาตเหล่านั้นถูกต้อง เพื่อที่ว่าเมื่อมีคนเขียนไฟล์ เช่น สมมติว่าพวกเขากำลังใช้งานบล็อก
‫WordPress
‫บล็อก WordPress นั้นจะเขียนลงดิสก์เมื่อผู้ใช้อัปโหลดภาพลงในบล็อกของตน
‫คุณต้องการให้แน่ใจว่าการอนุญาตเหล่านั้นจะใช้งานได้
‫ดังนั้นคุณจะต้องทำการทดสอบอย่างแน่นอน
‫เมื่อคุณทำเสร็จแล้ว ตอนนี้แอปพลิเคชันของคุณจะไม่ทำงานเป็นรูท
‫ดังนั้นจึงไม่สามารถควบคุมได้อย่างสมบูรณ์ในคอนเทนเนอร์
‫อีกเหตุผลหนึ่งที่คุณต้องการทำเช่นนี้คือหากมีช่องโหว่ใน
‫Linux ซึ่งหายาก หรือ Docker ซึ่งหายากมากเช่นกัน โอกาสที่พวกเขาจะแตกออกจากคอนเทนเนอร์นี้น้อยลง
‫มันเกิดขึ้นเพียงครั้งเดียว
‫ครั้งหนึ่งที่ฉันรู้ดี และฉันได้บันทึกมันไว้ที่นี่
‫วัวสกปรก Dirty COW เป็นช่องโหว่ใน
‫Linux ที่อนุญาตให้คุณออกจากคอนเทนเนอร์ได้
‫การเปลี่ยนแปลงผู้ใช้ของคุณตรงนี้
‫ไม่จำเป็นต้องแก้ปัญหาทั้งหมด แต่ก็ไม่ได้ส่งผลกระทบต่อปัญหานั้นอย่างแน่นอน
‫ช่องโหว่อื่นๆ ก็อาจจะป้องกันได้
‫แต่นี่เป็นแนวทางปฏิบัติที่ดีที่สุด
‫ฉันคิดว่าถ้าคุณมีทีมรักษาความปลอดภัย พวกเขาจะยืนกรานว่าคุณจะไม่เรียกใช้สิ่งต่าง
‫ๆ เป็นรูท
‫ดังนั้นคุณจะทำอย่างนั้น