使用 IAM 授权服务访问

在 AWS 上部署应用

Dunieski Otano

Amazon Web Services Solutions Architect

提交中的密钥

  • 长期有效的访问密钥被提交到仓库
  • 扫描机器人发现并造成高额账单
  • 通过角色与最小权限可避免此事

一次提交中意外泄露的 AWS 访问密钥,被标注为安全风险

在 AWS 上部署应用

IAM 主体:用户、角色与策略

IAM 三栏示意图:左侧为主体(用户、服务或角色),中间为含 Allow/Deny 操作的策略文档,右侧为使用短期临时凭证的 IAM 角色

  • Principal:发起请求的主体
  • Policy:授予权限的 JSON 文档
  • Role:实体可承担的一组权限
  • 角色是被"承担"的;用户持有长期凭证
在 AWS 上部署应用

正确使用编程凭证

  • Lambda:执行角色授予权限
  • EC2:实例配置文件提供角色凭证
  • ECS:任务角色按任务限定权限
  • 代码或配置中不放长期访问密钥

三种 AWS 计算服务使用角色且无需长期密钥:Lambda 使用执行角色,EC2 使用实例配置文件,ECS 使用任务角色,均展示自动轮换凭证

在 AWS 上部署应用

AssumeRole 与 STS

  • STS AssumeRole:获取某角色的临时凭证
  • 用于跨账号访问
  • 信任策略控制可承担该角色的主体
  • 凭证短期有效并自动过期

STS AssumeRole 跨账号流程:账号 A 的调用方向 STS 请求凭证,账号 B 的角色信任策略允许,STS 返回会自动过期的短期凭证

在 AWS 上部署应用

最小权限与策略结构

一个策略语句包含三个必需部分(Effect、Action、Resource)和可选的 Condition:

{
  "Effect": "Allow",
  "Action": "dynamodb:PutItem",
  "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/Orders",
  "Condition": {
    "Bool": { "aws:SecureTransport": "true" }
  }
}
在 AWS 上部署应用

IAM 的边界与代码的职责


IAM:服务层

  • 授权AWS API 调用:此角色能否调用该操作?
  • 无法强制按租户或按记录的规则

您的代码:数据层

  • 校验已认证用户与所请求数据是否匹配
  • 二者并用:IAM 护航服务,代码守护数据
在 AWS 上部署应用

最小权限执行角色实战

最小化的 Lambda 执行角色:仅授予单个表 ARN 上的 DynamoDB PutItem 权限,操作与资源均无通配符

  • 某个 Lambda 仅需写入一个 DynamoDB 表
  • 仅授予该表 ARN 上的dynamodb:PutItem
  • 操作与资源均不使用通配符
  • 仅在真实调用被拒后再按需添加
在 AWS 上部署应用

让我们一起练习吧!

在 AWS 上部署应用

Preparing Video For Download...