无静态IP段的VPC外服务如何安全连接AWS托管数据库?
无固定公网IP的外部服务安全连接AWS托管数据库的可行方案
- IAM认证+API网关代理:全程不需要暴露数据库公网端口,也不需要配置固定IP白名单,外部服务通过签名后的合法请求访问API网关,网关转发流量到VPC内部的数据库链路,是通用性最高的方案
- 服务商固定出站IP白名单:如果你的外部服务所属的服务商提供公开的固定出站IP段(比如Cloudflare、Vercel的官方出站IP段),可以将该网段加入AWS RDS对应的安全组入站规则,仅允许该网段访问数据库端口,配置成本最低
- SSM会话隧道:如果外部服务可以运行AWS CLI,可通过AWS Session Manager建立到VPC内中转资源的加密隧道,不需要开放任何公网入站规则,适合有运维管控能力的场景
- 前置API层封装:在VPC内部署独立的API服务封装所有数据库操作,外部服务仅与API层交互,完全不直接接触数据库,适合需要做自定义逻辑管控的场景
Cloudflare Workers 访问AWS RDS MySQL的实现示例
以Cloudflare Workers为例,推荐走API Gateway + Lambda的中转链路,具体步骤:
- 将RDS MySQL部署在私有子网,安全组仅允许同VPC内的Lambda安全组访问
3306端口,不开放任何公网入站规则 - 编写Lambda函数,封装所有需要用到的数据库操作逻辑,内置参数校验、SQL注入防护逻辑
- 部署AWS API Gateway绑定上述Lambda,网关开启IAM身份验证模式,关闭公开匿名访问
- 在Cloudflare Workers的加密Secret变量中存储有权限调用API Gateway的IAM访问密钥,不要硬编码在代码中
- Workers发起请求前按照AWS SigV4规则对请求做签名,将签名后的请求发送到API Gateway
- API Gateway校验签名合法后转发请求到Lambda,Lambda执行数据库操作后将结果返回给Workers
前置API层的授权逻辑实现
如果你选择自己部署前置API层,可根据安全需求选择以下授权方案:
- 基础方案:API密钥校验
给每个调用方生成唯一的、长度不低于32位的随机API密钥,密钥存储在调用方的加密变量存储中,每次请求将密钥放在X-API-Key请求头中传给API层,API层校验密钥是否在合法白名单中,校验通过才执行后续逻辑,需要定期轮换密钥 - 进阶方案:请求签名校验
给每个调用方分配独立的访问密钥ID和加密秘钥,调用方发起请求时,用加密秘钥对请求路径、请求参数、当前时间戳做哈希生成签名,将访问密钥ID、签名、时间戳一起传给API层;API层根据密钥ID取出对应秘钥,用相同规则重新计算签名做比对,同时校验时间戳与当前时间差不超过5分钟,避免重放攻击,安全性远高于纯API密钥校验 - 高阶方案:短期令牌校验
采用JWT或者OAuth2.0方案,调用方先通过身份认证接口获取有效期15分钟以内的短期访问令牌,后续所有请求都携带该令牌,API层校验令牌的签名、有效期、权限范围后才放行,令牌过期后调用方重新申请,适合多调用方、需要细粒度权限控制的场景
不管采用哪种授权方案,API层都必须内置速率限制、异常请求拦截、SQL注入防护能力,避免异常请求影响数据库稳定性。
内容的提问来源于stack exchange,提问作者vicg
相关产品推荐
相关产品推荐

