Role, ข้อมูลรับรองชั่วคราว และ SigV4

การใช้ AWS Security สำหรับนักพัฒนา

Rahul Singh

Technical Product Manager

คีย์ที่ยังอยู่แม้งานจะจบแล้ว

เพื่อให้ทำงานเร็วขึ้น มีการสร้างคีย์ในสคริปต์และเก็บไว้ในไฟล์คอนฟิก

ภายในไฟล์นั้นคีย์นี้

  • ไม่เคยหมุนเวียน
  • ไม่เคยเพิกถอน
  • ไม่เคยหมดอายุ

หนึ่งแอคเซสคีย์แพร่กระจายไปยังตำแหน่งจัดเก็บหกแห่ง พร้อมแกนเวลาทางด้านขวาที่แสดงว่ายังใช้งานได้จนถึงเดือนที่สิบแปด

การใช้ AWS Security สำหรับนักพัฒนา

คีย์ที่ยังอยู่แม้งานจะจบแล้ว

เพื่อให้ทำงานเร็วขึ้น มีการสร้างคีย์ในสคริปต์และเก็บไว้ในไฟล์คอนฟิก

ภายในไฟล์นั้นคีย์นี้:

  • ไม่เคยหมุนเวียน
  • ไม่เคยเพิกถอน
  • ไม่เคยหมดอายุ

 

ผ่านไป 18 เดือน มันยังคงใช้งานได้

หนึ่งแอคเซสคีย์แพร่กระจายไปยังตำแหน่งจัดเก็บหกแห่ง พร้อมแกนเวลาทางด้านขวาที่แสดงว่ายังใช้งานได้จนถึงเดือนที่สิบแปด

การใช้ AWS Security สำหรับนักพัฒนา

ข้อมูลรับรองที่หมดอายุได้เอง

ตั้งค่าให้หมดอายุเป็นค่าเริ่มต้นด้วย AWS STS

  1. ขอ role แล้วรับข้อมูลรับรองที่มีนาฬิกาในตัว

  2. Security Token Service (STS): แนบวันหมดอายุมาด้วย ค่าเริ่มต้นคือหนึ่งชั่วโมง

แอปพลิเคชันเรียก AssumeRole ไปยัง AWS STS แล้ว STS ส่งข้อมูลรับรองที่มีนาฬิกาในตัวกลับมา

การใช้ AWS Security สำหรับนักพัฒนา

ข้อมูลรับรองที่หมดอายุได้เอง

ตั้งค่าให้หมดอายุเป็นค่าเริ่มต้นด้วย AWS STS

  1. ขอ role แล้วรับข้อมูลรับรองที่มีนาฬิกาในตัว

  2. ข้อมูลรับรองชั่วคราวขึ้นต้นด้วย ASIA และมี session token ติดมาด้วย

  3. Security Token Service (STS): แนบวันหมดอายุมาด้วย ค่าเริ่มต้นคือหนึ่งชั่วโมง

แอปพลิเคชันเรียก AssumeRole ไปยัง AWS STS และได้รับข้อมูลรับรองที่มีนาฬิกาในตัว ด้านล่างแสดงข้อมูลรับรองสองแบบเทียบกัน ได้แก่ คีย์ระยะยาวที่ขึ้นต้นด้วย AKIA ซึ่งไม่มี session token และไม่หมดอายุ กับข้อมูลรับรองชั่วคราวที่ขึ้นต้นด้วย ASIA ซึ่งมี session token และหมดอายุภายในหนึ่งชั่วโมง

การใช้ AWS Security สำหรับนักพัฒนา

ข้อมูลรับรองที่หมดอายุได้เอง

ตั้งค่าให้หมดอายุเป็นค่าเริ่มต้นด้วย AWS STS

  1. ขอ role แล้วรับข้อมูลรับรองที่มีนาฬิกาในตัว

  2. ข้อมูลรับรองชั่วคราวขึ้นต้นด้วย ASIA และมี session token ติดมาด้วย

  3. การเรียกแบบเดียวกันถูกยอมรับในตอนแรก แล้วต่อมาก็ไม่ถูกยอมรับ

  4. Security Token Service (STS): แนบวันหมดอายุมาด้วย ค่าเริ่มต้นคือหนึ่งชั่วโมง

