AWS IAM、网络与数据安全

# AWS IAM、网络与数据安全

先确认谁在操作,再确认请求能走到哪里,最后确认它被允许读写什么。身份、网络和应用鉴权是三道不同的检查,不能只开通一层就认为系统安全。

# IAM、Role、Policy 和 OIDC

IAM 是 Identity and Access Management,管理身份与权限。Policy(策略)描述允许或拒绝的 action、resource 和条件;Role(角色)由符合信任条件的主体临时扮演。

概念 回答的问题 例子
Trust Policy 谁可以扮演角色 指定仓库的指定发布分支
Permission Policy 扮演后可以做什么 更新指定 Stack,不能管理整个账号
STS 临时凭据 本次以什么身份执行 有有效期的 access key、secret 与 session token
OIDC 如何证明外部工作流身份 GitHub Actions 提供身份令牌,AWS 验证后换临时凭据

OIDC 不等于没有凭据,而是不必在 GitHub 保存长期 AWS 密钥。GitHub 信任条件应限制 aud 和 sub;使用 Environment 时 subject 形式会变化,还需要 Environment 的分支与审批保护。

下面只是信任条件示例,不是完整 Role 模板。example-org/example-repo 必须替换成经确认的仓库,不能直接用于生产:

{
  "StringEquals": {
    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
    "token.actions.githubusercontent.com:sub": "repo:example-org/example-repo:ref:refs/heads/main"
  }
}
1
2
3
4
5
6

aud 表示令牌的目标受众;sub 限制这次运行来自哪个仓库、分支或环境。真正权限仍由另一个 permission policy 决定。不要把仓库名正确理解为 PR 中任意代码都可信。

日常不使用 root,不创建 root access key,也不用 AdministratorAccess 掩盖权限缺口。部署角色与运行角色分离,缺什么 action 就结合具体资源补什么。

# ARN:AWS 资源的唯一标识

ARN (opens new window) 全称 Amazon Resource Name(Amazon 资源名称),用于唯一标识一个 AWS 资源,可以理解成资源的 “地址”;Secret、IAM 角色、Lambda 函数等都有各自的 ARN。部署配置用它指定要引用的资源,权限策略用它限定允许操作哪些资源。

例如,arn:aws:secretsmanager:ap-southeast-1:123456789012:secret:prod/db-password-AbCdEf 是一条虚构的 Secret ARN,标明了服务、区域、账号和具体凭据。部署配置引用它,就是指定 “去哪里取密码”,而不是写入密码本身。

ARN 只标识资源,不授予访问权限。例如,知道 Secret ARN 不等于能读取其中的密码,调用方仍需获得相应授权。

# VPC、VPS、VPN 分别是什么

部署应用时,要分别解决三个问题:程序跑在哪台机器上、这些资源处于什么网络中、外部的人怎样安全连接进来。VPS、VPC、VPN 分别对应这三个方面,不是同一种产品的不同叫法,也不是三选一。

概念 全称与中文名 具体提供什么 常见用途
VPC Virtual Private Cloud,虚拟私有云 云上逻辑隔离的网络环境,可规划私有 IP、子网、路由和访问规则 让应用与数据库通过私网通信,并控制哪些资源能连接公网
VPS Virtual Private Server,虚拟专用服务器 一台具有操作系统、CPU、内存和磁盘资源的虚拟服务器 安装 Node.js、Go、Nginx 或数据库,运行自己的服务
VPN Virtual Private Network,虚拟专用网络 在现有网络之上建立逻辑专用连接;远程接入常用加密隧道保护传输 让员工电脑访问公司私网,或把办公室网络与云上网络连接起来

一句话记忆:VPC 管网络,VPS 跑程序,VPN 建连接。可以把 VPC 想成一个园区的内部路网,VPS 是园区里干活的机器,VPN 是外部进入园区的一条受控通道。

