[AWS Technical Support Note] วิธีตั้งค่าการเข้าถึงบริการของ AWS ด้วยการจำกัดการเข้าถึงด้วยเงื่อนไขที่กำหนดโดยใช้ IAM policy

ด้วยการเพิ่ม policy ต่อไปนี้ภายในบล็อก "Condition" ที่จะระบุ "aws:SrouceIp" ใน IAM Policy จะทำให้สามารถจำกัดการเข้าถึงของผู้ใช้บริการด้วย IP address ที่ระบุได้ และยังคงอนุญาตการเข้าถึงบริการของ AWS ได้

ปัญหาที่เกิดขึ้น

ระบุ "aws:SourceIp" ใน IAM policy เพื่อจำกัด IP หลังจากนั้นก็เกิดข้อผิดพลาดจากการจำกัด IP ในบริการของ AWS อย่างเช่น CloudFormation ซึ่งเป็นบริการที่ควบคุมสภาพแวดล้อม AWS แทนผู้ใช้งาน

ต้องทำยังไงถึงจะทำให้บริการของ AWS เข้าถึงทรัพยากรของ AWS ได้โดยยังคงจำกัด IP ในการเข้าถึงได้

วิธีแก้ปัญหา

ด้วยการเพิ่ม policy ต่อไปนี้ภายในบล็อก "Condition" ที่จะระบุ "aws:SrouceIp" ใน IAM Policy จะทำให้สามารถจำกัดการเข้าถึงของผู้ใช้บริการด้วย IP address ที่ระบุได้ และยังคงอนุญาตการเข้าถึงบริการของ AWS ได้อีกด้วย

{
    "Bool": {"aws:ViaAWSService": "false"}
}

"aws:ViaAWSService" คือ condition keys ที่กำหนดว่าบริการ AWS ดำเนินการตามคำขอแทนผู้ใช้งานหรือไม่ โดยค่าจะเป็น "true" เมื่อเข้าถึงโดยบริการ AWS อย่างเช่น CloudFormation เป็นต้น

โดยจะใช้ condition keys ตามรายละเอียดทางด้านล่าง

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.0.2.0/24",
                    "203.0.113.0/24"
                ]
            },
            "Bool": {"aws:ViaAWSService": "false"}
        }
    }
}

AWS: Denies access to AWS based on the source IP - AWS Identity and Access Management (English)

วิธีอ่าน policy

คิดว่ามีคงมีหลายท่านที่เห็น policy ข้างต้นแล้วอาจจะยังไม่เข้าใจ(ซึ่งเป็นเรื่องปกติ) เลยจะอธิบายวิธีอ่านบล็อก Condition แบบง่ายๆให้ดูกันครับ

"Condition": {
    "NotIpAddress": {
        "aws:SourceIp": [
            "192.0.2.0/24",
            "203.0.113.0/24"
        ]
    },
    "Bool": {"aws:ViaAWSService": "false"}
}

ในบล็อก "Condition" ด้านบนจะเป็น AND และบล็อก "aws:SourceIp" จะเป็น OR

เมื่อบริการของ AWS เช่น CloudFormation ดำเนินการร้องขอแทนผู้ใช้งาน "Bool": {"aws:ViaAWSService": "false"} (ไม่ใช่การเข้าถึงบริการของ AWS) จะถูกพิจารณาว่าเป็นเท็จเสมอ และ policy ข้างต้น (จำกัด IP Address ที่มีการเข้าถึง) จะถูกปิดการใช้งาน

เมื่อผู้ใช้บริการ (ผู้ใช้งาน) ทำการร้องขอ "Bool": {"aws:ViaAWSService": "false"} จะถูกพิจารณาว่าเป็นจริงเสมอ แสดงให้เห็นว่าผลลัพธ์จะถูกกำหนดโดย IP Address ต้นทางที่เข้าถึงในเงื่อนไขของ AND

หรือหากลองนึกภาพเงื่อนไข อย่างเช่น if True && <มี IP address ที่เข้าถึงอยู่ในรายการหรือไม่> ก็จะช่วยให้เข้าใจได้ง่ายขึ้น

บทความอ้างอิง

Use this key to check whether an AWS service makes a request to another service on your behalf.

The request context key returns true when a service uses the credentials of an IAM principal to make a request on behalf of the principal. The context key returns false if the service uses a service role or service-linked role to make a call on the principal's behalf. The request context key also returns false when the principal makes the call directly.

ใช้ key นี้เพื่อตรวจสอบว่าบริการของ AWS มีการส่งคำขอไปยังบริการอื่นแทนคุณหรือไม่

คำขอจะตอบกลับเป็นจริงเมื่อบริการใช้ข้อมูลประจำตัวของ IAM principal ในการร้องขอในนามของ principal และคำขอจะตอบกลับเป็นเท็จหากบริการใช้ role ของบริการ หรือ role ที่เชื่อมโยงกับบริการเพื่อทำการร้องขอในนามของ principal โดยคำขอจะยังตอบกลับเป็นเท็จเมื่อ principal ทำการร้องขอโดยตรง

  • AWS IAM คืออะไร การแนะนำฟังก์ชันล่าสุดของ AWS | DevelopersIO
  • วิธีรีเซ็ตรหัสผ่าน IAM user | DevelopersIO
  • บทความต้นฉบับ

  • IAM ポリシーで特定条件のアクセス制限をかけつつ、AWS サービスのアクセスは許可したいときの対処方法 | DevelopersIO (Japanese)