นักพัฒนามักฝังข้อมูลประจำตัวไว้ใน public หรือ private GitHub repository ซึ่งเพิ่มความเสี่ยงของข้อมูลรั่วไหล การเก็บข้อมูลประจำตัวแบบคงที่ไว้ในโฟลเดอร์ .aws/credentials บนเซิร์ฟเวอร์หรือเครื่องของผู้ดูแลระบบก็แทบไม่ต่างกัน Bruce Schneier นักเข้ารหัส นักเขียน และผู้เชี่ยวชาญด้านความปลอดภัยคอมพิวเตอร์ชาวอเมริกันกล่าวไว้ว่า “Only amateurs attack machines; professionals target people.” ดังนั้นผู้ที่ตกอยู่ในความเสี่ยงคือตัวคุณ ไม่ใช่ฮาร์ดแวร์

เมื่อคุณรันซอฟต์แวร์อันตราย อาชญากรไซเบอร์สามารถขโมยข้อมูลจากทั้งโฟลเดอร์หรือไดเรกทอรีที่เก็บข้อมูลประจำตัวของคุณ เพื่อนร่วมงาน และลูกค้าได้อย่างง่ายดาย แม้แต่ทีมสนับสนุน AWS ก็ได้รับคำร้องจำนวนมากเรื่องข้อมูลประจำตัวที่ถูกขโมยจาก public Git repositories หากคุณ commit keys อาจได้รับอีเมลภายใน 3–5 นาทีว่า IAM policy ถูกนำไปใช้แล้ว ซึ่งอาจทำให้คุณไม่สามารถลบ policy หรือเพิกถอนข้อมูลประจำตัวที่เปิดเผยได้ทันเวลา

FirstImage

แม้มาตรการเหล่านี้ก็ยังไม่แก้ปัญหา ตามรายงาน Verizon 2022 Data Breach Investigations Report จำนวนข้อมูลประจำตัวที่ถูกขโมยเพิ่มขึ้นเกือบ 30% และเป็นวิธีที่ใช้ได้ผลในการเข้าถึงองค์กรโดยไม่ได้รับอนุญาตตลอดห้าปีที่ผ่านมา ที่จริงแล้วข้อมูลประจำตัวที่ถูกขโมยเกี่ยวข้องกับการละเมิดข้อมูลเกือบครึ่งหนึ่ง

FirstImage

ในช่วง 12 เดือนที่ผ่านมา พบข้อมูลประจำตัวที่ถูกขโมยและรั่วไหลมากกว่า 31,000 รายการ ในบริษัท FTSE 100 โดยเกือบ 40% ถูกเผยแพร่ในตลาดใต้ดิน เหตุการณ์คล้ายกันเกิดขึ้นกับข้อมูลประชาชนจีนหนึ่งพันล้านรายการ ที่ถูกขโมยจากตำรวจเซี่ยงไฮ้ในฤดูร้อนปี 2022 ทั้งหมดนี้เกิดขึ้นได้เพราะข้อมูลประจำตัวถูกเปิดเผย บน CSDN เครือข่ายนักพัฒนาซอฟต์แวร์ของจีน

ส่วนที่แย่ที่สุดคือ แม้จะตรวจพบอย่างรวดเร็ว นักพัฒนาก็อาจหยุดการโจมตีไม่ทัน ผลการทดลอง honeypot แสดงว่าใช้เวลาเพียง 1 นาทีในการค้นหาข้อมูลประจำตัวที่เปิดเผยและเริ่มโจมตี กระบวนการทั้งหมดใช้เวลาไม่เกิน 4 นาทีหลังข้อมูลถูกเปิดเผย

ใช้ aws-vault เพื่อเก็บและเข้าถึง AWS Credentials อย่างปลอดภัยในสภาพแวดล้อมการพัฒนา ลิงก์ไปยังหัวข้อ

