minminの備忘録

フルスタックになりたいエンジニアの備忘録 → https://zuminblog.com/ へ引越し中

AWS S3のバケットに対して、特定のIPからのみアクセスできるようにする

最近AWSをいじり始めてみてるので、まずはS3のアクセス制限から備忘録としてまとめてみたいと思います。

やりたいこと

AWS S3に格納されているオブジェクトを、特定のIPからのみアクセスできるようにしたい

今回説明する方法をもとに様々な方法でアクセス制限をアレンジしてもらえればと思います

そもそもAmazon S3って?

Amazon S3とはAmazon Simple Storage Serviceの略で、名前の通りクラウドのストレージサービスです

メリットとしては、所謂「クラウド」の利点である、スケーラビリティや信頼性を利用者は意識する必要がないことなどがあげられます

やり方

大まかな流れ

  1. S3のバケットを作成し、データを格納
  2. デフォルトではパブリックアクセスができないので、バケットポリシーを作成し、特定IPからファイルにアクセスできるようにする

詳細

バケットの作成・データ格納

  1. AWSマネジメントコンソールにサインイン

  2. 左上の「サービス」→「S3」を選択し、S3のサービスに入る

  3. バケットを作成する」をクリックし、バケット名やリージョンを入力する→「作成」をクリック

    • 細かい設定をすることもできますが、今回はデフォルトのままでいきます
  4. 作成したバケットをクリックし、バケットの中に入る

  5. 「アップロード」をクリックし、オブジェクト(今回は画像)をアップロード

  6. ファイル名をクリックすると、オブジェクトURLが下に出てくるのでアクセスする

  7. 以下のようにアクセス拒否されることを確認する

f:id:minmin_21:20191022152229p:plain

バケットポリシーの作成・適用

  1. バケットのページに戻り、「アクセス権限」→「バケットポリシー」をクリック

  2. 下の方にある、「ポリシージェネレーター」をクリックする

  3. ポリシージェネレーターのページが開くので、以下のように情報を入力する

    • Type of policy: S3 bucket policy
    • Effect: Allow
      • アクセス許可を設定するポリシーなのか、拒否を設定するポリシーなのかを設定
    • Principal: *
      • リソースへのアクセスを誰に許可/拒否するかみたいなものを設定します(今回は匿名で良いので 「*」を設定)
      • 詳しくは、以下を参考にしてください
    • AWS Service: Amazon S3
      • どのサービスに対するポリシーかを設定
    • Actions: GetObjectを選択
      • どの操作を許可/拒否するかを設定(今回は、Getだけ許可したい)
    • Amazon Resource Name(ARN): arn:aws:s3:::<bucket_bame>/*
      • どのリソースにポリシーを適用するかを指定する(今回は、バケット内のすべてのリソースに適用する)
    • Add Conditionsをクリックし、追加の条件を入れる→「Add Condistion」→「Add Statement」
      • Condition: IpAdderess
      • Key: aws:SourceIp
      • Value: Your IP Address
  4. 「Generate Policy」をクリックすると、ポリシーが生成されるのでコピーし、「バケットポリシーエディター」に入力する→右上の「保存」

ちなみに生成されたバケットポリシーはこんな感じ

{
    "Id": "XXXXXXXXXXXXXXXXXX",
    "Version": "XXXXXXXXXX",
    "Statement": [
        {
            "Sid": "XXXXXXXXXXX",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<YOUR BUCKET NAME>/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "<YOUR IP ADDRESS>"
                }
            },
            "Principal": "*"
        }
    ]
}

もう一度、オブジェクトURLにアクセスしてみると、画像が見えるように!!

他のIPアドレスの端末からアクセスできるか確認してみると、見えない(はず)

参考