CloudFront签名URL+S3实现私有内容发布(1)
作者: CBISMB
责任编辑: 贾西贝
来源: AWS
时间: 2017-02-21 14:18
关键字: CloudFront,URL,AWSCP
浏览: 0
点赞: 0
收藏: 0
Amazon CloudFront 是一个全球性内容分发网络 (CDN),可实现网站、API、视频内容或其他 Web 资产的快速分发。用户可以使用CloudFront来加速分发保存在Amazon S3存储桶上的各种内容,比如文档、图片、媒体文件和软件安装包等。很多AWS客户在使用CloudFront+S3通过互联网向自己的最终用户提供内容下载的时候,也希望能够限制到只允许合法的用户下载,比如那些已经通过了身份认证或已经付费的用户,避免开放下载可能造成的数据安全和流量成本等问题。进一步,这些AWS客户还希望能够限制其最终用户可以执行下载操作的日期时间段,发起下载请求的来源IP地址范围等等。使用CloudFront的签名URL功能就可以帮助AWS客户实现其私有内容的安全发布。
CloudFront签名URL功能简介
CloudFront的签名URL功能通过在普通的Http或Https请求中添加经过哈西和签名认证的策略内容,来保护私有内容不受非法访问。当收到来自客户端比如浏览器、移动App或桌面应用对特定资源的访问请求后,CloudFront会首先利用保存的密钥解密请求中包含的签名部分内容,检查是否完整和正确。然后CloudFront继续分析解密出的权限策略内容,并根据权限策略定义的限制条件来决定是否向客户端提供请求资源。
AWS客户可以开发Web服务或工具软件来向自己的最终用户提供签名URL,就可以让这些最终用户在受限的条件下安全地访问通过CloudFront发布的内容,比如存储在S3中的图片。
AWS客户除了可以在签名URL的权限策略定义中直接限制资源请求客户端可以访问的资源种类、请求发生时间、来源IP地址范围以外,结合CloudFront既有功能还可以进一步限制其发出请求的协议类型(Http或Https)、访问域名类型(CloudFront自动分配域名或客户自有域名)。
整体技术方案
需求
在正式开始创建CloudFront私有内容发布之前,我们首先要明确在创建过程中的一些主要的选项。对于这些选项的不同设置会影响最终所创建的私有内容发布的效果。好在通过CloudFront发布私有内容的主要步骤基本类似,通过了解一个典型的CloudFront私有内容发布的完整过程就可以快速理解和掌握其他方式的发布过程。下面的表格列出了几个主要可选项和我们本次演示所做的选择。
架构
一般地,一个完整的高性能私有内容发布平台主要包括四部分:内容源站,加速CDN,身份认证和权限管理,资源请求客户端。基于上面的需求分析,我们可以明确本次介绍中的四部分组成:
· 内容源站:S3存储桶
· 加速CDN:CloudFront
· 身份认证和权限管理:签名URL生成器
说明:这次功能演示并没有包括用户身份认证部分。这部分功能读者可以基于基本的签名URL生成器功能基础上继续添加。比如开发一个Web服务,在最终用户请求某个资源的时候先校验其身份,要求其先输入正确的用户名和密码,然后再为请求的具体资源自动产生签名URL并返回请求客户端。
· 资源请求客户端:用户浏览器,移动APP或桌面客户端应用
演示
当我们完成本次CloudFront签名URL+S3实现私有内容发布的相关设置和开发后,具体的演示过程如下:
1) 向S3存储桶上传需要发布的内容,比如图片文件或视频文件。
2) 利用签名URL生成器为上传的资源产生签名URL
3) 在测试机的浏览器中输入签名URL并发送请求给CloudFront
4) CloudFront验证签名URL
5) 如果被请求资源已经在CloudFront当前边缘节点的缓存中,直接返回被请求资源。
6) 如果被请求资源还不在CloudFront当前边缘节点的缓存中:
a) CloudFront从S3存储桶取回被请求资源
b) CloudFront将被请求资源返回浏览器
c) CloudFront在当前边缘节点缓存该资源
使用CloudFront签名URL+S3实现私有内容发布的完整步骤
完整的步骤将分为以下几个主要部分分别执行:
(1) 创建CloudFront密钥对
(2) 创建S3存储桶
(3) 上传SSL安全证书
(4) 创建CloudFront Web发布点
(5) 更新 CloudFront Web 发布点,启用签名URL功能
(6) 开发签名URL生成器
(7) 验证测试
创建CloudFront密钥对
1. 使用AWS 根账号登录Global AWS Web控制台
2. 访问“服务”-->“安全、身份与合规”-->“IAM”
3. 查看“安全状态”,点开“删除您的根访问密钥”,执行“管理安全证书”。
4. 访问“CloudFront密钥对”,执行“创建新的密钥对”。
5. 载创建的CloudFront密钥对对应的私钥文件,记录下密钥对的访问键值比如“BPMAJW4W4KMUGDSHRGWD”,这些内容在后面步骤开发签名URL生成器的时候都要用到。
f45c89a82b15:cert weimen$ ls *.pem
pk-APKAJW4W4KMUGDXXXXXX.pem
说明:产生和验证CloudFront签名URL需要用到信任的AWS账号所创建的CloudFront密钥对。这个信任的AWS账号既可以是创建CloudFront发布点的IAM用户所属的AWS账号(Self),也可以是其他任何信任的AWS账号。
请注意:普通IAM账号无法创建CloudFront密钥对,必须是用根账号。
创建S3存储桶
1. 使用具有完整S3操作权限的IAM用户登录Global AWS Web控制台
2. 访问“服务”-->“存储”-->“S3”,执行“创建存储桶”。
3. 在对话框中输入存储桶名称比如“cdntest0001”,选择区域,执行“创建”。
4. 记录下创建的存储桶名称,在后面步骤创建CloudFront Web发布点的时候会用到。
5. 上传测试图片文件比如“earth.jpg”到新创建的S3存储桶中
6. 选中新建存储桶比如“cdntest0001”,点击“属性”标签,点开“权限”,可以看到这时候存储桶策略为空,ACL设置只允许创建者访问。
上传SSL安全证书
1. 如果尚未安装AWS 命令行客户端(CLI), 请参照官方文档链接下载和安装AWS CLI: http://docs.aws.amazon.com/zh_cn/cli/latest/userguide/installing.html
2. 查找或新建一个IAM用户和对应API访问密钥(Access Key),需要保证该IAM用户拥有IAM SSL安全证书管理权限。
a) 关于如何创建IAM用户,请参见:
http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_users_create.html#id_users_create_console
b) 关于如何为IAM用户创建API访问密钥,请参见:
http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_access-keys.html
c) 关于如何为IAM用户设置权限策略,请参见:
http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies_create.html
http://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-iam-policy.html
3. 执行“aws configure”,设置IAM用户API访问密钥和默认区域名,默认区域可以为任一海外区域。
f45c89a82b15:cert weimen$ aws configure
AWS Access Key ID [****************6ZXA]:
AWS Secret Access Key [****************NOLI]:
Default region name [us-east-1]:
Default output format [json]:
4. 如果还没有CA签发的SSL安全证书,请提前完成申请,具体申请过程请参考相关CA的业务介绍说明。
5. 使用相关工具查看CA签发的安全证书内容,确认该证书包含正确域名信息。
6. 列表CA提供的证书相关文件,确认安全证书文件、私钥文件和证书链文件都存在。
f45c89a82b15:cert weimen$ ls -l
total 24
-rwxr-xr-x@ 1 weimen ANT\Domain Users 2065 1 4 21:54 mw.homyusc.com.crt
-rwxr-xr-x@ 1 weimen ANT\Domain Users 1700 1 4 21:54 mw.homyusc.com.key
-rwxr-xr-x@ 1 weimen ANT\Domain Users 3449 1 4 21:54 root_bundle.crt
7. 确认上面的文件内容都是X.509 PEM格式。如果不是,请使用对应工具先转化文件格式。下面的例子介绍了如何使用openssl将一个非PEM格式的.crt文件转化为PEM格式。
openssl x509 -in mycert.crt -out mycert.pem -outform PEM
8. 检查证书相关文件内容,确保格式正确
a) 安全证书文件mw.homyusc.com.crt
-----BEGIN CERTIFICATE-----
MIIFxzCCBK+gAwIBAgIQMwrcYbUzB6y7QHQiyYQuwTANBgkqhkiG9w0BAQsFADCB
hTELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
......
SkHCiJ3TLFqNNL7D/Lou5XuUVx9OdPneDrG3qXA2KDkFFSNIbI3TJKJ0icKOJyYj
hk6nE3hxn8S8PXJ670YaPozQRhT2ZW4hF10vpzZ5PY1cMZ+TCaKyTrlY0g==
-----END CERTIFICATE-----
b) 私钥文件mw.homyusc.com.key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEApeF7s/+BxjqPxri2DOhDla2XECfiJe02qG5TOLagm5e8niww
17ZmE6Ay5qR45Z8Tszkk1x3PPi0mSdkLeo24Nn9B1pwDpIIZZS3S5Pyiojz4Vu4J
......
ShsRa1MdKkWqHtWpu9HDPQwKqHhF6Z9d8MV+xGw7aieq63LfGGq0EmlMBWHRBpIQ
wV6SRCOf2YY1gHuftjmURyvNnoqntZtFfN2HHcO8QmfpRW2zpizZ
-----END RSA PRIVATE KEY-----
c) 证书链文件root_bundle.crt
-----BEGIN CERTIFICATE-----
MIIEzjCCA7agAwIBAgIQJt3SK0bJxE1aaU05gH5yrTANBgkqhkiG9w0BAQsFADB+
MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B
......
y+WutpPhI5+bP0b37o6hAFtmwx5oI4YPXXe6U635UvtwFcV16895rUl88nZirkQv
xV9RNCVBahIKX46uEMRDiTX97P8x5uweh+k6fClQRUGjFA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEtDCCA5ygAwIBAgIRAJOShUABZXFflH8oj+/JmygwDQYJKoZIhvcNAQELBQAw
PjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHogby5vLjESMBAG
A1UEAxMJQ2VydHVtIENBMB4XDTA4MTAyMjEyMDczN1oXDTI3MDYxMDEwNDYzOVow
......
QVkppV4ig8OLWfqaova9ML9yHRyZhpzyhTwd9yaWLy75ArG1qVDoOPqbCl60BMDO
TjksygtbYvBNWFA0meaaLNKQ1wmB1sCqXs7+0vehukvZ1oaOGR+mBkdCcuBWCgAc
eLmNzJkEN0k=
-----END CERTIFICATE-----
9. 上传SSL安全证书到AWS IAM服务
命令格式:
aws iam upload-server-certificate --server-certificate-name [自定义的已上传证书名] --certificate-body [PEM格式证书文件] --private-key [PEM格式私钥文件] --certificate-chain [PEM格式证书链文件] --path [访问路径]
f45c89a82b15:cert weimen$ aws iam upload-server-certificate --server-certificate-name MyTestCert --certificate-body file://mw.homyusc.com.crt --private-key file://mw.homyusc.com.key --certificate-chain file://root_bundle.crt --path /cloudfront/test/
{
"ServerCertificateMetadata": {
"ServerCertificateId": "ASCAIZCBMIGVKID653NV2",
"ServerCertificateName": "MyTestCert",
"Expiration": "2018-01-04T03:30:35Z",
"Path": "/cloudfront/test/",
"Arn": "arn:aws:iam::591809XXXXXX:server-certificate/cloudfront/test/MyTestCert",
"UploadDate": "2017-01-15T02:13:07.848Z"
}
}
请注意:
· 证书文件前面的“file://”不能省
· --certificate-chain 不能省,如果没有值,就表示是用根证书。
· --path访问路径必须是以“/cloudfront/”开头,以“/”结尾。
创建CloudFront WEB发布点
1. 使用具有完整S3和CloudFront操作权限的IAM用户登录Global AWS Web控制台
2. 访问“服务”-->“网络和内容分发”-->“CloudFront”,执行“Create Distribution”。
3. 选择创建Web发布点
4. 请按照如下表格内容选择或输入内容:
5. 其余设置都保留默认值
6. 执行“Create Distribution”,记录下创建的Web发布点域名,形如“dz60cvvsxhzn8.cloudfront.net”。
7. 访问“服务”-->“存储”-->“S3”,查看之前创建的存储桶已经发生了权限改变:
a) 存储桶ACL增加了“awsdatafeeds”账号的读写权限,目的是实现cloudfront日志文件上传。
b) 存储桶策略增加了CloudFront OAI用户账号的只读权限,实现CloudFront访问S3存储桶内容。
8. 刚刚创建完成的Web发布点将处于“In Progress”(正在部署)状态。
9. 请耐心等待Web发布点最终变为“Deployed”(完成部署)状态。
10. 请访问您的自有域名的管理服务,创建或修改cname记录将自有域名比如“mw.homyusc.com”指向新创建的Web发布点CloudFront域名比如“dz60cvvsxhzn8.cloudfront.net”。
11. 检查自有域名的cname记录设置有效
f45c89a82b15:cert weimen$ dig mw.homyusc.com
; <<>> DiG 9.8.3-P1 <<>> mw.homyusc.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13861
;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 4, ADDITIONAL: 4
;; QUESTION SECTION:
;mw.homyusc.com. IN A
;; ANSWER SECTION:
mw.homyusc.com. 19 IN CNAME dz60cvvsxhzn8.cloudfront.net.
dz60cvvsxhzn8.cloudfront.net. 60 IN A 52.84.26.216
12. 在测试电脑的浏览器中输入未签名的访问URL,使用https协议和自有域名,格式形如“https://mw.homyusc.com/earth.jpg” 。
a) 浏览器就可以显示来自S3存储桶中的图片
b) 浏览器中可以查看到之前上传的SSL安全证书
说明:
在这个阶段我们暂时还没有启用签名URL功能,只是设置了“自有域名”和S3存储桶“来源访问限制”功能。如果能够通过Https协议正常显示S3中的图片文件,说明前面的步骤设置正确无误。
