前言

使用 AWS 可以帮助我们快速构建需要的环境,在构建 demo 的过程中可以随心所欲玩耍。但在实际使用过程中,则必须要考虑用户授权,应用以及各种资源的安全性问题。关于这类安全,在 AWS 中都由一个叫 IAM 的服务进行管理

什么是 AWS IAM ?

IAM (Identity & access management) 服务能否让我们以可伸缩的方式,安全的管理标识、资源的权限
对于运行在AWS上的应用程序,我们也可以使用细粒度的访问控制来授权员工、应用程序和设备访问AWS服务和资源

说简单一点就好比下面这张图

【AWS征文】 AWS IAM 服务介绍

  1. 用户具有某个角色
  2. 某个角色具有某些权限
  3. 该用户就可以做在这些权限被允许的操作

这只是简单的理解,其实 IAM 的控制关系并不是这样,另外 IAM 控制的力度以及可控的范围要远远比上面的图精细,因为其控制精细,所以在使用 IAM 服务时的基本准则是:

授予最小权限

走进 IAM

AWS 的服务多是都是按照区域划分,但 IAM 是为数不多的几个 Global 服务

【AWS征文】 AWS IAM 服务介绍

IAM 组成

IAM 的组成还是很简单的,只有下面这几部分组成

【AWS征文】 AWS IAM 服务介绍

接下来我们就可以创建相应的部分来进一步理解 IAM

创建 Group

创建 groups 的步骤很简单,只需要简单的三步,这里命名为 「aws-learning」

【AWS征文】 AWS IAM 服务介绍
点击下一步,接下来需要添加 policy(policy 就是指具体的操作权限),这里默认展示的都是 AWS managed 的policy,这里暂时选择 AdministratorAccess (这是不可取的方式,违背最小权限准则,仅仅作为展示),这些是 AWS 默认提供的 policy,如果默认选项不满足要求,当然也可以创建我们自己的 policy

【AWS征文】 AWS IAM 服务介绍

点击下一步,做一个基本的 review 一览就可以创建我们的 group 了,创建成功后就是这个样子

【AWS征文】 AWS IAM 服务介绍

这个 AdministratorAccess 的权限有多大呢? 点开 Show Policy 就可以看到了,其实 Policy 就是一种 JSON 形式数据:

<img src="https://cdn.jsdelivr.net/gh/FraserYu/img-host/blog-img20200822182458.png" style="zoom:50%;" />

上面的 JSON 语义很好解释

允许 (Allow) 对所有资源 (Resource ) 做所有操作 (Action )

所以当我们自定义 Policy 时,也是要采用这种 JSON 格式

定义 group 就是方便我们以组的形式来管理用户 user,当然一个 user 也可以属于多个 group。接下来我们就可以创建 user 将其放到我们刚刚创建的组内

创建 User

创建 user 也很简单,只不过在创建的时候选择该账号具有的权限即可,就像下面这样:

【AWS征文】 AWS IAM 服务介绍

点击下一步,就可以选择将该 user 添加到某个 group 中,或者为这个单独 attach 一个 policy

【AWS征文】 AWS IAM 服务介绍
创建完成后,就像下图显示的这样:

【AWS征文】 AWS IAM 服务介绍

创建 Role

点击 Create Role 按钮,进入如下界面:

【AWS征文】 AWS IAM 服务介绍

选择相应的 AWS Managed Role , 这里选择 EC2 ,进入下一步,

【AWS征文】 AWS IAM 服务介绍

点击 Finish 按钮后,当前的 Role 就 attach 了操作 EC2 的policy。

创建好的 Role ,也可以通过在 TrustRelationship 的位置为某个 AWS Service assume 这个 role,被 trust 的 service 也就具备了这个 role 相应的 policy, 就像下面这样:

【AWS征文】 AWS IAM 服务介绍

创建 Policy

创建 Policy 没有什么特殊的。Policy 就是一个用户或者 Role 具有的权限,除了 AWS managed 的,我们也可以自定义,如果你不理解相应的语法关键字,AWS 还贴心的提供了 Policy 模拟器,可以让我们通过鼠标点击选择的形式,生成 Policy,然后将其转换成 JSON 格式的数据

【AWS征文】 AWS IAM 服务介绍

这里有朋友可能会有疑问了:

User/Group attach policy,Role 又同样 attach policy,那它俩到底啥区别呢?

User 和 Role 的区别

刚接触 AWS 你可能会在上面的这个问题上有一些困惑,二者都可以 attach policy ,所以主要说一下什么时候需要创建 User,而什么时候有需要创建 Role

什么时候需要创建 User?

  1. 你自己创建的 AWS account,并且这个账户中只有你,那么你只需要创建相应的 User(注意这里最好不要使用 root user),并 attach 相应的 policy 即可

  2. 假如还有其他人需要在你的 AWS account 下工作,但是没有其他的 identify 机制,这时也可以创建 User,并使用相应的 group 进行管理即可

所以总结来说,当 AWS account 仅有少许个人,并且没有什么 identify 机制会选择创建 User 的方式,很显然这种不是企业级选择方式

什么时候需要创建 Role?

  1. 假如你有一个应用运行在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上,并且这个应用需要请求其他 AWS 服务 (因为要请求其他 AWS service,通常需要合法的用户名和密码,如果将这些敏感信息暴露在程序内,显然不符合 AWS 的管理思想;相反,使用 Role 的方式,会使用临时生成的 credentials 访问 AWS 服务,这种更加安全)

  2. 你有个移动端的应用,需要访问 AWS 服务 (做过移动端的朋友可能会知道,这种需要类似 OAuth 2.0 的方式,AWS 也是这样的方式。可以通过创建 identify provider,比如 Amazon,Cognito,Facebook, Google 等的用户授权,将其匹配到某个 Role 上,再通过临时的 credentials 访问 AWS 服务)

  3. 当公司使用 AWS 服务,创建的是 federation 类型 Account,此时希望不通过 login 的方式使用 AWS 服务

所以说,一般企业级应用都会采用 IAM Role 的方式进行认证授权,这一切的前提就是需要 创建 IAM Identify Providers

【AWS征文】 AWS IAM 服务介绍

这个由于涉及到一些保密配置,这里不再展开说明,按照官网文档进行配置即可,非常简单,整个实现原理如下图显示

【AWS征文】 AWS IAM 服务介绍

总结

AWS IAM 是 Global 的服务,也是 AWS 保证资源以及应用服务安全的重要服务,如果个人实验 AWS,只需要创建 User,attach 响应 policy 即可,如果企业级应用,通常都会结合 Identity Provider,以 IAM Role attach policy 的形式进行验证授权,到目前我们都是通过在 AWS Console 上创建相应的组建,实际工作中都会通过 CloudFormation 的定义来创建相应的服务