記事

バケットを公開せずにS3のファイルを共有する方法

非公開バケットのままS3のファイルを安全に共有する方法。署名付きURL、CloudFrontの署名付きURL、パスワード、有効期限、ダウンロード回数制限付きの共有リンクを紹介します。

Amazon S3のファイルは、バケットを一度も公開せずに共有できます。バケットは非公開のまま、Block Public Accessもオンのままにして、代わりに特定のオブジェクトへの署名付きのアクセスを渡します: 単発のファイルには署名付きURL、すでにバケットの前段でCDNを運用しているならCloudFrontの署名付きURL、あるいはパスワード、有効期限、ダウンロード回数制限を加える共有リンクです。3つとも、Cloudflare R2、DigitalOcean Spaces、Wasabi、Backblaze B2などのS3互換プロバイダーで同じように使えます(CloudFrontはAWSのみ)。

S3の安全なファイル共有方法の概要

方法向いている用途パスワードダウンロード回数制限1つのリンクの取り消しフォルダ全体必要なコード
公開オブジェクトまたはバケット本当に公開するアセット(ウェブサイト)なしなしなしあり不要
署名付きURLCLIやアプリから1つのファイルを1回だけなしなしなしなしCLIまたはSDK
CloudFrontの署名付きURLすでにユーザーを認証しているアプリなしなしなし署名付きCookieで可必要
Nubboの共有リンク外部の人との継続的な共有ありありありあり、ZIPにも対応不要

ファイルを公開すればよいのでは?

S3のファイルを共有する最も手っ取り早い方法は、ファイルを公開してオブジェクトのURLを送ることです。しかし、これは最もリスクの高い方法でもあります。公開されたものは、アドレスを見つけたり推測したりした人なら誰でも取得でき、パスワードも有効期限もなく、誰が取得したかの記録も残りません。放置された公開バケットはデータ漏洩の典型的な原因で、中身だけでなくファイル名も露出します。

AWSによると、新しいバケット、アクセスポイント、オブジェクトはデフォルトで公開アクセスを許可しません。さらに、S3 Block Public Accessには4つの設定(BlockPublicAcls、IgnorePublicAcls、BlockPublicPolicy、RestrictPublicBuckets)があり、あとからバケットを公開するようなポリシーやACLよりも優先されます。これらはバケット単位、アカウント単位、AWS Organization全体で設定でき、S3は最も制限の厳しい組み合わせを適用します。AWSは、静的ウェブサイトのように本当に公開コンテンツをホストする場合を除き、アカウントレベルで4つすべてをオンにすることを推奨しています。

この設定はオンのままにしてください。以下の方法はすべて、オンのままで使えます。

方法1: 署名付きURL

署名付きURLは、クエリ文字列に署名を加えたオブジェクトのURLです。期限が切れるまで1つのオブジェクトに対する1つの操作(通常はダウンロード)を許可し、S3はリクエストのたびに署名を確認します。

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

このURLは24時間有効です。CLIのデフォルトは1時間で、IAMユーザーのキーで署名した場合の上限は604,800秒(7日間)です。引き受けたロールなどの一時的な認証情報で署名した場合、URLはその認証情報の期限切れとともに無効になります。

得られるもの:

  • バケットやそのポリシーを変更する必要がない。
  • 細かい制御: 1つのオブジェクト、1つのメソッド、1つの有効期限。
  • SigV4の署名に対応したどのプロバイダーでも使える。

得られないもの:

  • パスワードがない。URLを持っている人は、期限が切れるまで何度でも使えます。
  • ダウンロード回数制限もリンクごとの取り消しもない。URLを早めに無効にするには、署名したキーを取り消すしかありません。
  • フォルダに対応していない。オブジェクトごとに署名するため、300個のファイルがあるフォルダを共有するには300個のURLが必要です。
  • 名前が見えてしまう。URLにはバケット名、オブジェクトキー、アクセスキーIDが表示されます。

アップロード、各 X-Amz-* パラメーター、SDKのコードなど、仕組みの詳細は S3の署名付きURLの解説 をご覧ください。

方法2: CloudFrontの署名付きURLと署名付きCookie