VPC 的重点是网络隔离,不会因为创建了 VPC 就获得一台服务器,也不代表其中所有资源都不能访问公网。VPS 的重点是计算资源;它通常与其他虚拟服务器共享底层物理硬件,不等于独占一台物理服务器,也不代表自动拥有独立的 VPC 或只允许私网访问。

在 AWS 中,Amazon VPC 对应网络环境;Amazon Lightsail 提供常见的 VPS 套餐,EC2 的虚拟机实例也承担运行程序的职责,但 EC2 的产品能力不止于传统 VPS。VPS 不是 AWS 某个叫作 VPS 的独立服务。EC2 实例连接到 VPC 中的子网,服务器和网络是配合关系。使用 ECS/Fargate 时,则不需要自己管理这类虚拟机操作系统,但仍要配置任务使用的网络。

# 用访问私网数据库理解三者的关系

假设一个网站的 Go API 运行在 EC2 虚拟机上,PostgreSQL 使用 RDS,两者位于同一个 VPC 的不同子网。数据库不开放公网,只允许授权来源访问:

  1. 应用平时访问数据库:Go API 通过 VPC 内的私有网络连接 RDS,不需要额外绕一层 VPN。仍然要满足路由、安全组和数据库认证要求。
  2. 开发者在家排障:电脑原本没有通向数据库私有地址的网络路径,可以通过 AWS Client VPN 接入,再访问被授权的资源。Client VPN 面向单个客户端的远程接入。
  3. 办公室需要长期连接云端:可以使用 AWS Site-to-Site VPN,在办公室网络和 AWS 网络之间建立 IPsec 加密隧道,面向网络与网络互联。

VPN 不是购买服务器后自动附带的功能。可以使用托管 VPN 服务,也可以在有合适网络连接的 VPS/EC2 上部署 VPN 软件;后者需要自行维护补丁、证书、路由和访问控制。买一台 VPS,不等于已经有可用的 VPN。

VPN 也不等于默认接管所有上网流量:分流模式只让指定目标经过隧道,全隧道模式才会让更广范围的流量经过 VPN,具体取决于路由配置。它不是匿名保证,也不能代替 HTTPS、数据库 TLS 和应用登录。连上 VPN 后,仍需通过授权规则、安全组与数据库权限检查。

如果只是临时连接一个数据库,不一定需要部署整套 VPN,也可以使用下文的 SSM 端口转发。它只转发指定端口,不等于让电脑接入整个 VPC;应按访问范围选择方案,而不是为了连库就开放公网。

# 公有子网、私有子网、NAT 与安全组

VPC 是云上的隔离网络,Subnet 是其中的网段。公有子网的路由表可以直接通向 Internet Gateway;私有子网不直接这样路由。资源放在公有子网,不代表自动拥有公网地址或可以入站访问。

私有资源需要访问外部模型 API、GitHub 或公共 RPC 时,通常配置 NAT 出站;只访问支持的 AWS 服务时,可以评估 VPC Endpoint(服务私网入口)。两者的覆盖范围与费用不同,不能笼统说 Endpoint 总是更便宜。

安全组是资源网卡层面的有状态访问控制。数据库只允许应用安全组进入 5432,比向全网开放端口更合理;应用登录与行级授权仍由业务处理。NACL 是子网层的无状态规则,需要分别考虑进出方向与返回流量。

常见链路为:API 入口 → 应用安全组 → 数据库安全组。排障时按 DNS、路由、端口规则、TLS、凭据、业务权限逐层查,不要遇到超时就把数据库改成公网可访问。

# RDS、S3 与 Secret 怎样放

RDS 放私网,生产和预览环境使用独立凭据与适当的数据隔离。数据库连接应验证 TLS 证书和真实主机名;本地隧道导致主机名不匹配时,应明确配置受信任 CA 与服务器名称等方案,不把关闭证书校验复制到生产。

S3 默认保持私有。下载通过受控 CDN 或短期预签名地址,上传限制对象路径、大小和允许类型。预签名地址在有效期内是一种授权,不能当作一次性必然消费的链接;上传完成后仍要验证内容。

