Amazon Simple Storage Service (S3) 是一個多功能且高度可擴展的雲端儲存解決方案,已成為現代網頁託管與資料管理的重要基石。憑藉強大的基礎設施、無與倫比的持久性以及靈活的存取控制,AWS S3 讓使用者能夠存儲、管理及分發各種類型的資料,從小型文檔到大型檔案皆適用。
安全託管公開檔案的重要性
儘管 AWS S3 為線上資料共享提供了靈活的平台,確保安全的託管至關重要。正確管理公開檔案不僅能防止敏感資訊的外洩,還能維護資料完整性。這不僅關係到隱私的保護,更涉及符合如 GDPR 和 HIPAA 等法律標準。
資料安全漏洞可能帶來深遠影響,例如損害品牌聲譽或導致高額的經濟損失。安全的託管還能確保服務不中斷運行,避免潛在的業務中斷風險。在經濟層面上,也可避免因資料管理不善或洩漏造成的額外支出。
了解 AWS S3
在深入了解如何在 S3 託管檔案以及配置公開檔案存取的安全性之前,先了解其基本組件至關重要。這些基礎組件構成了 S3 的運作模式,也是其用於存儲及管理資料的核心。
1. Bucket(儲存桶)
簡單來說,AWS S3 的儲存桶是用於存儲資料的容器,類似於傳統檔案系統中的頂層目錄或資料夾。但與本地電腦的資料夾不同,S3 的儲存桶可以存放大量的資料。每個儲存桶名稱在所有 AWS 帳戶中必須是全球唯一的,作為 S3 的主要命名空間。您可以根據項目的需求,自訂儲存桶的設置,包括存取權限、版本控制及地理位置。
2. Object(物件)
物件是儲存於 S3 儲存桶中的基本單位,代表任何類型的資料,例如文檔、影片、圖片或應用事件。每個物件都以鍵值(Key)作為唯一標識符來進行存取,並包含元數據(例如檔案類型、大小等)。
3. Key(鍵值)
鍵值是儲存桶中物件的唯一標識符,類似於傳統檔案系統中的檔案路徑,為檢索物件提供途徑。通過儲存桶名稱、鍵值及選擇性的版本 ID(如果啟用了版本控制),可以唯一標識每個物件。這種結構使 S3 能夠有效地組織和檢索大量資料。
開始使用 AWS S3
在建立 S3 儲存桶及配置安全性之前,首先需要擁有 AWS 帳戶。您可以參考這篇文章了解如何建立 AWS 帳戶。完成帳戶建立後,進入 S3 服務頁面,可通過搜尋或快速訪問連結找到。

別忘了指定您選擇的區域(也可以在設置頁面中進行更改)。無論選擇哪個區域,您的儲存桶名稱仍將是全球唯一的。
點擊 「Create bucket」 開始創建儲存桶。

建立 S3 儲存桶
這將引導您進入設置頁面。在 「一般配置」(General configuration) 區塊中,您需要輸入 「儲存桶名稱」(Bucket name)。該名稱必須是唯一的,並且需遵循命名規則(您可以點擊「See rules for bucket naming」連結查看詳細規則)。
接下來,您需要選擇儲存桶的 「AWS 區域」(AWS Region)。預設情況下,將自動選擇您之前設定的區域。您也可以從現有的儲存桶中複製設置。

在 「物件所有權」(Object Ownership) 區塊中,您可以選擇啟用或停用 ACLs(存取控制清單):
• 停用 ACLs:表示只有創建該 S3 儲存桶的帳戶擁有該儲存桶及其內部物件的所有權,所有存取權限僅能透過政策來規範。
• 啟用 ACLs:允許其他帳戶擁有該儲存桶及其物件的存取權限,並可透過 ACLs 指定對儲存桶及物件的存取權限。
建議保持預設設置(停用 ACLs),因為我們將使用此帳戶來控制該 S3 儲存桶的所有權與存取權限。

在 「封鎖公共存取設定」(Block Public Access settings for this bucket) 區域中,可以設定是否允許您的儲存桶公開存取。
預設情況下,儲存桶的公共存取是被封鎖的。
繼續使用此設定,我們將在創建此儲存桶後進行更改。

接下來,「儲存桶版本控制」(Bucket Versioning) 區域允許您啟用儲存桶版本控制功能。
此功能可以追蹤您上傳的檔案,並恢復您意外刪除的檔案。這與 Git 的功能相似。
現在啟用它。啟用此功能可以防止檔案被意外覆寫或刪除。

「標籤」(Tags) 區域允許您為儲存桶添加識別標籤。
這對於組織管理和進行其他分析會更有幫助。
由於這是可選項目,您可以跳過此步驟。

「預設加密」(Default encryption) 區域在 Amazon S3 中處理了資料安全性的關鍵部分,通過自動對存儲在您儲存桶中的新物件進行伺服端加密。
這可確保您的資料從上傳到 S3 的那一刻起始終受到保護。
加密類型
預設加密提供以下幾種方法:
SSE-S3(伺服端加密,使用 Amazon S3 管理的金鑰):這是標準的加密方法,Amazon S3 使用 AES-256(目前最強大的區塊加密算法之一)來自動加密物件。
SSE-KMS(伺服端加密,使用 AWS Key Management Service 金鑰):此選項提供更多控制權和審計記錄。您可以選擇使用自主管理的 AWS KMS 金鑰或預設的 AWS 管理金鑰(aws/s3)。審計記錄對於符合法規要求和進行安全監控尤為重要。
DSSE-KMS(雙層伺服端加密,使用 AWS KMS 金鑰):此方法專為高度受監管的環境設計,對物件應用兩層加密,提供更高層次的安全性和合規性。
儲存桶金鑰(Bucket Key)
S3 儲存桶金鑰是為選擇使用 AWS KMS 伺服端加密的使用者設計的一項經濟高效且性能優化的功能。
它能夠實現高效的金鑰管理,同時維持高安全標準,使其成為在大型 S3 儲存桶中高效管理加密的寶貴工具。

