+86 13541016684Mon. - Fri. 10:00-22:00

「CloudFront + S3」使用签名URL进行访问限制

「CloudFront + S3」使用签名URL进行访问限制

「CloudFront + S3」使用签名URL进行访问限制

Upload在这里使用CloudFront + S3,搭建生成签名URL的CDP(Private Cache Distribution)。以下是操作流程;

  1. 创建Amazon S3
  2. 创建CloudFront Distributions
  3. 生成签名URL

创建Amazon S3

在这里创建Amazon S3以后,把index.html文件上传到S3上。

  1. 登录AWS管理界面
  2. 点击S3
  3. 点击[创建存储桶]

CreateBucket1

  • 点击[上传]
  • 点击[添加文件]

Add_File

  • 点击[开始上传]

Start_Upload

    确认状态为[完成]

Upload_Completeindex.html的内容如下。

<html>
  <head>
    <title>private</title>
  </head>
  <body>
    <h1>只可以从CloudFront访问的S3!</h1>
  </body>
</html>

创建CloudFront Distribution

  • 点击[Create Distribution]

Create_Distribution

  • 点击[Get Started]

Get_Started点击[Get Started]之后会显示具体的配置页面。

Orgin Settings

  • Origin Domain Name:aws.s3.amazonaws.com <- 选择刚才创建的Amazon S3
  • Origin Path:默认 <- CloudFront会把填写的路径添加到Origin Domain Name后面
  • Origin ID:S3-awsgood <- 默认
  • Restrict Bucket Access:Yes
  • Origin Access Identity:Create a New Identity
  • Comment:access only from CloudFront <- 注释部分,可任意填写内容
  • Grant Read Permissions on Bucket:Yes,Update Bucket Policy

Origin_Setings

  • Path Pattern:默认
  • Viewer Protocol Policy:HTTP and HTTPS
  • Allowed HTTP Methods:GET,HEAD
  • Object Caching:Use Origin Cache Headers
  • Minimum TTL:0
  • Forward Cookies:None
  • Whitelist Cookies:有效化Forward Cookies的话,只允许Whitelist的Cookie转发到原始服务器
  • Forward Query Strings:No <- 选择Yes的话,可缓存QueryParameter的URL
  • Smooth Streaming:No
  • Restrict Viewer Access:Yes <- 只允许签名URL访问
  • Trusted Signers:Self <- 选择Specify Accounts的话,其他用户的签名也将会有效化

Default_Cache_Behavior_Settings Distribution Settings在这里使用默认配置。

配置完成之后点击[Create Distribution] Distribution_Settings

CloudFront Distributions的状态为[In Progress]。

CloudFrontDistributions等待10分中之后状态变为[Deployed],并且Domain Name是这次创建的CloudFront Distribution的域名。

CloudFront_Deployed配置完之后,查看aws桶的权限发生了变化。查看方法如下

  1. 在AWS管理控制台选择S3
  2. 选择桶以后,点击[属性]
  3. 点击[权限]
  4. 点击[编辑存储桶策略]
{
	"Version": "2008-10-17",
	"Id": "PolicyForCloudFrontPrivateContent",
	"Statement": [
		{
			"Sid": "1",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3L6IN8Q7KY7GE"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::awsgood/*"
		}
	]
}

进行以上配置以后,只允许用签名URL进行访问,直接输入URL的页面如下。

Error_Page

创建签名URL

为了创建签名URL,首先创建CloudFront密钥对。

  1. 点击创建CloudFront密钥对
  2. 点击[CloudFront密钥对]

Create_Credential点击[创建新的密钥对] Create_KeyPair

  1. 点击[下载私有密钥文件]
  2. 点击[下载公有密钥文件]
  3. 确认文件以下载之后,点击[关闭]
    • 私有密钥文件:pk-密钥对ID.pem
    • 公有密钥文件:rsa-密钥对ID.pem

DownLoad_KeyPair

使用AWS SDK for PHP生成签名URL。

把私有密钥上传到Amazon EC2以后,创建如下php文件。创建php文件之前需安装AWS SDK for PHP,安装方法参考 >> 安装AWS SDK for PHP

  • private_key:CloudFront私有密钥的路径
  • key_pair_id:CloudFront密钥对的ID
  • HostUrl:创建CloudFront的DomainName
  • expires:签名URL的超时时间
# cat cloudfront.php
<?php
require_once("vendor/autoload.php");
date_default_timezone_set('Asia/Chongqing');
use Aws\CloudFront\CloudFrontClient;

$client = CloudFrontClient::factory(array(
    'private_key' => '/path/to/your/cloudfront-private-key.pem',
    'key_pair_id' => 'cloudfront key pair id',
));

$HostUrl = 'CloudFront DomainName';
$resourceKey = 'index.html';
$expires = time() + 300;

$signedUrl = $client->getSignedUrl(array(
    'url'     => $HostUrl . '/' . $resourceKey,
    'expires' => $expires,
));

print $signedUrl;

执行cloudfront.php后,把生成签名URL粘帖到浏览器。

# php cloudfront.php

https://d1e2kb4c29diqv.cloudfront.net/index.html?Expires=1430200266&Signature=fAwSd3JgwY2WlP78G11QvOhT2kGNvhKnurNbctMs0rgCejl7VsCwlI0xHWsZA6pxaeqfTmUdtzfup4Cn6IvKWTQmNCsFCPiQQ4Uzyyj0vQpajFj60I1bnKbe0XopbY4~MvT13ZrHyJQNSeJTyVjLfPQvW482skLNF3SQSDufPSl2gokCxSoX83U7RGTvkVMJt8RWdgsx4sjEXo3z4KBtDoa4P9LecDYBtidH-xwzgmtFGeLyA12KdEwUVp6LdHHle3BOYOmWyqwgowDWI6T4-S2Rn4tHlrXGpqLpt5w5~h3bH-w~FDG0v6BaUJjvu2EgMJlqqdXc24w5d3oyE8tMFw__&Key-Pair-Id=APKAJEQ4CITOZRVLKRZQ

Access_Success

过5分钟访问的话,会出现如下页面。

Access_Denied

也可以通过以下php代码生成限时URL。

<?php
require_once("vendor/autoload.php");
date_default_timezone_set('Asia/Chongqing');
use Aws\S3\S3Client;

$config = array(
        'key'   => 'Access Key Id',
        'secret'=> 'Secret Access Key',
);

$s3 = S3Client::factory($config);
$url = $s3->getObjectUrl("awsgood", "index.html", "1 minutes");

print $url;

参考网站