แอปพลิเคชันเรียก AssumeRole ไปยัง AWS STS และได้รับข้อมูลรับรองที่มีนาฬิกาในตัว ด้านล่างแสดงคีย์ระยะยาวที่ขึ้นต้นด้วย AKIA ซึ่งไม่หมดอายุ เทียบกับข้อมูลรับรองชั่วคราวที่ขึ้นต้นด้วย ASIA ซึ่งมี session token และหมดอายุภายในหนึ่งชั่วโมง ด้านล่างสุดแสดงการเรียก GetObject แบบเดียวกัน โดยได้ผลลัพธ์ 200 OK ตอนสิบนาฬิกา และ ExpiredToken ตอนสิบเอ็ดนาฬิกาห้านาที

การใช้ AWS Security สำหรับนักพัฒนา

โค้ดหาข้อมูลรับรองได้อย่างไร

ตรวจสอบ credential provider chain

  • AWS SDK ซึ่งเป็นไลบรารีในโค้ดเป็นตัวค้นหา
  • รายการคงที่ ตรวจสอบตามลำดับ
  • หยุดที่รายการแรกที่ตรงกัน

ลำดับการค้นหาข้อมูลรับรอง: คีย์ที่ส่งในโค้ดถูกขีดฆ่าอยู่เหนือ chain จากนั้นการค้นหาจะไล่ลงไปตามตัวแปรสภาพแวดล้อม ไฟล์คอนฟิก และข้อมูลรับรองของคอนเทนเนอร์ โดยหยุดที่รายการแรกที่ตรงกันและไม่ไปถึง instance metadata

การใช้ AWS Security สำหรับนักพัฒนา

โค้ดหาข้อมูลรับรองได้อย่างไร

ตรวจสอบ credential provider chain

  • AWS SDK ซึ่งเป็นไลบรารีในโค้ดเป็นตัวค้นหา
  • รายการคงที่ ตรวจสอบตามลำดับ
  • หยุดที่รายการแรกที่ตรงกัน

 

คีย์ที่ฝังในโค้ดถูกตรวจสอบก่อน จึงต้องลบทิ้ง

ลำดับการค้นหาข้อมูลรับรอง: คีย์ที่ส่งในโค้ดถูกขีดฆ่าอยู่เหนือ chain จากนั้นการค้นหาจะไล่ลงไปตามตัวแปรสภาพแวดล้อม ไฟล์คอนฟิก และข้อมูลรับรองของคอนเทนเนอร์ โดยหยุดที่รายการแรกที่ตรงกันและไม่ไปถึง instance metadata

การใช้ AWS Security สำหรับนักพัฒนา

ไล่ chain ทีละขั้น

1. explicit      a key passed in your code
2. environment   AWS_* variables, and on Lambda
                 that is the execution role
3. config file   ~/.aws/credentials
4. container     ECS or EKS task role
5. instance      EC2 instance profile, via IMDS
  • รายการที่ตรงกันเป็นรายการแรกจะถูกใช้
  • ลบคีย์ที่เก็บไว้ แล้วการค้นหาจะดำเนินต่อไปยัง role
การใช้ AWS Security สำหรับนักพัฒนา

พิสูจน์ตัวตนจากภายนอก AWS

pipeline โค้ดมักรันอยู่นอก AWS จึงไม่สามารถแนบ credential chain ได้

  • รันบน GitHub หรือ GitLab
  • ไม่มีอะไรให้ chain ค้นพบ

CI runner และแพลตฟอร์มของมันวาดอยู่นอกขอบเขตของ AWS โดย runner ถูกระบุว่าไม่มี role ให้แนบ และแพลตฟอร์มลงนามโทเค็น OIDC ที่ระบุ repository และ workflow หนึ่งรายการ

การใช้ AWS Security สำหรับนักพัฒนา

พิสูจน์ตัวตนจากภายนอก AWS

pipeline โค้ดมักรันอยู่นอก AWS จึงไม่สามารถแนบ credential chain ได้

  • รันบน GitHub หรือ GitLab
  • ไม่มีอะไรให้ chain ค้นพบ

 

โทเค็น OIDC (OpenID Connect)

  • ลงนามแล้วและมีอายุสั้น
  • เป็นการยืนยันตัวตน ไม่ใช่ข้อมูลรับรอง

