文章

如何在不公開儲存桶的情況下分享 S3 檔案

以私人儲存桶安全分享 S3 檔案:預先簽署 URL、CloudFront 簽署 URL,或含密碼、到期日和下載次數限制的分享連結。

你可以在完全不公開儲存桶的情況下分享 Amazon S3 中的檔案。讓它保持私人、維持 Block Public Access 開啟,改為讓別人以簽署方式存取特定物件:一次性的檔案用預先簽署 URL;如果你已經在儲存桶前面使用 CDN,就用 CloudFront 簽署 URL;或使用加上密碼、到期日和下載次數限制的分享連結。這三種方式在 Cloudflare R2、DigitalOcean Spaces、Wasabi 和 Backblaze B2 等 S3 相容服務供應商上的運作方式都相同(CloudFront 僅限 AWS)。

安全分享 S3 檔案的選項一覽

方式最適合密碼下載次數限制撤銷單一連結整個資料夾需要程式碼
公開物件或儲存桶真正公開的資產(網站)否否否是否
預先簽署 URL單一檔案、一次性,從 CLI 或你的應用程式否否否否CLI 或 SDK
CloudFront 簽署 URL已經驗證使用者身分的應用程式否否否搭配簽署 Cookie是
Nubbo 分享連結經常與外部人員分享是是是是,可用 ZIP否

為什麼不直接把檔案設為公開

從 S3 分享檔案最快的方式,是把它設為公開,然後傳送物件 URL。這也是風險最高的方式:任何公開的內容,只要有人找到或猜到網址就能取得,沒有密碼、沒有到期日,也沒有誰取走的紀錄。遺留的公開儲存桶是資料外洩的典型來源,而且不只會暴露內容,也會暴露檔案名稱。

AWS 表示,新的儲存桶、存取點和物件預設不允許公開存取。此外,S3 Block Public Access 有四項設定(BlockPublicAcls、IgnorePublicAcls、BlockPublicPolicy 和 RestrictPublicBuckets),會覆蓋之後任何可能開放儲存桶的政策或 ACL。它們可以針對單一儲存桶、整個帳戶或整個 AWS Organization 設定,S3 會套用最嚴格的組合。AWS 建議在帳戶層級開啟全部四項,除非你真的要託管公開內容,例如靜態網站。

請保持這個開關開啟。以下所有方式都能在開啟的狀態下運作。

選項 1:預先簽署 URL

預先簽署 URL 是在查詢字串中帶有簽章的物件 URL。它在到期前授予對一個物件的一項操作(通常是下載),S3 會在每次請求時檢查簽章。

aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 86400

這個 URL 可使用 24 小時。CLI 預設為一小時,以 IAM 使用者金鑰簽署時最長為 604,800 秒(7 天)。如果你以臨時憑證簽署,例如擔任的角色,URL 會在這些憑證到期時失效。

你會得到:

  • 不必變更儲存桶或其政策。
  • 精確的控制:一個物件、一種方法、一個有效期限。
  • 可用於任何支援 SigV4 預先簽署的服務供應商。

你不會得到:

  • 沒有密碼。持有 URL 的人在到期前都能無限次使用。
  • 沒有下載次數限制,也無法逐一撤銷連結。你只能撤銷簽署它的金鑰,讓 URL 提前失效。
  • 沒有資料夾。你必須逐一簽署物件,所以分享一個有 300 個檔案的資料夾,就需要 300 個 URL。
  • 名稱的隱私。URL 會顯示你的儲存桶名稱、物件鍵和存取金鑰 ID。

深入了解運作機制,包括上傳、每個 X-Amz-* 參數和 SDK 程式碼,請見 S3 預先簽署 URL 解析。

如果你已經透過 Amazon CloudFront 提供儲存桶,就可以在快取行為上要求簽署 URL 或簽署 Cookie。儲存桶會在來源存取控制(OAC)之後保持私人,AWS 建議用它取代較舊的來源存取身分:儲存桶政策只允許你的發佈讀取物件。你在受信任的金鑰群組中註冊公開金鑰,並以對應的私密金鑰簽署。

  • 簽署 URL 適合個別檔案。使用自訂政策時,還可以設定開始時間和 IP 範圍,並用萬用字元讓同一份政策適用於多個檔案。它們可以短期有效,也可以維持數年。
  • 簽署 Cookie 適合一次處理多個檔案,例如影片的每個片段,而不必變更你的 URL。

如果你執行的應用程式已經會驗證使用者身分,並大規模提供內容,這就是合適的工具。但若只是要把幾個檔案交給團隊以外的人,就意味著要設定發佈、管理金鑰,並撰寫為每個請求簽署的程式碼。

把儲存桶政策限制在固定的 IP 範圍是另一個原生選項,但只有在你知道收件者的網路時才有幫助,而對組織以外的人來說,這種情況很少見。

選項 3:用 Nubbo 分享連結

Nubbo 會連接你的儲存桶,提供具備預先簽署 URL 所缺少控制功能的分享連結,而且不需要撰寫程式碼。它在底層仍然使用預先簽署 URL:Nubbo 會先檢查連結的規則,然後才發出短期 URL,所以單一檔案會直接從你的儲存桶傳到收件者的瀏覽器。

步驟 1:連接你的儲存桶

免費註冊,驗證你的電子郵件,然後開啟儲存桶並按下連接儲存桶。連線精靈會詢問你的服務供應商(Amazon S3、Cloudflare R2、DigitalOcean Spaces、Wasabi、Backblaze B2 或自訂的 S3 相容端點)、連線方式(使用完整存取權限金鑰的自動設定,或僅限一個儲存桶的金鑰)、你的金鑰和你的儲存桶。它會檢查金鑰和儲存桶,最後從你的瀏覽器實際上傳一次來測試 CORS。儲存桶保持私人,你的金鑰以 AES-256-GCM 加密儲存。免費方案包含 2 個連線。

