使用临时链接分享私有文件

AWSBeginner
立即练习

介绍

一位同事需要临时下载私有报表。你将生成并测试签名链接,检查访问限制,并在不将文件公开的情况下清理练习资源。

请先完成 使用对象键和元数据组织文档,掌握对象键、下载和清理。私有存储桶和受限身份已在这个全新 VM 中准备好,不需要个人登录或编写 IAM 策略。使用 Terminal 和旁边的 AWS View 标签页。请保密完整下载链接。

使用已配置的身份读取报表

在本步骤中,你将读取允许访问的报表,并看到另一个私有对象仍不在该身份的权限范围内。

权限(permission)定义身份可以对资源执行什么操作。已准备好的读取者可以列出这个桶并读取 shared/report.txt,但不能读取 private/payroll.txt 或修改存储。你将使用这些权限,不编写策略;IAM 课程稍后会教授策略。

使用 cd(更改目录)进入工作目录:

cd /home/labex/project

列出已准备好的存储桶中 shared 前缀下的对象:

aws s3 ls s3://labex-private-documents/shared/

列表包含一行以 report.txt 结尾的输出;在这个前缀下,它指完整对象键 shared/report.txt。前缀组织对象键;它的名称不会让对象变成公开对象。AWS CLI 请求成功,是因为配置的身份被允许列出存储桶。

通过经过身份验证的 AWS CLI 请求下载报表:

aws s3 cp s3://labex-private-documents/shared/report.txt authorized-report.txt

使用打印本地文本文件的 cat 查看这份合成报表:

cat authorized-report.txt
Monthly report: 42000 revenue

在 AWS View 中打开 shared/report.txt。预览使用读取者被允许的访问权限,显示相同的存储内容。

示例:读取者可以预览共享报表。

这个示例展示已配置读取者可访问的报表。下一步的下载命令会检查临时链接本身。

尝试读取独立的工资对象:

aws s3 cp s3://labex-private-documents/private/payroll.txt denied-payroll.txt

这个命令预期会失败,出现 403 或 AccessDenied 错误。对象存在,但这个读取者不被允许读取它。身份能够访问一份报表,并不意味着可以访问桶中每个对象。你只会分享允许访问的报表。

生成并使用临时下载链接

在本步骤中,你将生成签名链接,并用 HTTP 客户端下载报表,接收方请求无需携带 AWS 身份。

临时链接允许在时限结束前执行获准的下载。

临时下载链接

预签名 URL(presigned URL)是携带签名和过期时间的链接。它让接收方在不获得你的 AWS 凭据的情况下执行获准的下载。链接文件已设为受限权限;请保密完整内容。

aws s3 presign 生成授权下载指定对象的 URL。--expires-in 以秒指定请求的有效期;600 表示从生成时起十分钟。这不会改变对象的访问权限。Shell 的 > 将输出写入已受保护的本地文件,避免显示完整链接:

aws s3 presign s3://labex-private-documents/shared/report.txt --expires-in 600 > download-link.txt

命令没有打印内容,因为输出写入了文件。持有这个 URL 的任何人都可以在有效期内使用其委托访问权限,因此请勿在截图或公开消息中包含完整链接。

将链接读入 Shell 变量,不打印它。$(...) 捕获命令输出;cat 读取文件,DOWNLOAD_URL=... 将捕获的文本赋给变量。赋值的 = 两侧没有空格:

DOWNLOAD_URL=$(cat download-link.txt)

curl 发起 HTTP 请求。-f 将 HTTP 错误响应报告为失败,-sS 隐藏进度条但保留错误消息,-o 将响应正文写入本地文件。双引号将整个 URL,包括查询参数,保持为一个参数:

curl -fsS "$DOWNLOAD_URL" -o shared-download.txt

Curl 没有接收 AWS 凭据或 profile;URL 本身携带下载所需签名。读取结果:

cat shared-download.txt
Monthly report: 42000 revenue

cmp 逐字节比较两个文件。&& 只在比较成功后打印消息:

cmp authorized-report.txt shared-download.txt && echo 'Temporary-link download matches'

消息确认 HTTP 下载包含相同报表。仅生成链接不能证明它可用;这个请求测试实际权限、签名和存储字节。如果下载前已超过十分钟,请生成新链接,并使用上面的两条命令重新载入变量。

检查链接何时过期

在本步骤中,你将观察分享链接的时限。十分钟链接便于测试成功下载;另一个短期链接则让你快速观察过期。

生成另一个刻意设置为十五秒有效期的链接,保存在第二个受保护文件中:

aws s3 presign s3://labex-private-documents/shared/report.txt --expires-in 15 > short-link.txt

捕获它,不显示内容:

SHORT_URL=$(cat short-link.txt)

sleep 等待指定秒数。等待十六秒,超过这个短期链接请求的有效期:

sleep 16

再次使用原来的短期链接,不生成替代链接。这里的 -s 隐藏进度条,-o 保存响应正文,-w 只打印 HTTP 状态。%{http_code} 是 curl 的状态字段,\n 结束该行。这里省略 -f,让你可以查看拒绝结果:

curl -s -o expired-response.xml -w '%{http_code}\n' "$SHORT_URL"

预期状态:403。文件仍存在,你的身份仍可读取它,但委托 URL 的时间窗口已经结束。XML 响应正文解释过期请求;这个响应不包含链接,可以安全查看:

cat expired-response.xml

其中的 Code 为 AccessDenied,Message 为 Request has expired.。这确定了拒绝原因;连接失败不能证明过期。

使用已准备好的维护身份清理

在本步骤中,你将使用已准备好的维护身份删除实验对象和存储桶。

默认读取者刻意没有删除权限。AWS CLI 配置档(profile)是选择身份和服务设置的具名配置。已准备好的 cleanup 配置档被允许删除这些练习资源。--profile cleanup 为后续命令选择它;你不需要输入或查看凭据。

按准确对象键删除共享报表:

aws --profile cleanup s3 rm s3://labex-private-documents/shared/report.txt

同样按准确对象键删除另一个一次性素材:

aws --profile cleanup s3 rm s3://labex-private-documents/private/payroll.txt

两条删除消息都包含预定对象名称。通过经过身份验证的列表查询确认桶为空:

aws --profile cleanup s3 ls s3://labex-private-documents/ --recursive

命令成功,没有对象行。删除空桶:

aws --profile cleanup s3 rb s3://labex-private-documents

输出为 remove_bucket: labex-private-documents。确认剩余存储桶:

aws --profile cleanup s3 ls

没有剩余存储桶行,AWS View 显示 No buckets。下载链接无法提供已删除的文件。受保护的本地 URL 文件也可以通过本地 rm 删除,因为不再需要它们:

rm download-link.txt short-link.txt

下载的报表副本仍可用于检查。存储删除、链接过期和本地文件清理是不同操作;你完成了本练习中各个适用部分。

总结

你读取了允许访问的私有报表,观察到对象读取被拒绝,生成了临时下载 URL,并将 HTTP 下载内容与经过身份验证的副本比较。随后,你检查了短期链接在过期后被拒绝。

预签名 URL 委托签名身份已被允许的操作,不会让对象公开或绕过权限。请将完整链接视为临时访问秘密。最后,你使用独立维护配置档删除了实验对象、存储桶和本地 URL 文件。