การตั้งค่า Policy ที่แนะนำเมื่อต้องสร้าง ACCESS KEY สำหรับ S3 (วิธีสร้าง Policy โดยใช้ Visual Policy Editor)

การตั้งค่า Policy ที่แนะนำเมื่อต้องสร้าง ACCESS KEY สำหรับ S3 (วิธีสร้าง Policy โดยใช้ Visual Policy Editor)

สร้าง S3 IAM Policy ยังไงให้เหมาะสม
Clock Icon2025.02.19

สวัสดีครับ ต้า ครับ

ในการใช้งาน AWS แบบที่เป็น Best Practice เราควรจะให้ สิทธิผู้ใช้เท่าที่จำเป็น

เกี่ยวกับความเสี่ยงหากไม่ได้กำหนดสิทธิ์ให้ผู้ใช้เท่าที่จำเป็น

สามารถอ่านเพิ่มเติมได้ในบทความต่อไปนี้:

https://dev.classmethod.jp/articles/regarding-the-access-key-being-leaked/

ซึ่งสิทธิที่อยู่ใน IAM user จะถูกกำหนดจาก IAM Policy

วันนี้ผมจะมาพาสร้าง IAM Policy ด้วย Visual Policy editor ซึ่งเป็น Official Tool ของ AWS กันครับ

โจทย์ Policy ที่ต้องการสร้าง

การสร้าง IAM Policy สำหรับ Access key เพื่อให้ Application เชื่อมต่อกับ S3 และสามารถ อัปโหลดหรือดาวน์โหลดไฟล์ ได้

ดังนั้น สิทธิ์ที่เราต้องการคือ PutObject, GetObject, ListBucket และ DeleteObject เพื่อให้การทำงานกับ S3 Bucket เป็นไปตามที่ต้องการ

หากใครไม่มีไอเดียว่าควรให้สิทธิอะไรดี ผมแนะนำให้ลองอ่านบทความต่อไปนี้ดูครับ

https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html

https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html

ลงมือทำ

"ก่อนที่เราจะเริ่มสร้าง IAM Policy เราต้องเข้าใจว่ามันคืออะไร และมีหน้าที่อะไร IAM Policy เป็นชุดของกฎที่กำหนดสิทธิ์การเข้าถึงทรัพยากร AWS โดยเราจะใช้ Visual Policy Editor ซึ่งเป็นเครื่องมือที่ช่วยให้การสร้าง Policy ง่ายขึ้นโดยไม่ต้องเขียน JSON เอง"

ก่อนอื่นให้เราไปที่ console ของ IAM Policy กันก่อน

https://us-east-1.console.aws.amazon.com/iam/home?region=ap-southeast-1#/policies

เลือก Create Policy

p1

ในหน้านี้ให้เราเลือก แบบ Visual

และเนื่องจากเราต้องการ Permission (สิทธิ) ในการใช้งาน S3

เราจะทำการเลือก S3 ครับ

p2

ในหน้าต่างนี้เราสามารถเลือก สิทธิต่างๆที่เราต้องการได้

Screenshot 2025-02-12 150924

หากเราไม่เข้าใจว่าสิทธิแต่ละอันมันทำอะไรได้ เราสามารถกดinfoเพื่อดูรายละเอียดได้

p3

คราวนี้มาดูว่าผมเลือกอะไรกันบ้าง

ก่อนอื่น ผมเลือก ListBucket และ GetBucketLocation

p4

ต่อไปผมจะมาเลือก Resource ที่ IAM Policy นี้มีสิทธิเข้าถึง

เลื่อนลงมาด้านล่างในหัวข้อ Resources

เราเลือก Specific
แล้วกด Add ARNs

p5

เราสามารถเลือก Bucket name ที่เราต้องการให้มีสิทธิเข้าถึงมันได้ที่นี่
โดยผมจะอนุญาตให้ IAM Policy นี้เข้าถึง tar-translate-app bucket ครับ

p6

เท่านี้เราก็ได้ IAM Policy ที่มีสิทธิเข้าถึง tar-translate-app bucket แล้ว แต่เรายังไม่มีสิทธิเข้าไปดู ข้างใน Bucket เพราะฉนั้นเราจะมาเพิ่ม permission เข้าไปอีกตัวครับ

โดยการเลือกปุ่ม Add more permissions ที่อยู่ด้านล่าง

p7