步驟 2:選擇檔案或資料夾

在 檔案總管 中找到項目,然後選擇分享。你也可以前往已分享頁面,按下新連結,再在那裡選擇儲存桶和檔案或資料夾。

步驟 3:設定保護措施

三項控制都是選用的,所有方案都提供:

控制項運作方式
密碼4 到 50 個字元。輸入錯誤 10 次後,連結會鎖定 15 分鐘。
到期日預設關閉:只要檔案或資料夾還在你的儲存空間中,連結就保持有效。
下載次數上限留空表示不限。達到次數後,連結就不再提供檔案。

步驟 4:建立並傳送連結

按下建立連結,複製後透過電子郵件、聊天或你慣用的方式傳送。收件者會開啟一個簡潔的下載頁面,不需要帳戶。資料夾連結讓他們能瀏覽資料夾、下載單一檔案,或以 ZIP 取得全部內容,這個 ZIP 由他們的瀏覽器直接從你的儲存桶逐一下載檔案後建立。

步驟 5:另外傳送密碼

把密碼和連結放在同一則訊息中傳送,就失去了意義。如果連結設有密碼,以電子郵件傳送密碼會以一次性顯示連結的形式傳送:密碼只會顯示一次,顯示連結會在 24 小時、3 天或 7 天後到期,你還可以加上簡短的附註。對方開啟時你會收到通知。

步驟 6:追蹤與撤銷

已分享頁面會列出每個連結及其狀態和下載次數。你可以編輯密碼、到期日或次數上限,停用連結(它會立即停止發出新的下載 URL),之後也能以相同的網址重新啟用。

與特定人員分享,而不是使用連結

連結對任何持有者都有效。如果你只想讓指定的人存取,Nubbo 的與人員分享(Personal 和 Pro 方案)可以把檔案或資料夾傳送給特定的電子郵件地址,設定檢視或下載權限、選用的到期日和下載次數上限,並記錄每次存取。收件者需要 Nubbo 帳戶,會在與我分享中找到該項目。Personal 每個項目可分享給 10 人,最多 50 個有效分享;Pro 則為 50 人和 500 個。

付費方案還提供加密連結:瀏覽器會建立檔案的密封副本,金鑰只存在於連結本身,所以 Nubbo 無法讀取。

你該使用哪個選項?

  • 單一檔案、一次性,而且你已設定好 AWS CLI:預先簽署 URL 是最快的方式。
  • 已經讓使用者登入並提供大量內容的應用程式:CloudFront 簽署 URL 或 Cookie。
  • 經常與團隊以外的人分享、分享整個資料夾,或任何需要密碼或次數限制的情況:分享連結能節省時間並減少錯誤。

不只是單一連結

另外兩項相關功能涵蓋其他常見情況。檔案請求 提供一個公開的上傳連結,讓別人能把檔案傳送到你的儲存桶,而看不到其中的其他任何內容。相簿 把一個裝滿照片或影片的資料夾變成可瀏覽的頁面,具備版面配置、浮水印和專屬密碼。免費方案各提供 3 個,分享連結不限數量;Personal 和 Pro 則取消這些上限。坦白說明一點:縮圖會在 Nubbo 的伺服器上產生,並儲存在你自己儲存桶中的 .nubbo-thumbs/。

常見問題

如何在不公開的情況下分享 S3 中的檔案?

讓儲存桶保持私人,改為提供簽署存取:針對單一物件的預先簽署 URL(透過 AWS CLI 或 SDK);如果你已經透過 CloudFront 提供儲存桶,就用 CloudFront 簽署 URL 或 Cookie;或是使用 Nubbo 這類工具的分享連結,在預先簽署 URL 之上加上密碼、到期日和下載次數限制。

用 Amazon S3 分享檔案安全嗎?

安全,只要儲存桶保持私人。新的儲存桶預設不允許公開存取,S3 Block Public Access 也能防止任何人之後將其開放。風險來自把物件設為公開,或簽署連結外洩,因為在到期前任何持有連結的人都能使用。

新的 S3 儲存桶預設是私人的嗎?

是的。AWS 表示,新的儲存桶、存取點和物件預設不允許公開存取,而四項 Block Public Access 設定會覆蓋之後任何可能將其開放的政策或 ACL。

收件者需要 AWS 或 Nubbo 帳戶嗎?

不需要。預先簽署 URL、CloudFront 簽署 URL 和 Nubbo 分享連結都能在任何瀏覽器中使用,不需要帳戶。只有與人員分享(把項目傳送給指定的人)才需要對方擁有 Nubbo 帳戶。

分享的 S3 連結最長可以維持多久?

以 IAM 使用者金鑰簽署的預先簽署 URL 最長 7 天,使用臨時憑證時更短。CloudFront 簽署 URL 的期限由你的政策決定。Nubbo 分享連結除非你設定到期日,否則不會到期,因為每次下載都會發出新的短期 URL。

有人下載分享連結時,檔案會經過 Nubbo 嗎?

不會:瀏覽器會透過預先簽署 URL 直接從你的儲存桶下載單一檔案。多檔案 ZIP 下載會在瀏覽器中打包,瀏覽器直接從你的儲存桶下載每個檔案:Nubbo 從不接觸檔案內容。

資料來源

價格與限制取自以下官方頁面。服務供應商會調整這些內容,決定前請先確認。