凭据和加密密钥分别由下面的 Secrets Manager 与 KMS 管理。应用只拿到必要权限,日志、前端构建变量和模型上下文都不得包含 Secret value。

# KMS 与 Secrets Manager

  • KMS (opens new window):管理用于加密或签名的密钥,并提供加解密、生成数据密钥、签名等能力。应用通常请求 KMS 使用密钥完成操作,而不是取出 KMS Key 的原始密钥材料自己使用。
  • Secrets Manager (opens new window):保存应用需要读取的数据库密码、API Key、Token 等凭据。它还管理凭据版本,并支持配置自动轮换,也就是定期更换凭据。

例如,数据库密码存入 Secrets Manager 后,会通过 KMS 保护其加密存储;应用连接数据库时,经授权从 Secrets Manager 读取密码。应用拿到的是数据库密码,不是保护这个密码的 KMS 加密密钥。

两者都需要配置访问权限,并可通过 CloudTrail (opens new window) 追查操作记录。CloudTrail 是 AWS 的操作审计服务,可以记录谁在什么时候读取了凭据、调用了哪把 KMS 密钥,以及操作是否成功,方便排查异常访问;它不会记录读取到的密码明文。

KMS 还可以通过密钥策略限制谁能使用某把密钥;加密业务数据与签署链上交易应使用独立密钥和权限,避免一种用途的授权同时开放另一种用途。

# 信封加密怎么工作

大量敏感字段或大对象通常不直接全部交给 KMS 加密,而是使用数据密钥(Data Key)加密业务内容,再由 KMS Key 保护数据密钥:

  1. 调用 GenerateDataKey,获得明文 Data Key 和由 KMS Key 加密后的 Data Key。
  2. 应用在内存中用明文 Data Key 和 AES-GCM 等认证加密算法加密业务数据。
  3. 用完尽快清理明文 Data Key,只保存业务密文、加密后的 Data Key、Nonce、认证标签和算法版本;认证标签也可以按封装格式与密文一起保存。
  4. 解密时先让 KMS 解开 Data Key,再由应用解开业务密文并验证认证标签,发现篡改则拒绝使用。

Encryption Context:加解密时核对的上下文

Encryption Context 是调用 KMS 时提供的键值对,不是需要保密的密钥。例如用记录 ID、用途、环境关联一份加密数据;解密数据密钥时必须提供与加密时完全相同的上下文。

上下文可能进入审计日志,不能放密码或 Token。应用必须从可信的业务记录与权限检查结果中确定期望上下文,不能只照抄请求里传入的值,就认为已经防止越权。

# Secret 怎样交给应用

  • 部署定义只保存引用。CDK/CloudFormation 使用 Secret ARN 或动态引用,不把真实值写进源码或模板正文;动态引用不代表应用运行时看不到明文。
  • 只授予必要权限。限制到具体 Secret ARN 和动作,不给 secretsmanager:*;ECS 启动时注入与运行时读取所用角色不同,见 Task Role 与 Execution Role。
  • 区分注入与读取。ECS 启动时注入环境变量后,Secret 轮换不会自动刷新已有 Task,需要滚动启动新 Task;应用或 Lambda 运行时主动读取时,则要设计缓存过期、轮换和错误处理。
  • 保护运行时明文。环境变量仍可被应用和相关诊断工具读取;Secrets Manager 不能挽救把密码打印进日志、写入镜像或打进前端包的错误。

具体依据:KMS 数据密钥 (opens new window)、ECS Secret 注入与轮换 (opens new window)。

# 本地连接私网,不必开放 SSH

SSM Session Manager 可以通过受控托管实例建立端口转发,让开发机访问实例能到达的数据库。它需要 SSM Agent、角色、网络出口及会话权限,不是有 AWS CLI 就自动可用。

生产数据库迁移更适合由受审查的私网一次性 Task 执行:迁移文件随不可变镜像发布,Task 运行时取得凭据,CI 只等待退出码与脱敏日志。不要为了让 GitHub-hosted runner 直连而开放 RDS 公网端口。

# 一个数据库连接失败,怎样逐层缩小范围

