S3へのアクセスをEC2経由(特定のURL)のみに設定する
開発環境などに使用することがあるのでメモ
やりたいこと
- UserがEC2経由のhttpアクセス時のみS3のコンテンツを表示
- UserからS3への直アクセスは拒否する
設定
EC2側
1.httpdをインストール
# yum install httpd
- 下記のようにS3へアクセスするためのファイルを準備
index.html
<a href="https://REGION.amazonaws.com/BUCKETNAME/index.html">
S3link
</a>
S3側
- Bucketを作成
- Bucket配下にindex.htmlを配置
- index.htmlへアクセスを確認する (この段階ではアクセス出来る)
- BucketのPropertiesからPermissionsを選択、Edit bucket policyに下記を追加
bucketpolicy.
{
"Version": "2012-10-17",
"Id": "policy example",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKETNAME/*",
"Condition": {
"StringLike": {
"aws:Referer": "http://xxx.xxx.xxx.xxx/*"
}
}
}
]
}
設定後
-
S3へ直接アクセス
AccessDeniedになることを確認 -
EC2を経由しアクセス
S3へのリンクからコンテンツが表示されることを確認
追加検証
S3へファイルをアップロードする際にpublic-readを付与するとどうなるか
- index.htmlにpublic-readのACLを付与してS3へアップロード
# aws s3 cp index.html s3://BUCKETNAME/index2.html --acl public-read
- アクセスを確認する
S3への直接アクセスでアクセスが出来る
まとめ
S3への直接アクセスは拒否しつつEC2経由でのアクセスが出来る。
アクセス元のURLを指定すれば同じように特定のURLからのアクセス等も指定できる。
bucketpolicyの設定をすればbucket内の特定の拡張子やパスのみといった使い方も可能なはず。
HTTP Refererを利用してアクセスをしているためアクセス管理設定をEC2側である程度コントロール出来る。
(SecurityGroupで制限や特定のサブドメイン経由のみ、Basic認証付きや一部のコンテンツだけとかetc...)
今回のケースの様に使う際には、acl設定に注意してS3へアップロードすること。