AWS IAM, 从入门到依旧在入门

2017-05-10  本文已影响1288人  haitaoyao

IAM 全称是 Identity and Access Management, 是 AWS 提供的一个服务, 用来控制对 AWS 资源的访问权限. 一句话概括就是:

IAM 核心就是把资源(Resource)上的操作(Action) 授权给谁(Identity)

既然是控制权限, 说白了就是对某个资源(后文统称 Resource) 的某些操作(后文统称 Action) 的控制.

那么学习 IAM, 首先搞清楚三个基本的问题:

  1. 如何优雅的定义 Resource? 如果有一个统一的规则, 来为 Resource 命名就再好不过了
  2. 如何优雅的定义 Action?
  3. Identity

0x00 如何优雅的定义 Resource

AWS 给出的答案是: ARN (AWS Resource Namespace). ARN 是一个命名规则, 用于无歧义的对 AWS 的资源进行命名.

ARN 的格式如下:

arn:partition:service:region:account-id:resource
arn:partition:service:region:account-id:resourcetype/resource
arn:partition:service:region:account-id:resourcetype:resource

0x01 如何优雅的定义 Action

Action 也就是针对 AWS 上的服务提供的 API. 完整列表参见 AWS Service Actions and Condition Context Keys for Use in IAM Policies. 迄今为止, AWS 不知不觉已经提供了几十个服务, 几百个(或者更多) API. Cloudonaut 公司做了一个 Complete AWS IAM Reference, 方便查询 Action, 推荐使用.

至于 Condition Context Keys, 是 AWS IAM 中支持的一个功能, 即在定义 Policy 时可以使用一些变量, 支持复杂的表达式. 比如 ${aws:username}. 感叹一句: IAM 的配置就是让你用 JSON 语法写代码.

Every Configuration File is a Programming Language

0x02 Identity

Identity 就是最终把权限赋予给到的实体. IAM 中有三种 Identity, 分别是 User/Group/Role

Identity 关系

熟悉了 IAM 的三个最基本元素, 还剩下最后一个: Policy

0x03 Policy

Policy 就是权限声明文档. 具体包含几个部分:

更多关于 Policy 如何写, 可以参见官方文档 Overview of IAM Policies

从类型上分, Policy 分为三种:

既然一个 User 可以属于多个 Group, 那么一个 User 会有多个 Policy 对其进行约束, 那么难免一个 Identity 所有的多个 Policy 会发生冲突. IAM 采用的策略可以概括为8个字: 凡事声明, 一票否决

详细文档参见官方文档 IAM Policy Evaluation Logic

0x04 IAM Policy Programming 小助手: Simulator

既然 Policy 的书写那么麻烦, 写完的 Policy 是否靠谱就成了问题. AWS 官方通了一个 Simulator, 通过两种方式进行使用:

Simulator 仅仅验证提交的 Policy, 不会执行任何真正的操作, 可以放心使用.

关于 simulator 的使用, 具体参见官方文档 Testing IAM Policies with the IAM Policy Simulator

具体关于 IAM 的入门, 就这么多.

0x05 Best Practice (As Far As I Know)

说了这么多, 总结一些最佳实践

0、 通读 AWS 官方文档 AWS IAM Best Practice

不多说. 谁读谁知道.

1、强制贯彻最小权限原则 (Principle of Least Privilege)

AWS 官方文档也有提到, 这里做一点补充. 有几个小的建议

2、 能用 IAM Role 解决的问题, 不用明文 AWS Key

固定的 Key 有泄露风险. 但容器时代很多公司使用 k8s + docker, 无法使用 IAM Role, 推荐使用 Terraform 出品的 Vault 来管理 AWS Key, Vault 支持 Key Rolling 功能, 类似 AWS STS 的动态 Key, 提升安全性.

3、 尽量简化 IAM Policy 配置

虽然 IAM Policy 功能非常强大, 支持通配符 * 也支持表达式, 例如 StringEqualsIgnoreCase. 但不要忘记的是: 代码是给人读的, IAM Policy 也一样.

4、 尽量使用 git 等版本管理工具管理 IAM Policy

AWS 官方仅仅提供 Policy 的版本管理, 而且最多保存 5 个版本, 并且没有注释. 建议使用 Terraform 管理 AWS IAM.

0x06 借(copy)鉴(cat)

AWS IAM 设计的逻辑非常清晰, 借鉴意义很大. 设想, 如果你要在公司设计一套权限管理系统, 是不是可以借(copy)鉴(cat) IAM?

步骤都给你写好了, 拿走不谢:

  1. 定义 Resource 编码原则: 例如 lrn:department:team:resource_type/resource
  2. 定义每个 Resource 上的 Action. 微服务时代, 如果是使用 gRPC 就更好了, 直接将统一的 protocolbuffer 的定义解析一下, 就可以知道有哪些 service 的哪些 method 了
  3. 定义 Identity. 建议直接参考 AWS 的设计: User/Group/Role
  4. 定义 Policy 语法. 这里可以微创新一下, 不用 JSON, 哪怕选择一个支持注释语法的文件格式(比如 yaml)
  5. 实现 Policy Evaluator. 解析 Policy 给出裁决结果
  6. 接入各个系统, 收工.

0x07 总结

这只是 AWS IAM 的简单入门介绍!
这只是 AWS IAM 的简单入门介绍!
这只是 AWS IAM 的简单入门介绍!
(重要事情说三遍)
AWS IAM 还有很多新奇的玩法, 大家自己去探索吧. 最后推荐一篇写的非常好的 AWS IAM 文章: AWS IAM Policies in a Nutshell

Reference

-- EOF --

上一篇下一篇

猜你喜欢

热点阅读