身份、资源与边界

开发者的 AWS 安全实践

Rahul Singh

Technical Product Manager

哪条策略说了算?

改了但没变

  • 第 1 章:显式拒绝,或未允许
  • 这里:第三种原因

一个请求遇到三层策略检查,决策处是问号。

开发者的 AWS 安全实践

哪条策略说了算?

至多三层

  1. 调用方的身份策略
  2. 资源本身的资源策略
  3. 上方的边界,只会减不加

在您自己的账号中,任一策略允许即可

遇到任一层的拒绝即被拒

一个请求自上而下依次通过身份策略、资源策略、权限边界三层检查,最终被允许。

开发者的 AWS 安全实践

策略可存在的两处

基于身份的策略

  • 附加在调用方
  • 定义该身份能做什么
  • 像您佩戴的通行证

顶部的角色附带基于身份的策略,下方为空以展示同一请求的资源侧。

开发者的 AWS 安全实践

策略可存在的两处

基于身份的策略

  • 附加在调用方
  • 定义该身份能做什么
  • 像您佩戴的通行证

基于资源的策略

  • 附加在资源上
  • 定义谁可访问它
  • 跨账号调用必需

顶部的角色附带基于身份的策略,下方的 S3 存储桶附带基于资源的策略,请求在两者之间向下传递。

开发者的 AWS 安全实践

由 AWS 管理,还是由您管理

两类基于身份的策略

  • AWS 托管:AWS 所有
  • 客户托管:您自己所有

两张叠放的卡片对比 AWS 托管策略(AWS 所有,默认较宽)与客户托管策略(您所有,按任务限定)。

开发者的 AWS 安全实践

由 AWS 管理,还是由您管理

两类基于身份的策略

  • AWS 托管:AWS 所有
  • 客户托管:您自己所有

 

便捷或精确

  • AWS 托管:行动更快
  • 客户托管:最小权限

两张叠放的卡片对比 AWS 托管策略(AWS 所有,默认较宽)与客户托管策略(您所有,按任务限定)。

开发者的 AWS 安全实践

边界为策略授予设上限

账号为何要附加它

  • 开发者可创建角色,无人可越权

权限边界

  • 为策略授予设上限
  • 生效权限:两者都允许

身份策略授予的三项权限进入仅允许 S3 操作的权限边界,`iam:CreateUser` 被拦截,另两项继续进入下方的生效权限。

开发者的 AWS 安全实践

边界为策略授予设上限

账号为何要附加它

  • 开发者可创建角色,无人可越权

权限边界

  • 为策略授予设上限
  • 生效权限:两者都允许

为何 iam:CreateUser 毫无效果

  • 只会减,不会加

身份策略授予的三项权限进入仅允许 S3 操作的权限边界,`iam:CreateUser` 被拦截,另两项继续进入下方的生效权限。

开发者的 AWS 安全实践

边界为策略授予设上限

账号为何要附加它

  • 开发者可创建角色,无人可越权

权限边界

  • 为策略授予设上限
  • 生效权限:两者都允许

为何 iam:CreateUser 毫无效果

  • 只会减,不会加

会话策略:一次 AssumeRole 会话

身份策略授予的三项权限进入仅允许 S3 操作的权限边界,`iam:CreateUser` 被拦截,另两项继续进入下方的生效权限。

开发者的 AWS 安全实践

条件可收窄允许范围

条件键

  • 将允许限定到请求上下文

  • aws:SourceIp:来源网络

读取 S3 对象的一个允许通过条件带(列出来源网络键和调用方标签键),上下文匹配则走允许路径,不匹配则被拒。

开发者的 AWS 安全实践

条件可收窄允许范围

条件键

  • 将允许限定到请求上下文

  • aws:SourceIp:来源网络

  • aws:PrincipalTag:调用方标签

ABAC:基于属性的访问控制

  • 一条策略,作用于多主体

读取 S3 对象的一个允许通过条件带(列出来源网络键和调用方标签键),上下文匹配则走允许路径,不匹配则被拒。

开发者的 AWS 安全实践

单表多租户,隔离访问

一张共享表

  • DynamoDB:每租户一个分区键
  • 本身不提供隔离

租户 A 的调用方通过前导键条件进入共享的 DynamoDB 表,只返回租户 A 行,租户 B 与租户 C 行被拦截。

开发者的 AWS 安全实践

单表多租户,隔离访问

"Condition": {
  "ForAllValues:StringEquals": {
    "dynamodb:LeadingKeys": ["${aws:PrincipalTag/tenant}"]
  }
}

一张共享表

  • DynamoDB:每租户一个分区键
  • 本身不提供隔离

用一个条件来收窄

  • ForAllValues:提供的每个键都必须匹配
开发者的 AWS 安全实践

单表多租户,隔离访问

"Action": ["dynamodb:Query", "dynamodb:GetItem", "dynamodb:Scan"],
"Condition": {
  "ForAllValues:StringEquals": {
    "dynamodb:LeadingKeys": ["${aws:PrincipalTag/tenant}"]
  }
}

一张共享表

  • DynamoDB:每租户一个分区键
  • 本身不提供隔离

用一个条件来收窄

  • ForAllValues:提供的每个键都必须匹配
遗留空隙:并非每个请求都带分区键
  • dynamodb:Scan 不提供,因此无从校验失败
开发者的 AWS 安全实践

让我们一起练习吧!

开发者的 AWS 安全实践

Preparing Video For Download...