CI runner และแพลตฟอร์มของมันวาดอยู่นอกขอบเขตของ AWS โดย runner ถูกระบุว่าไม่มี role ให้แนบ และแพลตฟอร์มลงนามโทเค็น OIDC ที่ระบุ repository และ workflow หนึ่งรายการ

การใช้ AWS Security สำหรับนักพัฒนา

กฎแทนที่คีย์ที่เก็บไว้

โทเค็น OIDC ที่ระบุ repository ถูกแลกเปลี่ยนผ่าน AssumeRoleWithWebIdentity เพื่อรับข้อมูลรับรองชั่วคราวที่หมดอายุภายในหนึ่งชั่วโมง เนื่องจาก trust policy ของ role ได้ระบุ issuer และ repository นั้นไว้แล้ว

แลกโทเค็นเป็นข้อมูลรับรอง

การใช้ AWS Security สำหรับนักพัฒนา

กฎแทนที่คีย์ที่เก็บไว้

โทเค็น OIDC ที่ระบุ repository ถูกแลกเปลี่ยนผ่าน AssumeRoleWithWebIdentity เพื่อรับข้อมูลรับรองชั่วคราวที่หมดอายุภายในหนึ่งชั่วโมง เนื่องจาก trust policy ของ role ได้ระบุ issuer และ repository นั้นไว้แล้ว

แลกโทเค็นเป็นข้อมูลรับรอง

  • AssumeRoleWithWebIdentity: คือ AssumeRole ที่ใช้โทเค็นจากภายนอกเป็นหลักฐาน
  • Trust policy: เขียนไว้บน role ล่วงหน้า ไม่ได้เก็บไว้ใน pipeline
  • Claim: ข้อเท็จจริงหนึ่งอย่างในโทเค็น
  • Issuer ถูกใช้ร่วมกันโดยทุก repository บนแพลตฟอร์ม จึงต้องระบุ repository ด้วย

Repository secrets: ว่างเปล่าแล้ว

การใช้ AWS Security สำหรับนักพัฒนา

ทุกคำขอถูกลงนาม

Signature Version 4 หรือ SigV4

  • พิสูจน์ว่าข้อมูลรับรองใดเป็นผู้ส่งคำขอ
  • พิสูจน์ว่าคำขอไม่ถูกแก้ไขระหว่างทาง
  • ลงนามโดย CLI และ SDK ทุกครั้งที่เรียกใช้

ขั้นตอนการลงนามที่คำขอและข้อมูลรับรองสร้างลายเซ็นส่งไปใน Authorization header ซึ่ง AWS จะคำนวณใหม่และเปรียบเทียบ หากตรงกันจะยอมรับ หากไม่ตรงกันจะส่งคืน SignatureDoesNotMatch

การใช้ AWS Security สำหรับนักพัฒนา

ลายเซ็นที่ส่งต่อให้คนอื่นได้

ข้อมูลรับรองชั่วคราว

  • ดำเนินการได้หลายอย่าง ตามขอบเขตของ role
  • ถือครองโดยโค้ด

โค้ดเรียกใช้บริการ AWS สี่แบบ ได้แก่ S3, DynamoDB, SQS และ KMS ด้วยข้อมูลรับรองชั่วคราว

การใช้ AWS Security สำหรับนักพัฒนา

ลายเซ็นที่ส่งต่อให้คนอื่นได้

ข้อมูลรับรองชั่วคราว

  • ดำเนินการได้หลายอย่าง ตามขอบเขตของ role
  • ถือครองโดยโค้ด

Pre-signed URL

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

โค้ดเรียกใช้บริการ AWS สี่แบบ ได้แก่ S3, DynamoDB, SQS และ KMS ด้วยข้อมูลรับรองชั่วคราว

เบราว์เซอร์ของคนอื่นเข้าถึงอ็อบเจกต์หนึ่งรายการผ่านเส้นทางเดียว โดยมีนาฬิกาที่แสดงวันหมดอายุที่กำหนดไว้

การใช้ AWS Security สำหรับนักพัฒนา

มาฝึกกันเถอะ!

การใช้ AWS Security สำหรับนักพัฒนา

Preparing Video For Download...