คราวนี้เราจะมาเพิ่มสิทธิที่ IAM Policy นี้มีต่อข้างใน Bucket กัน

โดยผมจะเลือก PutObject, GetObject, DeleteObject ตามภาพด้านล่างนี้

Screenshot 2025-02-12 160340

Screenshot 2025-02-12 160350

เลื่อนลงมาด้านล่างในหัวข้อ Resources

เราเลือก Specific
แล้วกด Add ARNs

p5

รอบนี้ผมจะกรอกตามนี้เพื่อเป็นการระบุว่าจะมีสิทธิกับทุก object ใน Bucket

(การใส่ * หมายถึงให้สิทธิ์กับทุกไฟล์ภายใน Bucket)

Screenshot 2025-02-17 143826

แล้วผมทำการกด Next

p8

จากนั้นเราสามารถตั้งชื่อ และ คำอธิบายได้ตามที่เราต้องการ
แล้วกด Create Policy เป็นอันเสร็จสิ้น

Screenshot 2025-02-12 163652

เพิ่มเติม

เราสามารถเข้ามาดู Policy ที่เราสร้างขึ้น ในหน้าต่าง Policy ได้ครับ

โดยก็มีให้ดูทั้งแบบ Summary และ JSON ครับ

Screenshot 2025-02-12 164307

Screenshot 2025-02-17 144244

ในการกำหนด Resource ARN สำหรับ S3 ใน IAM Policy เราต้องระบุให้ถูกต้อง มิฉะนั้น Policy อาจทำงานไม่ถูกต้อง

เมื่อกำหนดสิทธิ์ให้กับ S3 Bucket และ Object ภายใน Bucket เราต้องระบุ ARN สองรูปแบบ ดังนี้

json
PreviewDownloadCopy code
"Resource": [
    "arn:aws:s3:::your_name_s3_bucket",
    "arn:aws:s3:::your_name_s3_bucket/*"
]

🔹 arn:aws:s3:::your_name_s3_bucket → หมายถึง ตัว Bucket เอง