すでにAmazon CloudFront経由でバケットを配信している場合は、キャッシュビヘイビアで署名付きURLや署名付きCookieを必須にできます。バケットは、AWSが従来のオリジンアクセスアイデンティティよりも推奨しているオリジンアクセスコントロール(OAC)の背後で非公開のままになり、バケットポリシーによってディストリビューションだけがオブジェクトを読み取れるようになります。信頼されたキーグループに公開鍵を登録し、対応する秘密鍵で署名します。

  • 署名付きURLは個々のファイルに向いています。カスタムポリシーを使えば開始時刻やIPアドレスの範囲も設定でき、ワイルドカードで1つのポリシーを多数のファイルに使い回せます。有効期間は短くも、何年にもできます。
  • 署名付きCookieは、動画のすべてのセグメントなど、多数のファイルをURLを変えずにまとめて扱うのに向いています。

すでにユーザーを認証し、大規模にコンテンツを配信するアプリケーションを運用しているなら、これが適したツールです。チーム外の人に数個のファイルを渡すだけなら、ディストリビューションの設定、キーの管理、各リクエストに署名するコードの作成が必要になります。

バケットポリシーで固定のIPアドレス範囲に制限するのもネイティブな選択肢の1つですが、受け取る人のネットワークがわかっている場合にしか役立たず、組織外の人が相手ではそうしたケースはまれです。

方法3: Nubboの共有リンク

Nubbo はバケットに接続し、署名付きURLにない制御を備えた共有リンクを、コードを書かずに提供します。内部では引き続き署名付きURLを使っています。Nubboはまずリンクのルールを確認し、そのあとで短時間だけ有効なURLを発行するため、単一ファイルはバケットから受け取る人のブラウザーへ直接届きます。

ステップ1: バケットを接続する

無料で登録してメールアドレスを確認し、バケットを開いてバケットを接続を押します。ウィザードでは、プロバイダー(Amazon S3、Cloudflare R2、DigitalOcean Spaces、Wasabi、Backblaze B2、またはカスタムのS3互換エンドポイント)、接続方法(フルアクセスのキーによる自動設定、または1つのバケットに限定したキー)、キー、バケットを指定します。ウィザードはキーとバケットを確認し、最後にブラウザーから実際にアップロードしてCORSをテストします。バケットは非公開のままで、キーはAES-256-GCMで暗号化して保存されます。無料プランには2つの接続が含まれます。

ステップ2: ファイルまたはフォルダを選ぶ

エクスプローラーでアイテムを見つけて共有を選びます。共有ページに移動して新しいリンクを押し、そこでバケットとファイルまたはフォルダを選ぶこともできます。

ステップ3: 保護を設定する

3つの制御はいずれも任意で、すべてのプランで使えます:

制御仕組み
パスワード4〜50文字。10回間違えると、リンクは15分間ロックされます。
有効期限日デフォルトではオフ。ファイルやフォルダがストレージにある限り、リンクは有効です。
最大ダウンロード数空欄なら無制限。上限に達すると、リンクからファイルを提供しなくなります。

ステップ4: リンクを作成して送る

リンクを作成を押してリンクをコピーし、メール、チャットなど普段使っている方法で送ります。受け取る人はすっきりしたダウンロードページを開くだけで、アカウントは必要ありません。フォルダのリンクでは、フォルダを閲覧したり、単一ファイルをダウンロードしたり、すべてをZIPで取得したりできます。ZIPは受け取る人のブラウザーが各ファイルをバケットから直接ダウンロードして作成します。

ステップ5: パスワードを別に送る

リンクと同じメッセージでパスワードを送っては意味がありません。リンクにパスワードがある場合、パスワードをメールで送信を使えば、一度だけ表示できるリンクとして届けられます。パスワードは一度だけ表示され、表示用のリンクは24時間、3日、7日のいずれかで期限が切れ、短いメモも添えられます。開かれたときには通知が届きます。

ステップ6: 追跡して取り消す

共有ページには、すべてのリンクがステータスとダウンロード数とともに表示されます。パスワード、有効期限、上限を編集したり、リンクを無効にしたり(すぐに新しいダウンロードURLを発行しなくなります)、あとで同じアドレスのまま再開したりできます。

リンクではなく特定の相手と共有する

