Amazon Cloud เติมเงิน: วิธีการจัดการกระจก Docker ของคุณอย่างปลอดภัยโดยใช้ AWS ECR (Elastic Container Mirror)
วันนี้เมื่อสถาปัตยกรรมคลาวด์เนทีฟและไมโครเซอร์วิสแย่มากมิเรอร์ Docker ได้กลายเป็นตู้คอนเทนเนอร์มาตรฐานสำหรับการส่งมอบรหัสมานานแล้ว
เมื่อหลายทีมเริ่มมีส่วนร่วมในคอนเทนเนอร์เป็นครั้งแรกเพื่อประหยัดปัญหาพวกเขาโยนมิเรอร์ภายในของบริษัทลงใน Docker Hub สาธารณะโดยตรงหรือสร้างรีจิสทรีโอเพนซอร์สที่เรียบง่ายมากบนเซิร์ฟเวอร์ผลลัพธ์อาจเป็นเพราะไม่ได้รับการจัดสรรสิทธิ์คลังสินค้าสาธารณะซึ่งนำไปสู่การรั่วไหลของรหัสธุรกิจหลักหรือเนื่องจากคลังสินค้าที่สร้างขึ้นเองขาดการบำรุงรักษาและจะติดขัดโดยตรงเมื่อพบสตรีมแบบดึงพร้อมกันสูงและแม้แต่การสแกนช่องโหว่ของมิเรอร์ก็ไม่สามารถทำได้
ในระบบนิเวศของ AWS (Amazon Cloud Technology) งานที่เรียกว่า
Amazon ECR(Elastic Container Registry, ที่เก็บกระจกภาชนะยืดหยุ่น)
。ไม่เพียงแต่เปิดระบบรักษาความปลอดภัย (IAM) ของ AWS เท่านั้นแต่ยังมาพร้อมกับการสแกนช่องโหว่ระดับผู้ผลิตรายใหญ่และความสามารถในการจำลองแบบทั่วโลก
วันนี้เราจะไม่พูดเรื่องไร้สาระตัดตรงจากการต่อสู้จริงและสอนวิธีใช้กฎระเบียบด้านความปลอดภัยของโรงงานขนาดใหญ่เพื่อเชื่อมตำแหน่งป้องกันมิเรอร์ตู้คอนเทนเนอร์ส่วนตัวที่ไม่สามารถทำลายได้บน AWS ECR
ขั้นตอนแรก: ทำความเข้าใจแนวคิดหลักระดับองค์กรของ ECR
ก่อนที่จะผลักดันคุณต้องเข้าใจรากฐานเครือข่ายของ ECR อย่าตีเหมือนแมลงวันหัวขาดโครงสร้างของ ECR มีความชัดเจนมากโดยส่วนใหญ่ประกอบด้วยสามระดับหลักดังต่อไปนี้:
Registry: นี่คือค่ายของคุณบัญชี AWS แต่ละบัญชีมีรีจิสทรีส่วนตัวเริ่มต้นในทุกภูมิภาค (ภูมิภาค) ชื่อโดเมนที่เข้าถึงได้มักจะมีรูปร่างเหมือน123456789012.dkr.ecr.us-east-1.amazonaws.com (หมายเลขก่อนหน้าคือ ID บัญชี AWS ของคุณ)
ที่เก็บข้อมูล: นี่คือ "คลังมิเรอร์" ที่เฉพาะเจาะจงตัวอย่างเช่นหากแอปพลิเคชันของคุณเรียกว่า user-service คุณต้องสร้างไลบรารีที่เรียกว่า user-service ภายใต้รีจิสทรีซึ่งมีมิเรอร์ทุกเวอร์ชันของบริการนี้ตั้งแต่ v1.0ถึง v2.5
กลยุทธ์ IAM และการจัดการวงจรชีวิต: นี่คือยามรักษาความปลอดภัยและทำความสะอาดตัดสินใจว่าใครสามารถดึงสตรีมได้ใครสามารถผลักดันสตรีมได้และใช้เวลานานแค่ไหนในการล้างภาพสะท้อนในอดีตที่หมดอายุโดยอัตโนมัติ
ขั้นตอนที่สอง: แบบฝึกหัดการต่อสู้จริง1-สร้างที่เก็บข้อมูลส่วนตัวที่ปลอดภัย
ลงชื่อเข้าใช้ของคุณ
คอนโซล AWS
ค้นหาและป้อน
ECR
บริการคลิกที่เมนูด้านซ้ายของ "การจัดเก็บ (การจัดเก็บข้อมูล)"-> คลิก
"สร้างที่เก็บข้อมูล (Create repository)"
。
การกำหนดค่าการเชื่อมพารามิเตอร์ที่สำคัญ (กำหนดระดับความปลอดภัยของกระจกของคุณ):
การตั้งค่าการมองเห็น (การตั้งค่าการมองเห็น): ไม่ลังเลที่จะเลือก "ส่วนตัว (ส่วนตัว)
) ". เว้นแต่คุณจะต้องการเผยแพร่โอเพ่นซอร์สมิเรอร์ภายในขององค์กรจะไม่ได้รับอนุญาตให้เปิดเผยต่อสาธารณะ
แท็กไม่สามารถเปลี่ยนแปลงได้: ขอแนะนำให้เปิด "ไม่เปลี่ยนรูป" ประวัติการหลีกเลี่ยงเลือดและน้ำตาของ Dachang: หากคุณเก็บค่าเริ่มต้น "Mutable" ไว้ผู้ทดสอบจะวางกระจกที่มีข้อบกพร่องบนแท็ก latest และ latest เวอร์ชันเสถียรของบรรทัดก่อนหน้าจะถูกเขียนทับหลังจากเปิดความไม่เปลี่ยนรูปเมื่อ v1.0ครอบครองหลุมแล้วไม่มีใครอยากเขียนทับด้วยแท็กที่มีชื่อเดียวกันเวอร์ชันสามารถเพิ่มหมายเลขเวอร์ชันได้อย่างตรงไปตรงมา (เช่น v1.1) และภาพออนไลน์จะถูกลบออกจากแหล่งที่มาโศกนาฏกรรมของการเปลี่ยนแปลงโดยไม่ได้ตั้งใจ
Scan on push: เปิดอย่างเด็ดขาดหลังจากเปิดเครื่องทุกครั้งที่คุณดันมิเรอร์ไปที่ ECR แบ็กเอนด์ AWS จะเรียกไลบรารีช่องโหว่ที่เชื่อถือได้แบบโอเพนซอร์สโดยอัตโนมัติ (หรือ Amazon Inspector ขั้นสูง) เพื่อสแกนส่วนประกอบของระบบปฏิบัติการในมิเรอร์ของคุณในเชิงลึกเพื่อดูว่ามีช่องโหว่ด้านความปลอดภัยที่ร้ายแรง (CVE) หรือไม่และให้คำเตือนสีแดงและสีเหลืองบนคอนโซล
ขั้นตอนที่สาม: การฝึกซ้อมการต่อสู้จริงสอง-Docker ในพื้นที่เปิดใช้งาน ECR อย่างสมบูรณ์
คลังสินค้าถูกสร้างขึ้น (สมมติว่าเป็นชื่อ
My-app
) เราจะส่งมิเรอร์ Docker ที่บรรจุบนคอมพิวเตอร์ภายในเครื่องไปยังระบบคลาวด์ได้อย่างไร?
หลายคนจะพบหลุมใหญ่แห่งแรกที่นี่: ดำเนินการโดยตรง
Docker login
ป้อนรหัสผ่านบัญชีของ AWS และได้รับแจ้งให้ปฏิเสธการเข้าสู่ระบบเพราะ
ECR ไม่รู้จักรหัสผ่าน AWS ธรรมดาของคุณเลยโดยใช้โทเค็นที่สร้างขึ้นแบบไดนามิก (Token)
。
โปรดตรวจสอบให้แน่ใจว่าคอมพิวเตอร์ในเครื่องของคุณได้รับการกำหนดค่าแล้ว
AWS CLI (เครื่องมือบรรทัดคำสั่ง)
และมีสิทธิ์ IAM ตามกฎหมายเปิดเทอร์มินัลและผ่านสามขั้นตอน:
ขั้นตอนที่1: รับโทเค็นการเข้าสู่ระบบแบบไดนามิกและฉีดเครื่องยนต์ Docker
ดำเนินการคำสั่งผสมต่อไปนี้ (แทนที่ ID บัญชีและภูมิภาคด้วยของคุณเอง):
แบช
Aws ecr get-login-password -- region us-fast-1 | docker login -- username AWS -- password-stdi n 123456789012.dkr.ecr.us-east-1.amazonaws.com
ถ้าหน้าจอกระโดดออกมา
Login Succeeded
ซึ่งหมายความว่า Docker ในพื้นที่ของคุณได้รับบัตรผ่านการรักษาความปลอดภัยนานถึง12ชั่วโมงและเชื่อมต่อกับระบบคลาวด์ได้สำเร็จ
ขั้นตอนที่2: ให้กระจกท้องถิ่น "รอยสัก" (แท็ก)
สมมติว่าคุณมีมิเรอร์ที่คอมไพล์ใหม่ในเครื่องที่เรียกว่า
Local-app:v1.0
。คุณต้องตั้งชื่อระบบคลาวด์มาตรฐานใหม่ตามข้อกำหนดของ ECR มิฉะนั้น Docker จะไม่พบ
ถนน:
แบช
Docker tag local-app:v1.0 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:v1.0
ขั้นตอนที่3: ผลักดันสตรีมเต็มรูปแบบ
แบช
Docker pus h 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:v1.0
มาพร้อมกับเทอร์มินัลที่คุ้นเคย
Pushed
แถบความคืบหน้ามิเรอร์ของคุณได้ข้ามเครือข่ายและวางอยู่ในส่วนลึกของที่เก็บข้อมูลความปลอดภัยแบบกระจายของ AWS
ขั้นตอนที่สี่: การเล่นเกมขั้นสูงระดับองค์กร-การจัดการคลังสินค้าที่มีงบประมาณน้อยที่สุดและความปลอดภัยสูงสุด
การผลักดันมิเรอร์เป็นเพียงขั้นตอนแรกในสภาพแวดล้อมการผลิตจริงสถาปนิกปฏิบัติการและการบำรุงรักษามักจะเพิ่มแนวป้องกันสองแนว:
1.จ้างทำความสะอาดฟรี: กลยุทธ์วงจรชีวิต (Lifecycle Policy)
ทีมพัฒนามักจะสร้างภาพสะท้อนทุกวันและทุกครั้งที่มีการเปิดตัวจะมีการสร้างภาพสะท้อนประวัติศาสตร์หลาย GB หากไม่มีข้อจำกัดมิเรอร์ใน ECR จะกองพะเนินเทินทึกเหมือนภูเขาและใบเรียกเก็บเงินที่เก็บไว้ AWS ในช่วงปลายเดือนอาจทำให้คุณเจ็บปวดได้
ทำลายการกำหนดค่า: ในหน้ารายละเอียดที่เก็บข้อมูล ECR ให้คลิก "กลยุทธ์วงจรชีวิต"-> สร้างกฎ
ตรรกะกฎ: สร้างกฎ "ล้างกระจกที่ล้าสมัย" ตัวอย่างเช่น: "สำหรับมิเรอร์ชั่วคราวที่ไม่มีป้ายกำกับเวอร์ชันใดเวอร์ชันหนึ่ง (Untagged) ตราบใดที่เกิน14วันจะถูกทำลายโดยอัตโนมัติ" หรือ "เก็บมิเรอร์เวอร์ชันล่าสุด30เวอร์ชันล่าสุดและเวอร์ชันเก่าจะถูกลบโดยอัตโนมัติ"
ปล่อยให้ระบบช่วยคุณออกจากระบบโดยอัตโนมัติซึ่งสามารถช่วยให้สินทรัพย์ระบบคลาวด์ของบริษัทประหยัดค่าใช้จ่ายในการจัดเก็บข้อมูลได้มาก
2.การจำลองแบบอัตโนมัติข้ามภูมิภาค (Cross-Region Replication)
หากธุรกิจของคุณกระจายไปทั่วโลก (เช่นโตเกียวและเวอร์จิเนียมีคลัสเตอร์คอนเทนเนอร์ EKS ที่ทำงานอยู่) หากคลัสเตอร์ของโตเกียวต้องข้ามมหาสมุทรไปยัง ECR ของสหรัฐอเมริกาทุกครั้งเพื่อดึงภาพขนาดใหญ่สองสาม GB ความล่าช้าของเครือข่ายและค่าธรรมเนียมการรับส่งข้อมูลข้ามภูมิภาคจะสูงมากจนคุณขัดข้อง
การดำเนินการระดับสูง: ในการตั้งค่ารีจิสทรี ECR ให้เปิด "การจำลองแบบข้ามภูมิภาค"
เรื่องราวภายในด้านล่าง: คุณสามารถกำหนดค่าเป็น: ตราบใดที่ฉันดันมิเรอร์ไปที่คลังสินค้า US-East-1ในสหรัฐอเมริกาเครือข่ายกระดูกสันหลังด้านล่างของ AWS จะซิงโครไนซ์มิเรอร์ไปยังคลังสินค้าที่มีชื่อเดียวกันใน Tokyo ap-northeast-1โดยอัตโนมัติด้วยความเร็วที่รวดเร็วมากในพื้นหลังคลัสเตอร์ทั้งสองฝั่ง "ดึงสตรีมใกล้เคียง" ในห้องคอมพิวเตอร์ที่แปลเป็นภาษาท้องถิ่นความเร็วเพิ่มขึ้นสิบเท่าและยังช่วยลดค่าธรรมเนียมการรับส่งข้อมูลข้ามพรมแดนเครือข่ายสาธารณะที่มีราคาแพง
ขั้นตอนที่ห้า: ประวัติเลือดและน้ำตาของการหลีกเลี่ยง陷阱ในการปฏิบัติการและบำรุงรักษาประจำวัน
ECS / EKS ดึงข้อผิดพลาดสิทธิ์สตรีม (ImagePullBackOff): เมื่อคุณอยู่ใน AWS บริการคอนเทนเนอร์ของคุณเอง (เช่น ECS หรือ EKS
เมื่อปรับใช้แอปพลิเคชันใน) มักพบข้อผิดพลาดที่โหนดไม่สามารถดึงอิมเมจ ECR ได้99% ของเหตุผลเป็นเพราะคุณไม่ได้ให้สิทธิ์ IAM นี้กับ ECS Task Role หรือ EKS Node Role โปรดจำไว้ว่าแม้ใน AWS บริการจะถูกสร้างขึ้นโดยค่าเริ่มต้นและไม่ได้เชื่อมต่อกันและต้องได้รับอนุญาตอย่างชัดเจน
ทางเลือกสำหรับการเข้ารหัสคีย์ KMS: ECR จะจัดเก็บข้อมูลที่เข้ารหัสแบบ end-to-end ของมิเรอร์ของคุณโดยค่าเริ่มต้นหากคุณมีความต้องการสูงสำหรับการปฏิบัติตามกฎระเบียบคุณสามารถเปลี่ยนไปใช้การเข้ารหัสคีย์ AWS KMS (CMK) ที่กำหนดเองได้แต่ควรสังเกตว่าหากคุณใช้คีย์ที่กำหนดเองเมื่อบัญชีหรือบริการอื่นดึงมิเรอร์ข้ามทีมไม่เพียงแต่ต้องเปิดสิทธิ์ ECR เท่านั้นแต่ยังต้องเปิดสิทธิ์การถอดรหัสของคีย์ KMS ด้วยมิฉะนั้นการดึงสตรีมจะยังคงล้มเหลว
สรุป
ในยุคดั้งเดิมของคลาวด์โกดังมิเรอร์คือคลังแสงของคุณการใช้ AWS ECR เพื่อจัดการมิเรอร์ Docker ความลับหลักอยู่ในสามจุด:
ใช้ป้ายกำกับที่ไม่เปลี่ยนรูป (Immutable) เพื่อรักษาบรรทัดล่างสุดของเวอร์ชันใช้ Lifecycle Policy เพื่อรัดเข็มขัดเพื่อประหยัดเงินและสุดท้ายใช้ IAM และกลยุทธ์ที่เก็บข้อมูลเพื่อปิดกั้นสิทธิ์การเข้าถึง
เชื่อมข้อกำหนดชุดนี้เข้ากับสายการประกอบอัตโนมัติ CI/CD ของคุณจากนั้นไม่ว่าธุรกิจของคุณจะขยายตัวอย่างไรและจะถูกโยนทิ้งไปทั่วโลกอย่างไรสินทรัพย์รหัสด้านหลังของคุณจะมั่นคงเหมือนหิน