🔹 arn:aws:s3:::your_name_s3_bucket/* → หมายถึง ไฟล์ทั้งหมดภายใน Bucket

💡 หากระบุเพียงอย่างใดอย่างหนึ่ง อาจทำให้ Policy ไม่ทำงานตามที่คาดไว้

ตัวอย่าง IAM Policy สำหรับ S3 ตามกรณีที่พบบ่อย

ในการใช้งานจริง การกำหนดสิทธิ์ของ IAM Policy ควรพิจารณาตามความต้องการของระบบ และหลักการ Least Privilege Principle หรือการให้สิทธิ์เท่าที่จำเป็น

ด้านล่างนี้เป็นตัวอย่าง IAM Policy ที่สามารถนำไปใช้งานได้ตามกรณีต่างๆ

1️⃣ ให้สิทธิ์ ดาวน์โหลดไฟล์เท่านั้น (ReadOnly)

หากต้องการให้ผู้ใช้สามารถ ดาวน์โหลดไฟล์ จาก S3 Bucket ได้โดยไม่สามารถอัปโหลดหรือลบไฟล์ สามารถใช้ Policy ดังนี้

json
PreviewDownloadCopy code
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name",
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}

คำอธิบาย

s3:GetObject → อนุญาตให้ดาวน์โหลดไฟล์จาก S3

s3:ListBucket → อนุญาตให้ดูรายการไฟล์ใน Bucket


2️⃣ ให้สิทธิ์ อัปโหลดและดาวน์โหลดไฟล์ (Read/Write)

หากต้องการให้ผู้ใช้สามารถ อัปโหลดและดาวน์โหลดไฟล์ ได้ แต่ไม่สามารถลบไฟล์ ให้ใช้ Policy ดังนี้

json
PreviewDownloadCopy code
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name",
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}

คำอธิบาย

s3:GetObject → อนุญาตให้ดาวน์โหลดไฟล์

s3:PutObject → อนุญาตให้อัปโหลดไฟล์

s3:ListBucket → อนุญาตให้ดูรายการไฟล์


3️⃣ ให้สิทธิ์ อัปโหลด, ดาวน์โหลด และลบไฟล์ (Read/Write/Delete)

หากต้องการให้ผู้ใช้สามารถ อัปโหลด, ดาวน์โหลด และลบไฟล์ ได้ ให้ใช้ Policy ดังนี้

json
PreviewDownloadCopy code
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name",
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}

คำอธิบาย

s3:GetObject → อนุญาตให้ดาวน์โหลดไฟล์

s3:PutObject → อนุญาตให้อัปโหลดไฟล์

s3:DeleteObject → อนุญาตให้ลบไฟล์

s3:ListBucket → อนุญาตให้ดูรายการไฟล์


4️⃣ ให้สิทธิ์ กำหนดสิทธิ์แยกตามโฟลเดอร์

หากต้องการให้สิทธิ์ เฉพาะบางโฟลเดอร์ใน S3 Bucket เช่น ให้ผู้ใช้สามารถอัปโหลดและดาวน์โหลดไฟล์ได้เฉพาะโฟลเดอร์ uploads/ เท่านั้น สามารถใช้ Policy ดังนี้

json
PreviewDownloadCopy code
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name/uploads/*"
            ]
        }
    ]
}

คำอธิบาย

s3:GetObject → อนุญาตให้ดาวน์โหลดไฟล์จาก uploads/

s3:PutObject → อนุญาตให้อัปโหลดไฟล์ไปที่ uploads/

💡 หมายเหตุ: Policy นี้จะไม่สามารถเข้าถึงไฟล์นอกโฟลเดอร์ uploads/ ได้


สรุป

ในส่วนนี้ เราได้เพิ่มตัวอย่าง IAM Policy สำหรับกรณีที่พบบ่อย ได้แก่

ReadOnly → ดาวน์โหลดไฟล์ได้เท่านั้น

Read/Write → อัปโหลดและดาวน์โหลดไฟล์ได้

Read/Write/Delete → อัปโหลด, ดาวน์โหลด และลบไฟล์ได้

กำหนดสิทธิ์แยกตามโฟลเดอร์

การกำหนดสิทธิ์ที่เหมาะสมจะช่วยเพิ่มความปลอดภัยให้กับระบบของคุณ และลดความเสี่ยงที่ข้อมูลจะถูกเข้าถึงโดยไม่ได้รับอนุญาต

หวังว่าตัวอย่างเหล่านี้จะช่วยให้คุณสามารถกำหนด IAM Policy ได้ง่ายขึ้นนะครับ 😊🚀

สรุปโดยรวม

ในบทความนี้ เราได้เรียนรู้เกี่ยวกับ การสร้าง IAM Policy บน AWS โดยใช้ Visual Policy Editor ซึ่งเป็นเครื่องมืออย่างเป็นทางการของ AWS ที่ช่วยให้เราสร้าง Policy ได้ง่ายขึ้น

โจทย์ของเรา คือการสร้าง IAM Policy ที่สามารถใช้ Access Key เพื่อให้ Application สามารถ อัปโหลด (PUT), ดาวน์โหลด (GET), ลบ (DELETE) และดูรายการไฟล์ (LIST) ภายใน Amazon S3 Bucket ได้

เราได้ทำตามขั้นตอนดังนี้:

✅ เข้าไปที่ IAM Console และเลือก Create Policy

✅ ใช้ Visual Policy Editor เพื่อเลือก S3 Service และกำหนด Permissions

✅ กำหนด Resources โดยระบุ Bucket และ Object ที่ต้องการให้สิทธิ์

✅ ตรวจสอบ Policy และกด Create Policy

สิ่งสำคัญที่ควรจำ:

🔹 ควรให้ สิทธิ์เท่าที่จำเป็น (Least Privilege Principle) เพื่อลดความเสี่ยงด้านความปลอดภัย

🔹 สามารถตรวจสอบและแก้ไข Policy ได้ผ่านหน้า IAM Console

🔹 หากไม่แน่ใจว่าสิทธิ์ที่กำหนดเหมาะสมหรือไม่ ควรศึกษาเพิ่มเติมจาก AWS Documentation

หวังว่าบทความนี้จะช่วยให้คุณเข้าใจและสามารถสร้าง IAM Policy ได้ง่ายขึ้น 🚀

หากต้องการศึกษาเพิ่มเติม สามารถดูบทความที่เกี่ยวข้องด้านล่างได้เลย! 😊

บทความที่เกี่ยวข้อง

https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html

https://docs.aws.amazon.com/s3/

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html

https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html

https://docs.aws.amazon.com/iam/

https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html

https://dev.classmethod.jp/articles/aws-2022-introductory-edition-aws-amazon-s3/

https://dev.classmethod.jp/articles/what-is-aws-iam-2022-th/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.