Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

Amazon S3のバケットポリシーを利用してアクセス制御を行う

はじめに

Amazon S3(Simple Storage Service)は、データの保存と管理に使用されるストレージサービスであり、その利用にはアクセス制御が不可欠です。
本稿ではAmazon S3のアクセス制御において重要な役割を果たす「バケットポリシー」について解説し、既存のS3バケットに対してバケットポリシーを適用する手順をご紹介します。

S3バケットポリシーとは

S3バケットポリシーとはAmazon S3バケットに対するアクセス許可を管理するためのルールを設定する仕組みです。
これらのポリシーはJSON形式で記述され、特定のユーザーやアカウントがバケット内のオブジェクトに対してどのような操作(読み取り、書き込み、削除など)を行うことができるかを定義します。
バケットポリシーはS3バケットの所有者だけでなく、他のAWSアカウントのユーザーに対するアクセス許可も管理することが可能です。
これによりS3バケットのセキュリティを強化し、データのアクセスをより細かく制御することができます。

アクセス制御とバケットポリシー

例えば、以下のような要件がある場合にバケットポリシーを設定します。

  • 特定のIPアドレスからのアクセスを許可または拒否する
  • バケット内の特定のオブジェクトへのアクセスを許可または拒否する
  • 特定の時間帯にバケットへのアクセスを許可または拒否する

バケットポリシーの適用手順

それでは実際に既存のS3バケットに対してバケットポリシーを適用する手順をご紹介します。
今回は上記で述べた特定のIPアドレスからのアクセスを許可または拒否するという要件を想定し、S3バケットに対して操作を行うEC2のIPアドレスを設定します。
なお後述の手順ではバケットポリシーのみ新規作成し、その他のAWSリソースはあらかじめ作成済みのものを使用しています。
構成図

手順① AWSマネジメントコンソールにサインイン

AWSマネジメントコンソールにサインインします。
マネコンログイン

手順② サービスメニューから「S3」を選択

画面左上のテキストボックスにS3を入力します。
表示されたS3をクリックします。
S3選択

手順③ バケットの選択

S3バケットを選択します。
ここではあらかじめ作成しておいたaws-test-bucket-0000001を使用します。
バケット選択

手順④ バケットの詳細ページの「アクセス許可」タブをクリック

バケットの詳細ページのアクセス許可タブをクリックします。
アクセス許可

手順⑤ バケットポリシーの「編集」をクリック

画面を下にスクロールし、バケットポリシーの編集をクリックします。
バケットポリシー編集

手順⑥ バケットポリシーの作成

指定されたIPアドレスからのGetObject操作を拒否するバケットポリシーを作成・適用します。
以下を参考にしながらバケットポリシーを編集し、編集が完了したら変更の保存をクリックしてください。
<EC2-instance-IP>をEC2インスタンスのグローバルIPアドレスに置き換えてください。

  {
    "Version":"2012-10-17",
    "Statement":[
      {
        "Sid":"aws-test-bucket-0000001-policy",
        "Effect":"Deny",
        "Principal": "*",
        "Action":"s3:GetObject",
        "Resource":"arn:aws:s3:::aws-test-bucket-0000001/*",
        "Condition":{
          "NotIpAddress":{
              "aws:SourceIp":"<EC2-instance-IP>"
          }
        }
      }
    ]
  }

ポリシー更新

動作確認

設定が正しく行われたかテストを行います。
バケットポリシーがうまく設定されていればダウンロードが拒否されるはずです。
ここまでの構成とテストの前提条件は以下の通りです。
構成図2

手順① テスト用EC2にログイン

あらかじめ用意しておいたテスト用EC2にログインします。
EC2ログイン

手順② ダウンロードコマンドを実行

EC2上で以下のコマンドを実行し、ファイルをダウンロードします。
aws s3 cp s3://aws-test-bucket-0000001/test.txt ~/test.txt
コマンド実行

操作が拒否されました。

AWSではアイデンティティのポリシー(IAMポリシー)とリソースベースのポリシー(バケットポリシー)の両方で許可されている場合にアクションが許可されますが、どちらかのポリシーで明示的に拒否してる場合は許可が無効になります。
今回の例ではEC2にS3バケットaws-test-bucket-0000001に対する全ての操作を許可するIAMポリシーがアタッチされており、バケットポリシーではEC2からのファイルダウンロードのみを制限しています。
そのためEC2からのファイルダウンロード以外の操作(例えばバケット内オブジェクトの一覧取得など)は許可されているはずです。
以下のコマンドを実行し、バケット内オブジェクトの一覧取得ができるか確認します。
aws s3 ls s3://aws-test-bucket-0000001
オブジェクト一覧取得

オブジェクトの一覧が取得できました。
バケットポリシーによってファイルのダウンロードのみが制限されていることを確認できました。

まとめ

本稿ではバケットポリシーの概要と、S3バケットに対してバケットポリシーを適用する手順についてご紹介しました。
S3に対するアクセス制御を行う方法は他にもありますが、バケットポリシーを採用する場合は本稿の手順が参考になれば幸いです。