假设 ECS API 要访问私网 RDS 的 5432 端口,按下面顺序检查,而不是先把端口向全网开放:

证据 更可能的问题 下一项检查
主机名解析失败 DNS 配置或地址错误 VPC DNS、服务名和实际配置
TCP 连接超时 路由、安全组、NACL 或目标不可达 Task 到 RDS 的路径与规则,返回方向是否放行
TCP 可连,TLS 校验失败 CA、主机名或证书问题 受信任 CA、TLS server name,不关闭校验
TLS 正常,认证失败 用户名、密码、轮换后旧配置 凭据版本与数据库用户;日志不输出密码
能登录,查询被拒 数据库对象权限或应用授权 schema/table 权限、当前租户与业务身份

常见安全组规则是 RDS 入站 5432 只允许 API 的安全组;API 还要允许对应出站。这里安全组引用限制流量来源,不等于 RDS 相信这个来源可以访问所有表。数据库账号仍需最小权限。

# NAT 和 Endpoint 为什么不能随便互换

私网 Task 调外部模型 API,需要到公网的出站路径。NAT Gateway 通常放在有 Internet Gateway 路由的公有子网,私网子网把公网目标路由给 NAT;NAT 不会让外部直接发起连接访问这个 Task。

VPC Endpoint 则把特定受支持 AWS 服务接入私网。S3 Endpoint 不能替代访问任意模型网站的 NAT;只有网络连通也不代表授权成功,还要检查 Endpoint policy、身份策略及资源策略。选择时比较固定费用、数据处理费用、可用区路径和访问范围。

# OIDC 成功为什么还可能 AccessDenied

换到临时凭据只证明信任策略允许本次扮演角色。接下来某个 API 是否可调用,还受权限策略、资源策略、权限边界等约束,显式拒绝会优先阻止。排查应定位具体 action、resource 和条件,不把信任策略越改越宽。

例如部署角色能更新 Stack,不等于它能向运行角色传递权限;涉及 iam:PassRole 时还应限制目标角色与服务。否则攻击者可能借部署入口,让高权限角色运行自己的代码。这里解释权限边界,不意味着需要为学习账号创建组织级治理资源。

# AWS 学习账号的安全边界

实验前核对账号 ID、当前身份、Region、套餐和计费项。不要为配置身份或 “最佳实践” 自动创建、加入 AWS Organizations 或 Control Tower;这些操作可能改变套餐与计费责任,必须另行评估和明确批准。预算告警通常只是通知,不是自动的费用上限。

# 面试时可以这样回答

VPC、VPS 和 VPN 有什么区别?参考答案

它们分别解决网络、计算和连接的问题。VPC 是云上隔离的网络环境,用来安排子网、路由和访问边界;VPS 是运行程序的虚拟服务器;VPN 是连接客户端或两个网络的专用通道,远程接入通常通过加密隧道实现。比如 AWS 上的 EC2 运行 API,RDS 放在私网,两者通过 VPC 通信;开发者在外部需要访问私网时,可以通过 VPN 接入。但 VPN 连通不代表获得了全部权限,安全组和数据库认证仍然要检查。

GitHub Actions 怎样安全地部署到 AWS?参考答案

我优先用 OIDC 换取短期角色凭据,避免保存长期 access key。角色信任条件限制仓库、分支或受保护环境,权限只覆盖本项目资源。构建与部署分开,生产写入经过变更审查,运行中的服务使用另一套最小权限角色,避免部署权限泄漏到应用里。

服务在同一个 VPC,为什么还是连不上数据库?参考答案

同一个 VPC 只提供网络环境,不自动放行端口,也不解决认证。我会分层检查 DNS、路由、安全组和 NACL,再看 TLS、数据库凭据与对象权限。TCP 超时和密码错误是不同层的问题,不能通过开放公网或关闭证书校验来掩盖。

# 复用来源与官方参考

整理自原项目 Node Lambda 的 OIDC 章节与 Go 的数据库、Secrets、共享网络章节。