建議保留預設設定,因為選擇其他選項可能會導致較為複雜的設置。不過,您應根據存儲在 S3 中的資料類型來考慮使用其他選項。由於我們將存儲的資料是公開的,預設的 SSE-S3 加密 已足夠。
在 「進階設定」(Advanced settings) 區域中,您可以選擇啟用 物件鎖定(Object Lock) 功能。該功能採用 一次寫入,多次讀取(WORM) 模型,保護物件在固定時間內或無限期內不被刪除或覆蓋。

保持預設設定,然後點擊 「Create bucket」 按鈕。
這將創建儲存桶。現在,您可以開始存儲檔案並配置它們為公開存取。

現在點擊儲存桶名稱,進入儲存桶內部。在儲存桶內,您可以看到多個標籤頁,這些標籤頁提供不同的功能。
點擊 「Upload」 按鈕以上傳檔案。

我們將上傳一張圖片、一個文字檔案和一個小型壓縮檔案進行測試。
點擊 「Upload」 按鈕後,您將進入上傳頁面,您可以拖放檔案和資料夾,或者使用 「Add files」(新增檔案) 和 「Add folder」(新增資料夾) 按鈕手動添加檔案。
現在我們直接添加檔案。

您可以在 「Files and folders」(檔案和資料夾) 區域中看到您選擇上傳的檔案。現在,點擊 「Upload」(上傳) 按鈕以開始上傳檔案。
這個過程可能需要一些時間,具體取決於您的網速和檔案大小。您可以在頂部的狀態欄中看到上傳進度。

上傳完成後,前往目的地 URL。

這將帶您進入 S3 儲存桶內。現在,點擊任意已上傳的檔案,然後複製其 URL。

現在在新標籤頁中打開此 URL,您將看到 「AccessDenied」(存取被拒絕),因為該儲存桶尚未設置為公開。

這對您上傳的所有檔案都適用。您也可以使用帶有秘密憑證的 URL 存取檔案。這對於臨時的公開分享非常實用。

此檔案只能透過該指定的 URL 存取。

每個人的需求可能各不相同,但在本示例中,我們假設公司需要一個公開的儲存桶(所有物件都將公開)。
儘管有 IAM 策略、儲存桶策略、加密等來保護您的檔案,但人為錯誤可能帶來嚴重後果。因此,不建議將私密和機密資訊與公開資訊存放在同一儲存桶中,這樣做會增加機密檔案被公開的風險。
將儲存桶設置為公開並不意味著它必須是可寫的,您應該只為儲存桶內的檔案提供讀取權限。
啟用公開存取
讓我們將整個儲存桶設置為公開。為此,進入儲存桶,然後導航到 「Permissions」(權限) 標籤頁。

在該頁面中,找到 「Block public access」(封鎖公共存取) 區域,然後點擊 「Edit」(編輯)。

在該區域中,取消勾選 「Block all public access」(封鎖所有公共存取),然後點擊 「Save changes」(保存更改)。

這時會彈出一個對話框,輸入 「confirm」 並按下回車鍵。

現在我們需要添加一個儲存桶策略。在 「Bucket policy」(儲存桶策略) 區域中,點擊 「Edit」(編輯)。

現在點擊 「Policy generator」(策略生成器)。這將帶您進入一個新頁面。

在 「AWS Policy Generator」(AWS 策略生成器) 頁面中,將策略類型設置為 「S3 Bucket Policy」。
接著在 「Effect」(效果) 欄位選擇 「Allow」(允許),在 「Principal」(主體) 欄位輸入 「*」(這將允許所有人使用該權限)。
然後在 「Actions」(操作) 欄位選擇 「GetObject」(請勿選錯)。

最後,從 「Edit Bucket Policy」(編輯儲存桶策略) 頁面複製您的 Amazon Resource Name(ARN)。

將其粘貼到 「Amazon Resource Name(ARN)」 欄位中,然後點擊 「Add Statement」(添加語句)。

您將看到一個語句已生成。現在在 步驟 3(Step 3) 中,點擊 「Generate Policy」(生成策略)」 按鈕。

這將打開一個包含 JSON 代碼的窗口。請複製該 JSON 代碼。

將其粘貼到 「Edit Bucket Policy Page」(編輯儲存桶策略頁面)」 中。
在保存之前,找到 “Resource” 欄位(在第 11 行,以我的情況為例),將其修改為包含 ”/*”,使其變為:"Resource": "arn:aws:s3:::elitecloud-s3-public-access/*".

完成後,點擊 「Save Changes」(保存更改) 按鈕。這將使儲存桶內的物件公開且僅可讀取。
現在返回 「Objects」(物件)」 標籤頁,選擇任意檔案並複製其 URL。

在新的瀏覽器標籤頁中打開該 URL,您將看到圖片已成功載入。

但這需要您知道檔案的 URL。您可以將其配置為公開共享,使您上傳的每個檔案都能自動列出。現在,若您上傳任何檔案,它將自動可通過公開 URL 存取。
我們將在此結束這篇文章。如需更多關於 AWS 雲端的文章,請查看我們的資源部分。
結論
總結來說,AWS S3 是一個功能強大且可擴展的雲端儲存解決方案,是資料管理的關鍵工具。然而,安全託管公開檔案對於保護敏感資訊和遵守法律標準至關重要。
Comments