リンクは持っている人なら誰でも使えます。名前を指定した相手だけにアクセスさせたい場合、Nubboの「相手を指定して共有」(PersonalプランとProプラン)を使えば、閲覧またはダウンロードの権限、任意の有効期限、ダウンロード回数の上限を付けて、ファイルやフォルダを特定のメールアドレスに送り、アクセスごとに記録を残せます。受け取る人にはNubboのアカウントが必要で、アイテムは「自分と共有中」に表示されます。Personalでは1アイテムにつき10人、有効な共有は合計50件まで、Proでは50人と500件までです。

有料プランでは暗号化リンクも使えます。ブラウザーがファイルの封印されたコピーを作成し、鍵はリンク自体にのみ含まれるため、Nubboはその中身を読めません。

どの方法を使うべきか

  • 1つのファイルを1回だけ送り、AWS CLIが設定済み: 署名付きURLが最も手早い方法です。
  • すでにユーザーのログインを扱い、大量のコンテンツを配信するアプリケーション: CloudFrontの署名付きURLまたはCookie。
  • チーム外の人との継続的な共有、フォルダ全体、パスワードや制限が必要なもの: 共有リンクなら手間とミスを減らせます。

1つのリンクを超えて

関連する2つの機能で、そのほかのよくあるケースにも対応できます。ファイルリクエストは公開のアップロードリンクを作成し、相手はバケット内のほかのものを見ることなく、バケットにファイルを送れます。ギャラリーは、写真や動画のフォルダを、レイアウト、透かし、独自のパスワードを備えた閲覧用のページに変えます。無料プランではそれぞれ3つまでで、共有リンクは無制限です。PersonalとProではその上限がなくなります。正直にお伝えしておくと、サムネイルはNubboのサーバーで生成され、ご自身のバケットの .nubbo-thumbs/ に保存されます。

よくある質問

S3のファイルを公開せずに共有するにはどうすればよいですか?

バケットは非公開のままにして、代わりに署名付きのアクセスを渡します。1つのオブジェクトには署名付きURL(AWS CLIやSDKで作成)、すでにCloudFront経由でバケットを配信しているならCloudFrontの署名付きURLやCookie、あるいは署名付きURLの上にパスワード、有効期限、ダウンロード回数制限を加えるNubboなどのツールの共有リンクです。

Amazon S3はファイル共有に安全ですか?

はい、バケットが非公開である限り安全です。新しいバケットはデフォルトで公開アクセスを許可せず、S3 Block Public Accessによって、あとから誰かがバケットを公開することも防げます。リスクは、オブジェクトを公開することや、署名付きリンクが漏れることから生じます。署名付きリンクは、期限が切れるまで持っている人なら誰でも使えます。

新しいS3バケットはデフォルトで非公開ですか?

はい。AWSによると、新しいバケット、アクセスポイント、オブジェクトはデフォルトで公開アクセスを許可せず、4つのBlock Public Access設定は、あとからそれらを公開するようなポリシーやACLよりも優先されます。

受け取る人にAWSやNubboのアカウントは必要ですか?

いいえ。署名付きURL、CloudFrontの署名付きURL、Nubboの共有リンクは、いずれもアカウントなしでどのブラウザーでも使えます。名前を指定した相手にアイテムを送る「相手を指定して共有」だけは、相手にNubboのアカウントが必要です。

共有したS3のリンクはどれくらい有効にできますか?

署名付きURLは、IAMユーザーのキーで署名した場合は最大7日間で、一時的な認証情報ではそれより短くなります。CloudFrontの署名付きURLは、ポリシーで指定した期間有効です。Nubboの共有リンクは、ダウンロードのたびに短時間だけ有効な新しいURLを発行するため、設定しない限り有効期限はありません。

共有リンクからダウンロードするとき、ファイルはNubboを経由しますか?

経由しません。ブラウザーが署名付きURLで単一ファイルをバケットから直接ダウンロードします。複数ファイルのZIPダウンロードはブラウザー上で作成され、ブラウザーが各ファイルをバケットから直接ダウンロードします。Nubboがその内容を見ることはありません。

出典

料金と制限は以下の公式ページに基づいています。プロバイダーは変更することがあるため、契約前にご確認ください。