AWS S3 公開存取權完整指南
更新日期: 2024 年 12 月 18 日
本文為 圖片上傳 AWS S3 系列教學,第 1 篇:
- AWS S3 是什麼?
- boto3 與 django-storages:如何在 Django 中對接 AWS S3
- AWS S3 與 IAM:圖片上傳功能的權限管理指南
- S3 與 Postgres 的比較與應用
- Amazon S3 物件所有權設定解析
- AWS S3「阻止所有公開訪問」設定說明
- Amazon S3 儲存桶版本控制完整指南
- 如何設定 S3 儲存桶的「預設加密」?—— 初學者指南
- S3 儲存桶標籤(Tags)簡單介紹:讓你的 S3 管理更輕鬆!
- AWS S3 物件鎖定功能入門指南
- AWS S3 公開存取權完整指南 👈 所在位置
- AWS CORS 預檢請求與設定指南
- AWS IAM 設定教學:生成訪問密鑰以用於 S3 配置
- django-storages 基本配置:讓應用程式連接 S3 存儲桶
- Django-storages 的完整配置教學:從隱密性到快取控制
- Django-storages 完整配置指南:從文件存儲到訪問路徑
- Django-storages 配置:環境變數設定
- Django-storages 與 STORAGES 配置:未來相容性的最佳實踐
- 如何在 Django 中移除 DEBUG URL 的靜態檔案配置
建議閱讀本文前,先閱讀完 圖片上傳功能 系列文
AWS S3 提供強大的存儲功能,但預設設置下,公開存取權 是封鎖的,這是為了保護資料安全。
然而,有些情境下,我們需要將 S3 存儲桶(Bucket)或物件設置為公開存取,例如分享靜態資源或網站內容。
本篇文章將帶你了解什麼是公開存取權、何時需要使用、潛在風險以及如何正確且安全地設置公開存取權限。
什麼是公開存取權?
公開存取權 指的是允許所有人(包括未經身份驗證的使用者),對你的 S3 存儲桶和物件進行存取操作,例如:
- 讀取:下載或查看檔案。
- 寫入:上傳或覆蓋檔案。
- 刪除:移除檔案。
這種存取不需要 AWS 帳戶或 IAM 身份驗證,只要擁有物件的 URL,就能直接訪問。
什麼情況下需要啟用「公開存取權」?
公開網站內容
- 如果你的 S3 Bucket 用於存放靜態網站內容(例如 HTML、CSS、JavaScript、圖片),你需要讓訪客可以自由讀取這些檔案。
- 例如:部落格圖片、產品頁面的 CSS 檔案。
靜態資源或檔案分享
- 若你需要公開分享特定的資源(如圖片、影片或 PDF 文件),可透過 S3 提供公開讀取權限。
- 例如:分享活動海報、可供下載的產品手冊等。
第三方服務存取
- 有些外部應用程式或工具需要存取你的 S3 檔案,若無身份驗證機制,啟用公開存取可簡化流程。
風險與安全考量
啟用公開存取權雖然方便,但同時也存在一定風險:
資料洩漏
- 未經授權的使用者可查看或下載敏感資料。
- 例如:誤將用戶資料、私密文件設為公開存取。
資料覆寫或刪除
- 如果錯誤授予「寫入」或「刪除」權限,惡意使用者可能會覆寫或刪除你的檔案。
資源濫用
- 公開的物件可能被大量訪問,導致 S3 流量增加,進而提高成本。
如何安全地啟用公開存取權?
僅授予「讀取」權限
要安全地設置公開讀取權限,需在 Bucket Policy 中明確授予 s3:GetObject
動作。
範例:公開讀取權限
將以下範例設定貼到 Bucket Policy 中:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
Principal: "*"
表示允許所有人存取。Action: "s3:GetObject"
限定只允許讀取操作。Resource
包含你的 Bucket 名稱及所有物件(/*
表示所有檔案)。
限制存取來源
你可以進一步限制存取來源,例如:
- 限制 IP 地址:只允許特定網段的訪客存取。
- 限制 Referer:只有通過特定網站鏈接的用戶才能訪問。
範例:限制 Referer 存取
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*",
"Condition": {
"StringLike": {
"aws:Referer": "https://your-website.com/*"
}
}
}
]
}
避免公開「寫入」權限
千萬不要授予 s3:PutObject
或 s3:DeleteObject
權限給所有人,否則任何人都能上傳、覆蓋或刪除你的檔案。
使用預簽名 URL 進行控制
如果檔案需要暫時公開存取,但不想設置為永久公開,可以使用預簽名 URL。
- 預簽名 URL 是帶有時效性的存取鏈接,僅允許特定時間內存取檔案。
範例:生成預簽名 URL
aws s3 presign s3://your-bucket-name/your-file-name --expires-in 3600
--expires-in
設定鏈接的有效時間(單位:秒)。
啟用公開存取權的步驟
步驟:檢查並關閉「封鎖公開存取」
- 進入 S3 控制台,選擇你的 Bucket。
- 進入 「權限」(Permissions) 分頁。
- 找到 「封鎖公開存取 (Block Public Access)」,點擊 「編輯」。
- 取消勾選 「封鎖所有公開存取權」,然後儲存更改。
步驟:設定 Bucket Policy
- 在同一個 「權限」 分頁中,找到 Bucket Policy 區塊。
- 點擊 「編輯」,貼上公開讀取的 JSON 設定。
- 儲存變更。
步驟:測試存取 URL
- 上傳一個檔案至 S3 Bucket。
- 獲取物件的 URL,打開瀏覽器測試是否能正常訪問。
結論
「公開存取權」適合用於公開內容的場景,如靜態網站文件或資源分享,但啟用時需謹慎管理,避免資料洩漏或成本增加。
- 僅授予讀取權限,不要授予寫入或刪除權限。
- 使用安全控制手段,如限制存取來源或生成預簽名 URL。
- 定期檢查 S3 設定,避免意外公開敏感資料。