株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

【AWS CloudFront + S3】Origin Access Identity を利用した S3 のアクセス制限

こんにちは。クイックSREチームのみっちーです。

前回は、CloudFront+WAFを利用して、開発環境等のIP制限を実装する方法をご紹介しました。
引き続き今日は、S3へのアクセスを「特定のIPアドレス」または「CloudFrontからのみ」許可する設定をご紹介します。

CloudFront+S3のセットで利用する際は、
CloudFrontからのみ、S3へアクセス可能とする場合が多いのではないでしょうか。
ただその場合だと、同一名称でファイルを上げ直した時に、キャッシュが残って困る事があるかと思います。
(この点については、query stringを付けた運用をしているのであれば気にならないと思いますが・・・)

そんなときは、今回ご紹介する方法を試してみて下さい。
S3へ直接アクセスが可能になるため、毎度キャッシュを消さなくても良いことが運用上のポイントです。

なお、今日ご紹介する方法は単独でもいいですし、前回の内容と組み合わせて使うことも可能です。
それではさっそく設定方法を見ていきましょ~ ✧(・ㅂ・)و

前提

  • CloudFront + S3 の構成。

  • 開発者は、S3、CloudFrontの両方へ直接アクセス可能にしたい。

  • ユーザは、CloudFront経由でしか画像にアクセスできないようにしたい。

  • アクセス制限の対象となるCloundFrontとS3は、それぞれ事前に作成済みである。

  • 運用イメージは以下の通り。

    f:id:aimstogeek:20170925190949j:plain

手順概要

必要な手順は大まかに以下の2つです。

1. [AWS CloudFront] Origin Access Identity の設定

2. [AWS S3] IPアドレスベースのbucket policyを追加

手順詳細

1. [AWS CloudFront] Origin Access Identity の設定

AWSコンソールにログインし、「Services」->「CloudFront」をクリックします。

次に、アクセス制限をかけたいS3とセットになっているCloudFront Distributionを選択して、Origins の「Edit」をクリックします。 f:id:aimstogeek:20170926174037j:plain


Origin Settings

AWS CloudFrontからのみアクセスできるように、一意の Access Identity(ID) を追加します。 f:id:aimstogeek:20170926174402j:plain

  • Restrict Bucket Access Yes を選択します。
    ※ ここをYesとすると、これ以降の2項目が表示されるようになります。

  • Origin Access IdentityCreate a New Identity を選択します。
    ※ CloudFrontからのアクセスであることを示す一意のIDです。
    ここでは新規作成していますが、
    他のCloudFront Distributionで作成したIDを使いまわすことも可能です。

  • Grant Read Permissions on BucketYes,Update Bucket Policy を選択します。
    S3 bucket policyに、自動でAccess Identity(ID)を追記してくれます。
    Noを選ぶと、手動追加となり不便です。
    特に理由が無ければYesを選びましょう。


問題なければ、下段のYes Editをクリックして反映させましょう。

なお、設定変更直後はStatusがIn Progressとなり、この間は設定が反映されていません。
しばらく(20~40分程度)して反映完了すると、StatusがDeployedになります。



2. [AWS S3] IPアドレスベースのbucket policyを追加

続いて、S3のbucket policy設定です。

AWSコンソールにログインし、「Services」->「S3」をクリックします。
次に、アクセス制限をかけたいBucketを選択して、
Permissionsの「Bucket Policy」をクリックします。

「CloudFront Origin Access Identity」の bucket policy

この時点で、以下のようにPrincipal: CloudFront Origin Access Identityのpolicyが自動で追加されていると思います。 f:id:aimstogeek:20170928190308j:plain

        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <一意のID>"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::test.s3.hoge.com/*"
        },




IPアドレスベースのbucket policy

続いて、特定のIPアドレスからのアクセスを許可するように、ポリシーを追加します。
f:id:aimstogeek:20170928185212j:plain

{
            "Sid": "Allow-from-specific-IP-only",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3::test.s3.hoge.com/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "<許可するIPアドレス/サブネットマスク>"
                    ]
                }
            }
        }

問題なければ、Saveしましょう。設定は即時反映されます。

以上で設定は完了です。
これで、「特定のIPアドレス」または「CloudFrontからのみ」アクセスが許可される形となります。


いかがでしたか。
ちなみに、S3 bucket policyに「CloudFrontのIP & 特定IP」を記載する方法でもアクセス制限の実現は可能です。
ただしこの場合、CloudFrontのIPが動的に変わるため、適当なタイミングでIPリストの更新をする必要があり、少々不便です。

今回ご紹介した方法では、
EffectがAllowどうしのポリシーを複数束ねることで、or条件として使うことができる特性を利用し、IPリストの手動更新を不要としています。
S3 bucket policyは考え方に少々クセがあって、慣れるまでは難しいかなと個人的には感じています。

ということで次回はS3のbucket policy(評価順序等)について書いてみたいと思います。
興味を持って頂けたらぜひまた読んでみて下さい!

それでは~ (・о・) /

この記事のトップへ戻る