Abheenash/serverless-file-share

GitHub: Abheenash/serverless-file-share

基于 AWS 无服务器架构的自毁式文件分享应用,通过过期链接和自动销毁机制实现安全、临时的文件传输。

Stars: 0 | Forks: 0

# Serverless File Share — AWS 上的自毁式文件分享 通过会过期的链接分享文件。文件在静态时会被加密,链接会定时失效,文件本身也会在到期后销毁——不留痕迹。 **状态:** ✅ 所有阶段已完成 — 完整的 IaC + CI/CD([docs/stage5.md](docs/stage5.md))。请查看[架构图](docs/architecture.md)。公开构建。 ## 截图 | 上传 | 分享链接 | 过期 | |---|---|---| | ![UI](https://static.pigsec.cn/wp-content/uploads/repos/cas/48/48ee983c360853d14c35dd37f2ba8360d80a4b6cb2c2a7485da9b751c2342024.png) | ![分享链接](https://static.pigsec.cn/wp-content/uploads/repos/cas/c4/c43019ffd8c2f8798d6f090c1a847beb69c5e4b54281a5f05bfaf2d2f8d2d514.png) | ![过期](https://static.pigsec.cn/wp-content/uploads/repos/cas/ef/ef8757d28515ef72d51cc455dea9d7c4c92ffea022ddcd57e9909b7184374905.png) | ## 关于本项目 一个小巧且真实的产品,演示了安全优先的 Serverless 架构:最小权限的 IAM、KMS 加密、通过预签名 URL 进行短期访问,以及完全自动化的数据生命周期。无需修补服务器,静态时的成本几乎为零。 ## 目标架构 ``` Sender/Recipient │ ├──> CloudFront ──> S3 (static web UI) [Stage 4] │ └──> API Gateway ──> Lambda "issue-url" │ │ │ └──> S3 files bucket (private, SSE-KMS) │ ▲ presigned PUT/GET └──> DynamoDB (metadata, TTL) │ TTL expiry → DynamoDB Streams └──> Lambda "reaper" ──> deletes object + metadata (S3 lifecycle rule as backstop) ``` ## 工作原理(规划) 1. 发送方请求 API 提供上传链接。Lambda 返回一个**预签名 PUT URL**(有效期较短),并将元数据项写入 DynamoDB,其 **TTL** 与文件的生命周期相匹配。 2. 文件最终存入一个**私有、使用 SSE-KMS 加密的存储桶**。Block Public Access 在账户范围内开启;任何内容都不会公开。 3. 分享链接是一个**预签名 GET URL**,其有效期由发送方选择(15 分钟到 7 天)。 4. 当 TTL 触发时,DynamoDB Streams 会触发 **reaper Lambda**,从而删除该 S3 对象及元数据项。S3 **生命周期规则**作为后备方案,以防 reaper 发生故障。 ## 服务及其用途 | 服务 | 此处的角色 | |---|---| | S3 | 文件存储;后期也托管静态 UI | | Lambda | issue-url(创建预签名 URL + 元数据)和 reaper(到期时删除) | | API Gateway | HTTPS 前门、限流、后期的身份验证 | | DynamoDB | 文件元数据;TTL 驱动自毁;Streams 触发 reaper | | KMS | 用于静态 SSE-KMS 加密的客户管理密钥 | | IAM | 每个 Lambda 一个最小权限角色 | | EventBridge | 考虑用于过期的备选调度程序(记录了权衡取舍) | | CloudFront + Route 53 | UI 分发 + 自定义域名(第 4 阶段) | | Terraform + GitHub Actions | 基础设施即代码 + CI/CD(第 5 阶段) | ## 安全决策 - 到处开启 **Block Public Access**;访问文件的唯一方式是使用预签名 URL。 - 使用客户管理密钥的 **SSE-KMS**;密钥策略仅授予两个 Lambda 角色使用权限。 - **每个函数最小权限:** issue-url 角色可以对文件前缀执行 `s3:PutObject`/`s3:GetObject`,以及对数据表执行 `dynamodb:PutItem` —— 预签名 URL 授予的权限永远不会超过其签名者持有的权限。reaper 角色只能执行 `s3:DeleteObject` 和 `dynamodb:DeleteItem`。 - **一切皆为短期有效:** 上传 URL 在几分钟内即过期;下载有效期由发送方选择且设有上限。 - **代码中无密钥**;开启 CloudTrail 以提供完整的审计追踪。 ## 路线图 - [x] 阶段 0 — 仓库、账户日常维护(IAM 管理员 + MFA、$5 预算警报)、AWS CLI - [x] 阶段 1 — 手动 MVP:私有加密存储桶、通过 CLI 上传、预签名 GET、验证过期 - [x] 阶段 2 — API:Lambda + API Gateway 发布预签名 URL;带 TTL 的 DynamoDB 元数据 - [x] 阶段 3 — 自毁:TTL → Streams → reaper Lambda;生命周期兜底;SSE-KMS + 最小权限 IAM - [x] 阶段 4 — S3 + CloudFront 上的最小化 Web UI(自定义域名已推迟 — 参见 docs/stage4.md) - [x] 阶段 5 — Terraform 重构(`terraform/`,38 个资源)、GitHub Actions CI/CD、[架构图](docs/architecture.md) **未来范围:** 身份验证(Cognito JWT)、自定义域名、可观测性等 — 在 [docs/future-scope.md](docs/future-scope.md) 中设计。 ## 成本 专为在免费套餐中运行而设计:在业余爱好级别的使用量下,S3 + Lambda + DynamoDB 按需模式 + API Gateway 的成本仅需几美分。$5 的预算警报为账户提供保障。 由 Rajolu Abheenash 构建 — [github.com/Abheenash](https://github.com/Abheenash)
标签:AWS, DPI, 文件共享, 阅后即焚