aws-vault เป็นเครื่องมือที่แก้ปัญหาข้อมูลประจำตัวถูกขโมยมานานกว่าหกปี โดยเก็บ IAM credentials ไว้ใน keystore ที่ปลอดภัย แล้วสร้างข้อมูลประจำตัวชั่วคราวให้ shell และแอปพลิเคชันใช้ keys จึงไม่ถูกฝังในโค้ดหรือเก็บแบบคงที่ ช่วยลดความเสี่ยงของข้อมูลรั่วไหล ต่อไปนี้คือปัญหาหลักสี่ข้อที่ aws-vault แก้ไข:

  • รักษาความปลอดภัยการเข้าถึงผลิตภัณฑ์ที่อยู่ระหว่างการพัฒนา วิศวกรที่ทำงานบนโซลูชันดิจิทัลสามารถรันการทดสอบโดยไม่ต้อง commit keys ใน public Git repos แม้ว่าคุณจะ commit ความลับใน private Git repo ก็ยังเสี่ยงด้านความปลอดภัย เพราะจะไม่มีการแจ้งเตือน คุณจะรู้เรื่องเหตุการณ์เมื่อผลิตภัณฑ์ของคุณเปิดให้สาธารณะเข้าถึง เช่น หากคุณกำลังจะเริ่มการนำเสนอแต่การเข้าถึงโซลูชันถูกบล็อก
  • ควบคุมประเภทข้อมูลประจำตัวที่ใช้ ปัญหาทั่วไปคือนักพัฒนาไม่ทราบว่าแอปใช้ข้อมูลประจำตัวประเภทใด อาจเป็นข้อมูลในเครื่อง แบบคงที่ซึ่งฝังในโค้ด environment variables, EC2 Instance profiles หรือ ECS task roles โดย aws-vault สามารถเติม environment variables และจำลอง EC2 metadata server หรือ ECS credential server ได้

FirstImage

  • ให้การเข้าถึงหลายแอปอย่างราบรื่น การใช้หลายบัญชีเป็นเรื่องปกติ แต่ละบัญชีมีสิทธิ์ต่างกัน หากไม่ฝังข้อมูลในโค้ด คุณต้องกำหนดว่าจะเก็บและแจกจ่ายข้อมูลประจำตัวในทีมอย่างปลอดภัยอย่างไร aws-vault ส่งข้อมูลประจำตัวแบบไดนามิกที่หมดอายุในเวลาไม่นาน จึงลดช่วงเวลาที่ผู้โจมตีจะใช้ประโยชน์ได้
  • ใช้งานร่วมกับหลายแอปได้สะดวก เนื่องจากข้อมูลประจำตัวอยู่ใน environment variables เครื่องมือโครงสร้างพื้นฐานที่ใช้ AWS SDK เช่น Terraform จึงเรียกใช้ได้ง่าย หากต้องการปิด session ทั้งหมดให้รันคำสั่ง exit แอปจะรีเฟรชข้อมูลประจำตัวแบบไดนามิกโดยอัตโนมัติเมื่อจำเป็น

วิธีฝึกใช้ aws-vault ลิงก์ไปยังหัวข้อ

มีแนวโน้มว่าปัจจุบัน login และรหัสผ่านของคุณถูก hardcoded คุณอาจเชื่อว่านี่เป็นวิธีที่สะดวกในการแชร์รหัสผ่านกับทีมโดยไม่ต้องส่งด้วยตนเอง ดังนั้นโค้ดของคุณจึงเป็นดังนี้:

FirstImage

ในกรณีนี้ข้อมูลของคุณอาจถูกขโมยและนำไปใช้ในทางที่ผิดได้ง่าย ต่อไปนี้คือคำแนะนำสั้น ๆ เพื่อเพิ่มความปลอดภัยของข้อมูลประจำตัวด้วย aws-vault:

  • สร้างบัญชี AWS หากคุณยังไม่มี สร้าง IAM user และกำหนด roles ซึ่งอนุญาตให้คุณเข้าถึง keys ที่ใช้กับ API หรือ CLI ตั้ง secret keys รหัสผ่าน และสิทธิ์การกระทำและการเข้าถึง
  • หากคุณใช้หลาย AWS profiles ให้สมมติสิทธิ์ชั่วคราวสำหรับแต่ละโปรไฟล์ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับวิธีทำได้ ที่นี่

