การอนุญาตสิทธิ์เข้าถึงบริการด้วย IAM

การ Deploy แอปพลิเคชันบน AWS

Dunieski Otano

Amazon Web Services Solutions Architect

Key ใน commit

  • Access key ที่มีอายุยาวนานถูก commit ลง repo
  • บอตสแกนเนอร์พบและทำให้ค่าใช้จ่ายพุ่งสูง
  • Role และ least privilege ช่วยป้องกันปัญหานี้

AWS access key ที่รั่วไหลโดยไม่ตั้งใจใน code commit ถูกตั้งค่าสถานะว่าเป็นความเสี่ยงด้านความปลอดภัย

การ Deploy แอปพลิเคชันบน AWS

IAM principals: users, roles และ policies

ไดอะแกรม IAM 3 คอลัมน์: Principal (ผู้ใช้ บริการ หรือ Role) ทางซ้าย, Policy document พร้อม Allow/Deny ตรงกลาง, IAM Role พร้อม temporary credentials ทางขวา

  • Principal: ผู้ส่ง request
  • Policy: เอกสาร JSON สำหรับกำหนดสิทธิ์
  • Role: ชุดสิทธิ์ที่ entity สามารถรับไปใช้ได้
  • Role ถูก assume; ผู้ใช้จะถือ credentials ที่มีอายุยาว
การ Deploy แอปพลิเคชันบน AWS

การใช้ programmatic credentials อย่างถูกต้อง

  • Lambda: execution role กำหนดสิทธิ์
  • EC2: instance profile ส่ง credentials ของ role
  • ECS: task role จำกัดสิทธิ์ต่อ task
  • ไม่มี access key อายุยาวในโค้ดหรือ config

บริการ AWS compute 3 รายการที่ใช้ role โดยไม่ต้องมี long-lived key: Lambda พร้อม execution role, EC2 พร้อม instance profile และ ECS พร้อม task role โดยแต่ละรายการแสดงการหมุนเวียน credentials อัตโนมัติ

การ Deploy แอปพลิเคชันบน AWS

AssumeRole และ STS

  • STS AssumeRole: รับ temporary credentials สำหรับ role
  • ใช้สำหรับการเข้าถึง cross-account
  • trust policy ควบคุมว่าใครสามารถ assume role ได้
  • Credentials มีอายุ สั้น และหมดอายุอัตโนมัติ

ขั้นตอน STS AssumeRole แบบ cross-account: ผู้เรียกใน Account A ร้องขอ credentials จาก STS, trust policy บน role ใน Account B อนุญาต, STS ส่งคืน short-lived credentials ที่หมดอายุอัตโนมัติ

การ Deploy แอปพลิเคชันบน AWS

Least privilege และโครงสร้าง policy

Policy statement ประกอบด้วย 3 ส่วนที่จำเป็น (Effect, Action และ Resource) บวกกับ Condition ที่เป็นตัวเลือก:

{
  "Effect": "Allow",
  "Action": "dynamodb:PutItem",
  "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/Orders",
  "Condition": {
    "Bool": { "aws:SecureTransport": "true" }
  }
}
การ Deploy แอปพลิเคชันบน AWS

ขอบเขตของ IAM และจุดที่โค้ดเข้ามารับหน้าที่


IAM: ชั้น service

  • อนุญาต AWS API calls: role นี้สามารถเรียก operation นี้ได้หรือไม่?
  • ไม่สามารถบังคับใช้กฎ per-tenant หรือ per-record ได้

โค้ดของคุณ: ชั้นข้อมูล

  • ตรวจสอบผู้ใช้ที่ผ่านการยืนยันตัวตนกับข้อมูลที่ร้องขอ
  • ใช้ทั้งสองร่วมกัน: IAM ป้องกันชั้น service โค้ดป้องกันชั้นข้อมูล
การ Deploy แอปพลิเคชันบน AWS

ตัวอย่าง least-privilege execution role ในทางปฏิบัติ

Lambda execution role แบบ minimal: สิทธิ์ DynamoDB PutItem เพียงรายการเดียวที่กำหนดเฉพาะบน ARN ของตารางนั้น โดยไม่มี wildcard บน action หรือ resource

  • Lambda ต้องการเขียนลง DynamoDB หนึ่ง ตารางเท่านั้น
  • กำหนดสิทธิ์ dynamodb:PutItem บน ARN ของตารางนั้นเท่านั้น
  • ไม่ใช้ wildcard บน action หรือ resource
  • เพิ่มสิทธิ์เมื่อมี call ถูกปฏิเสธจริงเท่านั้น
การ Deploy แอปพลิเคชันบน AWS

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

การ Deploy แอปพลิเคชันบน AWS

Preparing Video For Download...