Storage Browser for Amazon S3を安全に利用するためのセキュリティ対策

# Storage Browser for Amazon S3を安全に利用するためのセキュリティ対策

## はじめに

2024年のre:Invent において、AWSは「Storage Browser for Amazon S3」を一般提供開始しました。この機能により、AWSの技術的な知識がないユーザーでも、GUIを通じてAmazon S3のコンテンツを簡単に管理できるようになりました。

しかし、S3バケットへのアクセスを提供する際には、適切なセキュリティ対策が不可欠です。本記事では、Storage Browser for Amazon S3を安全に運用するための具体的なセキュリティ設定について、実践的な観点から解説していきます。

## 前提

本記事で想定するユースケースは、Webサイトのコンテンツ管理です。具体的には、Amazon CloudFrontとAmazon S3を利用してWebコンテンツを配信しており、デザイナーやコンテンツ管理者といったAWS以外の担当者がコンテンツの更新を行う必要があるケースを考えています。

このような状況で、Storage Browser for Amazon S3を通じてS3バケットへの安全なアクセスを提供するためには、複数のレイヤーでのセキュリティ対策が必要となります。

なお、Github上で資材を適切に扱うための対策（認証情報を公開しないなど）はこの記事の対象外としますので、この点についてはご了承ください。

## セキュリティ対策

### 1. AWS Amplifyアプリケーション作成時の基本認証設定

Storage Browser for Amazon S3の利用にあたって、最初のセキュリティレイヤーとなるのが基本認証の設定です。AWS Amplifyでアプリケーションを作成する際、「サイトをパスワードで保護」というオプションが提供されています。

この設定を有効にすることで、Storage Browserへのアクセス時に基本認証が要求されるようになります。これは最も基本的なセキュリティ対策ですが、重要な第一歩となります。特にインターネットに公開されるアプリケーションの場合、この設定は必須と言えるでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645488/f30c4828-503b-6a5d-635b-6a81dc2e6f0d.png)


### 2. 認証・認可方式の選択と実装

Storage Browserでは、3つの認証・認可方式が提供されています。AWS公式ドキュメントでは、各方式について以下のように説明しています：

> **AWS Amplify Auth の使用**  
> このオプションは、顧客やサードパーティーのパートナーに Amazon S3 のデータへのアクセスを提供したい場合に最適です。ファイルのアクセスコントロールとセキュリティを管理するために、デフォルトで AWS Amplify Auth を使用する Amplify Storage を設定できます。これは Amazon Cognito を利用し、ユーザー登録、サインイン、サインアウトフローを実装するための事前構築済みの UI コンポーネントを備えています。
>
> **AWS IAM アイデンティティセンターの使用**  
> このオプションは、Storage Browser for S3 を通じて S3 のデータへのアクセスをワークフォース全体に提供するスケーラブルなソリューションに最適です。S3 Access Grants インスタンスを AWS Identity and Access Management (IAM) アイデンティティセンターに関連付けて、ユーザーとグループのために S3 Access Grants 許可を一元管理します。これらのユーザーとグループには、Microsoft Entra ID や Okta などの外部 ID プロバイダーでホストされているユーザーとグループが含まれます。さらに、S3 の各 AWS CloudTrail データイベントは、データにアクセスしたエンドユーザー ID を参照するため、データアクセスに関するオブザーバビリティを高めるのに役立ちます。
>
> **IAM ロールと Amazon S3 Access Grants の併用**  
> このオプションは、Storage Browser for S3 を通じて、データへのアクセスを IAM プリンシパルに提供する場合に最適です。これを設定するには、まず S3 Access Grants インスタンスを作成する必要があります。ユーザーはこれを使用して、S3 バケットとプレフィックスについての許可を目的の IAM ID にマッピングできます。その後、s3:GetDataAccess を呼び出して S3 バケットまたはプレフィックスへの一時的な最小特権アクセスを取得するための許可を持つ IAM ロールを作成します。

本記事のユースケースでは、AWS Amplify Authを採用することをお勧めします。

### 3. アプリケーションレベルでの権限設定