เมื่อตั้งค่าเสร็จ คุณสามารถสร้าง environment credentials ด้วย aws-vault สมมติว่ามี แอป JavaScript แบบพื้นฐาน สำหรับทดสอบ คุณสั่งให้ vault นำข้อมูลประจำตัวแบบไดนามิกเข้าไปในสภาพแวดล้อมการพัฒนาเพื่อรันแอป จากนั้นแอป JavaScript จะรับข้อมูลประจำตัวผ่าน AWS SDK

FirstImage

กระบวนการเดียวกันใช้ส่ง environment credentials ให้ Docker ได้ เพียงปรับคำสั่ง Docker เล็กน้อยก็จะได้รับข้อมูลประจำตัวผ่าน environment variables

FirstImage

aws-vault ยังช่วยให้คุณ จำลอง ECS credential server และ EC2 Instance Profile ได้ เช่น เมื่อใช้ส่งข้อมูลประจำตัวให้ docker-compose aws-vault จะจำลองเซิร์ฟเวอร์ที่ให้บริการข้อมูลประจำตัวในเครื่องด้วยโทเค็นเฉพาะแบบเดียวกับ ECS โดยไม่ต้องส่ง access key และ session token โดยตรง

FirstImage

FirstImage

หากต้องการจำลอง EC2 Instance Profile เครื่องมือจะรัน proxy ในเครื่องและต้องใช้สิทธิ์ root จากนั้นแอปจะได้รับ EC2 metadata credentials

FirstImage

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับตัวอย่างทั้งหมดที่อธิบายไว้ได้ที่นี่: https://github.com/cageyv/aws-vault-examples

ประโยชน์ของ aws-vault ลิงก์ไปยังหัวข้อ

นี่คือประโยชน์หลักของการใช้ aws-vault

  • ฟังก์ชันการทำงานที่เรียบง่าย ใช้เวลาเพียงไม่กี่นาทีในการเริ่มใช้เครื่องมือ โดยพื้นฐานคุณต้องสร้างบัญชี ตั้งค่า IAM และ roles, secret keys และรหัสผ่านเพื่อเริ่มต้น
  • ความปลอดภัย ข้อมูลประจำตัวแบบไดนามิกหมดอายุในเวลาไม่นาน จึงลดความเสี่ยงแม้ถูกขโมย ผู้โจมตีไม่สามารถเก็บไว้รอใช้ภายหลังได้ง่าย นอกจากนี้ หากบริษัทใช้ AWS Single Sign-On (SSO), aws-vault ยังใช้ข้อมูลประจำตัวที่กำหนดโดย AWS SSO CLI v2 ได้
  • ความสะดวก AWS SDK รองรับ credential chain โดยค่าเริ่มต้น คุณไม่ต้องเพิ่มการตั้งค่า และแอปจะรีเฟรชข้อมูลประจำตัวแบบไดนามิกหากหมดอายุระหว่าง session
  • การทดสอบในเครื่อง Aws-vault ช่วยให้คุณทดสอบแอปในสภาพแวดล้อมที่จะเปิดตัวก่อนปล่อย คุณสามารถตรวจจับบั๊กและแก้ไขได้โดยไม่ต้องดีพลอยหรือให้สิทธิ์เข้าถึงกับแอดมินหรือ DevOps

อีกบริการหนึ่งที่ช่วยพัฒนาและทดสอบแอปแบบออฟไลน์คือ LocalStack ซึ่งมีทั้งเวอร์ชันฟรีและแบบชำระเงิน และจำลองบริการ AWS จำนวนมากในเครื่องโดยไม่ต้องเข้าถึงคลาวด์ ช่วยให้เขียนโค้ดได้ราบรื่นและมุ่งเน้นเป้าหมายทางธุรกิจได้มากขึ้น เช่นเดียวกับ aws-vault ที่ช่วยส่งต่อข้อมูลประจำตัว ลดความเสี่ยงของข้อมูลสำคัญรั่วไหล และลดเวลาที่ต้องคิดว่าจะส่ง keys อย่างไรโดยไม่ฝังไว้ในโค้ด