Bottlerocket - Linux OS แบบ immutable ขั้นต่ำพร้อม verified boot
(bottlerocket.dev)- Bottlerocket เป็น OS บน Linux ที่ปรับแต่งมาสำหรับการโฮสต์คอนเทนเนอร์ ใช้เป็นระบบปฏิบัติการพื้นฐานของ worker node ในคลัสเตอร์ที่จัดการโดย orchestrator อย่าง Kubernetes
- ใช้ การกำหนดค่าขั้นต่ำ โดยตัดแพ็กเกจ เครื่องมือ และ interpreter ของดิสโทรแบบใช้งานทั่วไปออก เพื่อลดภาระการปฏิบัติการและพื้นผิวการโจมตี พร้อม提供เฉพาะชุดที่จำเป็นผ่าน variant ตามแต่ละสภาพแวดล้อม
- ไม่มี shell และ package manager จัดการระบบผ่าน privileged host container และ API ส่วนการอัปเดตถูกนำไปใช้แบบ atomic ด้วยการสลับ image และ partition
- การตั้งค่าจัดการผ่าน API จึงรองรับการ migrate และ rollback ระหว่างเวอร์ชันได้ และการจัดการอัปเดตทำได้ทั้งแบบ manual หรือผ่านเครื่องมือเฉพาะของ orchestrator
- ลดเส้นทางการแก้ไขระบบและการรันโค้ดที่ไม่ผ่านการตรวจสอบ ด้วย root filesystem แบบ immutable, dm-verity, SELinux แบบจำกัดสิทธิ์, รวมถึงการ implement ด้วย Rust และบางส่วนด้วย Golang
OS พื้นฐานสำหรับคลัสเตอร์คอนเทนเนอร์
- Bottlerocket เป็นระบบปฏิบัติการบน Linux ที่ปรับแต่งมาเพื่อการโฮสต์คอนเทนเนอร์
- เป็นซอฟต์แวร์โอเพนซอร์สฟรี และพัฒนาแบบเปิดบน GitHub
- ติดตั้งเป็น ระบบปฏิบัติการพื้นฐาน ของเครื่องหรืออินสแตนซ์ที่คอนเทนเนอร์ทำงานอยู่
- ออกแบบมาให้ทำงานร่วมกับ container orchestrator อย่าง Kubernetes เพื่อรองรับการทำงานอัตโนมัติของวงจรชีวิตคอนเทนเนอร์ภายในคลัสเตอร์
- ทำงานได้ทั้งบนคลาวด์และในดาต้าเซ็นเตอร์
- เป้าหมายการออกแบบสรุปได้เป็นสามข้อคือ Minimal, Safe Updates, และ Security Focused
การกำหนดค่าขั้นต่ำและ variant ตามสภาพแวดล้อม
- เนื่องจากมุ่งเป้าเฉพาะการโฮสต์คอนเทนเนอร์ จึงตัดแพ็กเกจ เครื่องมือ interpreter และ dependency จำนวนมากที่มักรวมมากับดิสโทร Linux แบบใช้งานทั่วไปออก
- เมื่อซอฟต์แวร์ที่ไม่จำเป็นลดลง overhead ด้านการปฏิบัติการ และ overhead ด้านความปลอดภัย ก็ลดลงตามไปด้วย
- ความต้องการของ orchestrator, แพลตฟอร์ม และสถาปัตยกรรมที่หลากหลาย ถูกจัดการด้วย variant ซึ่งเป็นบิลด์ตามชุดความเข้ากันได้แต่ละแบบ
- variant คือรูปแบบที่ประกอบองค์ประกอบที่จำเป็นสำหรับการรันในสภาพแวดล้อมเฉพาะ
- หากเลือก variant ที่เหมาะสม ก็ไม่ต้องมีองค์ประกอบเพิ่มเติมเพื่อ join เข้าคลัสเตอร์
- ตัว Bottlerocket เอง ไม่มี shell
- การเข้าถึงระบบทำได้ผ่าน host container แบบมีสิทธิ์ ซึ่งมี shell
- ใน host container สามารถสำรวจ OS พื้นฐาน และเปลี่ยนการตั้งค่าของระบบที่กำลังรันอยู่ผ่าน API ได้
การอัปเดตที่ปลอดภัยแบบอิง image
- Bottlerocket ออกแบบมาให้อัปเดตได้ แต่ไม่มี package manager
- การอัปเดตถูกส่งมาเป็น image ที่ดาวน์โหลดไปยัง partition ที่กำหนด
- ระหว่างอัปเดต orchestrator จะ drain node แล้วสั่งให้ Bottlerocket ใช้อัปเดตและรีบูต
- Bottlerocket จะสลับ partition และบูตเป็นเวอร์ชันใหม่แบบ atomic
- การตั้งค่าระบบจัดการผ่าน API ทำให้ Bottlerocket สามารถจัดการการ migrate การตั้งค่าระหว่างเวอร์ชันได้
- หากเกิดปัญหาระหว่างอัปเดต สามารถย้อนกลับไปยังเวอร์ชันก่อนหน้าที่ทำงานได้ โดยยังคงการตั้งค่าเดิมไว้
- การจัดการอัปเดตทำได้แบบ manual หรือใช้เครื่องมือเฉพาะของแต่ละ orchestrator
การออกแบบที่เน้นความปลอดภัย
- การกำหนดค่าขั้นต่ำและวิธีอัปเดตเป็นสิ่งที่รองรับ การออกแบบที่เน้นความปลอดภัย ของ Bottlerocket
- เนื่องจาก variant ถูกส่งมาเป็น image จึงไม่จำเป็นต้องมี package registry หรือ manager ที่อาจเปลี่ยนระบบจนก่อให้เกิดปัญหาความปลอดภัย
- ฟีเจอร์เฉพาะของ Bottlerocket เขียนด้วย Rust และบางส่วนด้วย Golang
- ทั้งสองภาษาเป็นภาษาแบบคอมไพล์ และมีการป้องกันในตัวต่อปัญหาด้าน memory safety
- โค้ดทั้งหมดถูกส่งมาเป็น image ที่คอมไพล์ไว้ล่วงหน้า จึงไม่จำเป็นต้องมี shell และ interpreter และลดเส้นทางการรันโค้ดที่ไม่ผ่านการตรวจสอบ
- root filesystem เป็นแบบ immutable
- dm-verity ให้การตรวจสอบความถูกต้องของ root filesystem แบบโปร่งใส
- หากตรวจพบการเปลี่ยนแปลงของ block device พื้นฐาน kernel จะรีสตาร์ท
- filesystem ที่เปลี่ยนแปลงได้จะถูกใช้นโยบาย SELinux แบบจำกัดสิทธิ์ ซึ่งเปิดใช้งานและบังคับใช้เสมอ
- เป็นนโยบายที่ช่วยไม่ให้คอนเทนเนอร์ทำงานที่อันตรายได้ แม้คอนเทนเนอร์จะรันเป็น root ก็ตาม
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ยังให้ความรู้สึกว่าเป็น โปรเจกต์ของ AWS/Amazon อย่างมาก และเส้นทางที่จะกลายเป็นโปรเจกต์อิสระก็ดูไม่ชัดเจน
เช่น ถ้าต้องสแกนช่องโหว่ของ OS ก็ใช้ผลิตภัณฑ์ของ Amazon ได้ ไม่อย่างนั้นวิธีก็คลุมเครือ https://bottlerocket.dev/en/faq/#4_2
ถ้าคิดจะรัน Bottlerocket แค่บน AWS ก็คงโอเค แต่ถ้าจะเป็นผลิตภัณฑ์ที่ “รันในคลาวด์หรือดาต้าเซ็นเตอร์” อย่างที่เว็บไซต์บอก ก็ต้องแก้เรื่องพวกนี้ให้ได้
ถ้าอยากรู้ว่าแพตช์แล้วหรือยัง แค่ดูว่ากำลังรันเวอร์ชันล่าสุดอยู่หรือไม่ก็พอ และถ้าเป็นเวอร์ชันล่าสุดก็หมายความว่าแพตช์ที่มีทั้งหมดถูกใช้แล้ว
แต่ในอุตสาหกรรมที่มีข้อกำกับดูแล เรื่องนี้อาจเป็นปัญหาได้ เพราะต้องกรอกรายการ “การจัดการช่องโหว่” ในเช็กลิสต์ compliance
เหตุผลสำคัญที่ OS แบบดั้งเดิมต้องมีการจัดการช่องโหว่ คือพื้นที่การคอนฟิกกว้างมาก องค์ประกอบซอฟต์แวร์ถูกผสมกันอย่างอิสระจากหลายแหล่งและหลายผู้ให้บริการ และแต่ละเวอร์ชันก็เคลื่อนไหวอย่างเป็นอิสระ
แต่ container OS ไม่ใช่ของที่ใช้กันแบบนั้น
การค้นหาช่องโหว่เพิ่มเติมใน “latest” เป็นงานของ นักวิจัยด้านความปลอดภัย มากกว่างานของเจ้าของระบบที่ต้องคอยนำแพตช์ upstream มาใช้ให้ทันเวลา
เป็นโปรเจกต์ที่เก่ากว่า Bottlerocket ด้วย
ถ้ามีวิธีเข้าไปผ่าน SSM หรือใช้ admin container เพื่อรันการสแกน ก็น่าจะทำแบบเดียวกันได้ไหม นี่เป็นคำถามแบบบริสุทธิ์ใจ
แค่ทำก่อน deploy อิมเมจไปยังเครื่องโฮสต์ก็พอแล้ว
Bottlerocket ไม่ได้มี FIPS mode ต่างจากดิสโทร *nix สำหรับองค์กรส่วนใหญ่
ใครที่ใช้โปรแกรม compliance ที่กำหนดให้ host OS สำหรับงานต้องมีการเข้ารหัสที่ผ่านการอนุมัติ FIPS ก็ขอให้ประหยัดเวลาไว้
เพราะเรื่องนี้ Bottlerocket จึงไม่ใช่ตัวเลือกสำหรับเรา และ issue ที่เกี่ยวข้องก็เปิดและมีความเคลื่อนไหวมานานกว่า 2 ปีแล้ว แต่ทีมพัฒนาดูไม่ค่อยมั่นใจว่ามันสำคัญ
เราได้คุยกับทีมพัฒนาผ่านผู้ดูแลบัญชี AWS โดยตรงแล้ว แต่ดูเหมือนไม่มีความตั้งใจจะเพิ่ม
เธรดที่เปิดมานานกว่า 2 ปีอยู่ที่นี่: https://github.com/bottlerocket-os/bottlerocket/issues/1667
การรองรับ FIPS ยังคงเป็นคำขอจากลูกค้าที่อยู่อันดับ 1 แบบทิ้งห่าง
แต่สำหรับดิสโทรใหม่ที่ไม่เคยมีประวัติการให้ FIPS มาก่อน จังหวะเวลาตอนนี้ไม่ดีนัก
การรับรอง FIPS 140-2 ใหม่ไม่สามารถทำได้อีกแล้ว และการรับรอง FIPS 140-3 ใหม่ก็ต้องผ่านคิวยาว เพราะทั้งอุตสาหกรรมกำลังอยู่ในช่วงเปลี่ยนผ่าน
ถ้าเป็นเรื่องที่ทีมพัฒนาผลักดันแล้วแก้ได้ ก็คงเสร็จไปแล้ว
ถ้าเราทำให้รู้สึกว่าเรื่องนี้ไม่สำคัญก็ขอโทษด้วย ความจริงมันสำคัญ แต่ในกรณีนี้ไม่ได้ช่วยเรื่องกำหนดการ
ถ้าจำเป็นก็ช่วยไม่ได้ แต่โดยส่วนตัวแล้ว การมีการรับรองนี้ถือเป็นสัญญาณลบเล็กน้อย
ความคิดแบบนี้ไม่ได้มีแค่ผมคนเดียว ทีม Microsoft Windows ก็ดูเหมือนจะมองคล้ายกัน: https://techcommunity.microsoft.com/t5/microsoft-security-ba...
แม้ FIPS เองจะไม่ได้เลวร้าย แต่ก็ควรจำไว้ว่ามันเคลื่อนไหวอยู่ท่ามกลางคนไม่ดีและสภาพแวดล้อมที่ไม่ดี https://threadreaderapp.com/thread/1433451378391883782.html
ดูน่าสนใจมาก แต่เหมือนคอมเมนต์อื่น ๆ บอกไว้ เส้นทางสำหรับรันเองโดยตรง ยังดูไม่ชัด
หน้า GitHub ก็ถูกลิงก์ไว้แค่ในหน้าหลัก
ผมหาคู่มือ VMware เจอที่นี่: https://github.com/bottlerocket-os/bottlerocket/blob/develop...
คล้ายกับทิศทางของ CoreOS มาก https://fedoraproject.org/coreos/
ไม่ว่าจะใน “Get Started” หรือ FAQ ก็ไม่มีบอก วิธีรัน เลย
เป็นโปรเจกต์ที่ดี แต่มีมาตั้งแต่ปี 2020 แล้ว: https://aws.amazon.com/about-aws/whats-new/2020/08/announcin...
สงสัยว่ามีใครใช้สิ่งนี้นอก AWS ได้สำเร็จบ้างหรือไม่
ดูค่อนข้างมีประโยชน์สำหรับกรณีใช้งานอย่าง AMD SEV-SNP
เพราะถ้าต้องการรับประกันพฤติกรรมบางอย่างของเครื่อง ก็จำเป็นต้องมีค่าการวัดของ kernel + initrd + อาร์กิวเมนต์
ตามอุดมคติแล้ว อยากใช้สิ่งนี้เป็น container hypervisor และสามารถสร้างหลักฐานยืนยันที่ผูกกับแฮชของคอนเทนเนอร์ที่กำลังรันอยู่ได้
แต่ต้องไม่มีการหลุดออกจากคอนเทนเนอร์ ซึ่งตอนนี้ไม่ค่อยแน่ใจว่าสถานะล่าสุดของด้านนี้เป็นอย่างไร
ผมคงอยากใช้ CoreOS มากกว่า
มีโอเพนซอร์สอะไรที่พวกเขาปล่อยออกมาแล้วถูกใช้กันแพร่หลายนอก AWS บ้างไหม?
ในเว็บไซต์บอกว่า OS ไม่มี shell
อย่างน้อยก็ยากจะจินตนาการถึง Docker container ที่มีประโยชน์แต่ไม่มี shell script สักตัว
ถ้าอย่างนั้นการไม่มี shell ก็หมายความว่า Bottlerocket แทบจะใช้ไม่ได้ ยกเว้นบางสถานการณ์เฉพาะกลุ่มไม่ใช่หรือ?
สิ่งที่ไม่มี shell คือเครื่อง host และถ้าดึง Docker container ที่มี shell มารันแบบมีสิทธิ์ ก็สามารถใช้ shell บน host ได้
การนำ shell binary ของเครื่อง host ไปให้คอนเทนเนอร์ที่กำลังรันบน host ใช้นั้นไม่ใช่วิธีที่พบได้ทั่วไป
แต่จะมอบความรับผิดชอบนี้ให้ admin container แทน และการเชื่อมต่อจริงจะทำผ่าน SSM/SSH ไปยังคอนเทนเนอร์นั้น
หากต้องการ root shell ที่นั่น ก็ใช้ยูทิลิตี
sheltieได้ตัวอย่างเช่น distroless
shells | containers | Bottlerocket | OS kernel