認証基盤を整えた後は、より細かな権限制御を実装する必要があります。これは`amplify/storage/resource.ts`ファイルで設定を行います。

ここでのポイントは、「最小権限の原則」に従った設定を行うことです。例えば、デザイナーチームには画像が格納されているプレフィックスのみにアクセス権を付与し、コンテンツ管理チームにはHTML/CSSファイルが格納されているプレフィックスへのアクセス権を付与するといった具合です。

以下はAWS公式ドキュメント(*)にも記載されている設定のサンプルです。

*. https://aws.amazon.com/jp/blogs/news/connect-users-to-data-through-your-apps-with-storage-browser-for-amazon-s3/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645488/c464fa88-f9b7-5e60-a7b0-5e673606f3f7.png)


### 4. AWS WAFによる防御層の追加

AWS WAFの設定は、アプリケーションを外部からの攻撃から守る重要な防御層となります。Amplifyのファイアウォール設定（2025年1月時点でプレビュー機能）では、複数の保護機能を提供しています。

特に注目すべきは、IPアドレスベースのアクセス制御です。社内からのアクセスに限定する場合、ホワイトリスト方式でIPアドレスを制限することで、不正アクセスのリスクを大幅に低減できます。

なお、IPアドレスベースのアクセス制御を有効にした場合、国別のアクセス制限は設定できなくなります。これは両者が排他的な関係にあるためです。そのため、アクセス制御の方式は、要件に応じていずれかを選択する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645488/f1d13c5d-f35a-c29c-0c43-cab322e8e4c4.png)



### 5. S3バケットのセキュリティ設定

最後に、基盤となるS3バケット自体のセキュリティ設定も重要です。以下の設定を推奨します：

バージョニングの有効化は、誤ったファイルの削除や上書きからの復旧を可能にします。特にWebコンテンツ管理では、この機能が重要な役割を果たします。

サーバーアクセスログの有効化も必須です。これにより、誰がいつどのようなアクセスを行ったかを追跡できます。セキュリティインシデントの調査や、コンプライアンス要件への対応に不可欠です。

さらに、TLS接続の強制やパブリックアクセスのブロックなど、基本的なセキュリティ設定も忘れずに実施しましょう。

### デフォルトの設定状態

Storage Browser for Amazon S3をGitHubの資材を用いてデプロイした直後の状態では、以下のような設定となっています：

- **S3バケットの設定**
  - バージョニング：無効
  - バケットの暗号化：SSE-S3による暗号化が有効
  - サーバーアクセスログ記録：無効
  - オブジェクトロック：無効
  - パブリックアクセス：ブロック（有効）
  - バケットポリシー：
    - TLS接続の強制（HTTP通信の拒否）
    - Amplify用IAMロールに対して以下の権限を付与
      - s3:PutBucketPolicy
      - s3:GetBucket*
      - s3:List*
      - s3:DeleteObject*

これらの設定は、基本的なセキュリティを確保していますが、本番環境での利用に際しては、前述のセキュリティ対策に従って追加の設定を行うことを推奨します。

## まとめ

Storage Browser for Amazon S3は、コンテンツ管理者等AWSの知識がないユーザがGUIで簡単にS3上のオブジェクトを操作することができる便利な機能です。しかし、その利便性を活かしつつセキュリティを確保するためには、本記事で解説した多層的な対策が必要です。

特に重要なのは、認証・認可の適切な設定、きめ細かなアクセス制御、そして攻撃への対策です。これらを適切に実装することで、安全かつ効率的なコンテンツ管理が実現できます。


## 参考URL

- [Connect users to data through your apps with Storage Browser for Amazon S3](https://aws.amazon.com/jp/blogs/news/connect-users-to-data-through-your-apps-with-storage-browser-for-amazon-s3/)
- [Storage Browser - UI Components](https://ui.docs.amplify.aws/react/connected-components/storage/storage-browser)
- [Storage Browser for Amazon S3の使い方](https://dev.classmethod.jp/articles/storage-browser-for-amazon-s3/)
- [Amplify Gen2のoutputs.jsonについて](https://dev.classmethod.jp/articles/amplify-gen2-outputsjson/)