亚马逊AWS官方博客

利用 AWS 联合身份认证实现企业用户单点登录 (SSO) 以及 AWS 多账户管理

背景

对于使用 AWS 的众多企业来说,其中的绝大多数都会有自己的内部系统,而这些内部系统无论是自研的还是第三方的解决方案,都会使用某种认证或鉴权方式,如果内部系统和各个外部系统都需要一套单独的用户名密码,对于这些系统的使用者来说,会增加复杂度和额外的操作负担,而对于系统管理者来说,同样也面临着诸多的管控问题和潜在的安全风险。随着企业越来越多地把应用部署在 AWS 上,对基于云的安全身份和访问管理的需求激增,尤其是在越来越多的企业拓展出海业务的背景下,如何让全球员工安全便捷地访问云上资源,成为一个很有挑战性的问题。

另外一方面,对于拥有多个 AWS 账户的企业来说,一个非常常见的问题是,如何从用户的角度出发管理 AWS 的多个账户。使用多账户方式实现生产系统和测试系统的隔离,不同业务之间资源的隔离以及账单计费的隔离是很常见的场景。但如果为每个用户在每个AWS账户中都创建一个 IAM 用户,随着使用 AWS 的用户越来越多,这些账户将变得难于管理,而且创建的 IAM 用户越多,其中某一个用户被入侵的可能性就越大。

在这样的背景之下,我们就需要一个针对企业内部用户的单点登录系统 (SSO) ,通过联合身份认证的方式授权访问 AWS 资源,同时在多个 AWS 账户上配置不同的角色,通过角色切换 (Switch Role) 的方式在不同 AWS 账户之间跳转,实现更简便的用户登录以及多账户的操作和管理,同时带来更好的安全性。

在本文中,我们将会讨论以下话题:

  • 如何基于 SAML 2.0 集成第三方身份提供商,使用 AWS 联合身份认证通过单点登录 (SSO) 方式登录 AWS 控制台。本文以第三方身份提供商 Auth0 (https://auth0.com/) 为例实现
  • 如何配置 AWS IAM 身份提供商,角色以及相互之间的信任关系,实现基于角色切换的多账户多用户管理

方案概览

首先我们来对比一下在多个 AWS 账户下对用户进行身份认证的两种不同方式。

第一种方式如图1所示,使用 IAM 用户 (在 AWS IAM 服务中为用户配置的用户名和密码) 或联合身份认证用户 (在第三方身份提供商中为用户配置的用户名和密码) 登录到 AWS 各个不同账户中。对于这种方式,就需要为每个用户在每个账户上创建 IAM 用户,或者需要为每个用户在每个账户上配置角色的联合身份认证,这意味着随着 AWS 用户以及账户数目的增加,配置和管理的工作量将以指数级别增长,系统将难以维护。

图1

第二种方式如图2所示,在这个方式中,我们使用单独建立的网关账户来处理所有登录到 AWS 环境的身份认证过程,基于第三方身份提供商的联合身份认证用户或是 IAM 用户将首先登录此网关账户,然后再通过使用“切换角色”的功能跳转到需要进行操作的账户中,承担另一个角色。 为秉承 AWS 安全最佳实践中最小权限的原则,在网关账户中的 IAM 用户或角色只需要赋予可以进行角色切换的权限,而切换到的被承担的角色则可以按需分配必要的操作和管理 AWS 资源的权限。

图2

方案工作原理

本文中所主要介绍的方案就是采用了上述第二种方式,来利用 AWS 联合身份认证实现企业用户单点登录 (SSO) 以及 AWS 多账户管理。在方案搭建好之后,整体的流程如图2中数字标识步骤所示:

  1. 通过第三方身份提供商 (本文以 Auth0 为例) 以单点登录 (SSO) 方式进行登入认证
  2. 登陆成功之后,用户将从第三方身份提供商得到 SMAL 格式的认证响应,利用这个认证响应通过 AWS 联合身份认证,以承担角色获取临时身份的方式登录到 AWS 网关账户
  3. 在已登录网关账户的 AWS 控制台,通过“角色切换”的方式跳转到实际需要进行管理和操作的 AWS 账户,通常被承担的角色会被预先分配好所需的权限
  4. 如果需要访问其它 AWS 账户来进行操作,首先需要通过“角色切换”的方式跳转回网关账户的 AWS 控制台
  5. 在网关账户的 AWS 控制台,再通过“角色切换”的方式跳转到实际需要进行管理和操作的 AWS 账户

图3说明了基于 SAML 2.0的联合身份验证单点登录 (SSO) 的详细流程

图3

  1. 企业内部用户通过浏览器访问单点登录 (SSO) 页面,输入身份提供商为用户配置的用户名和密码进行登录
  2. 单点登录 (SSO) 页面通过身份提供商验证用户的身份
  3. 身份提供商验证用户身份通过后,会返回一个 SAML 身份验证响应,其中包括识别用户身份的断言以及用户的相关属性
  4. 浏览器会被重定向到 AWS,并使用身份提供商返回的 SAML 断言访问 AWS 单点登录终端节点
  5. 终端节点将代表用户请求临时安全凭证,并生成一个使用此凭证的登录 AWS 控制台的 URL
  6. AWS 将 URL 发回客户端用于将用户重定向到 AWS 控制台
  7. 浏览器收到 URL 后将重定向到 AWS 管理控制台

配置步骤

实现上述图2中流程需要在第三方身份提供商 (Auth0) 以及 AWS 上做如下配置工作:

  1. 在Auth0 (https://auth0.com/) 上申请测试账户,并配置基于 SAML 2.0的单点登录 (SSO) 应用,用于与 AWS 联合身份认证配合使用
  2. 在 AWS 网关账户上,通过 AWS IAM 创建并外部身份提供商 (external identity provider) ,用于与 Auth0 单点登录 (SSO) 应用配合使用
  3. 在 AWS 网关账户上创建 IAM 角色用于联合身份认证,并配置角色相关信任关系策略以及访问权限策略
  4. 在 Auth0 (https://auth0.com/) 上配置 AWS IAM 角色与 Auth0 单点登录 (SSO) 用户之间的映射
  5. 在需要进行管理和操作的 AWS 账户上创建 IAM 角色
  6. 在 AWS 网关账户上,对之前创建的 IAM 角色分配相应的权限,使其可以承担系统账户 IAM 角色的权限,进行“角色切换”

在接下来的内容中,将以图文方式详细讲解各个步骤的具体配置方法:

1. 在 Auth0 上配置 SAML 2.0 SSO 应用

在 Auth0 上配置 SAML 2.0 SSO 应用具体步骤如下:

1.1 如果目前没有 Auth0 账户请访问 https://auth0.com 注册新账户,注册完成请登录
1.2 登录完成后,将进入 Auth0 Dashboard 页面,请选择左侧导航栏中 Applications,随后选择 Create Application (或者点击已有应用进行更新)

1.3 创建页面中请为应用命名,随后选择 Single Page Web Applications,点击 Create

1.4 进入新创建 Application 后,点击 Addons 标签栏,随后点击 SAML2 Web App

1.5 在 Settings 页面,请按以下步骤继续配置:
a) 将 Application Callback URL 设置为
https://signin.thinkwithwp.com/saml
b) 将以下 Json 格式文档拷贝到 Settings 下方的文本框中,并在页面最下方选择 Enable

{
  "audience": "https://signin.thinkwithwp.com/saml",
  "mappings": {
    "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
    "name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
  },
  "createUpnClaim": false,
  "passthroughClaimsWithNoMapping": false,
  "mapUnknownClaimsAsIs": false,
  "mapIdentities": false,
  "nameIdentifierFormat": "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
  "nameIdentifierProbes": [
    "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
  ]
}

1.6 继续在 Settings 页面选择 Usage 标签页,在 Identity Provider Metadata 右侧,点击 Download 下载 metadata 文件并保存,其中包括发布者名称、过期信息以及可用来验证从身份提供商 (identity provider) 处收到的 SAML 身份验证响应 (断言) 的密钥,后续在 AWS 控制台配置 IAM 身份提供商时将会使用用到这个文件

2. 在 AWS 网关账户上创建 IAM 身份提供商 (Identity Provider)

2.1 登录 AWS 管理控制台并通过以下网址打开 IAM 控制台 https://console.thinkwithwp.com/iam/
2.2 在左侧导航栏中,点击身份提供商 (Identity Providers) ,随后点击创建提供商 (Create Provider)

2.3 在创建提供商配置页面,提供商类型 (Provider Type) 请选择 SAML,提供商名称 (Provider Name) 请键入相应的名称,最后一栏元数据文档 (Metadata Document) 请选择之前配置 Auth0 时所下载的 SAML 元数据文件。点击下一步 (Next)

2.4 请确认提供商信息,随后点击创建 (Create) ,完成创建提供商

3. 在 AWS 网关账户上创建 IAM 角色用于 SAML 联合身份认证

3.1 登录 AWS 管理控制台并通过以下网址打开 IAM 控制台 https://console.thinkwithwp.com/iam/
3.2 在左侧导航栏中,点击角色 (Roles) ,随后点击创建角色 (Create Role)

3.3 创建角色页面请选择 SAML 2.0 身份联合 (SAML 2.0 federation ) 类型,SAML 提供商请选择之前创建的身份提供商,点击下一步 (Next)

3.4 为新创建的角色添加策略,本例中,我们只为这个角色赋予对 AWS 服务和资源访问的只读权限,随后点击下一步 (Next)

3.5 根据需要添加标签,随后进入最后审核页面,填入角色名称 (Role Name) 后,点击创建角色 (Create Role) ,完成角色创建

4. 配置 AWS 角色与 Auth0 单点登录 (SSO) 用户之间的映射

4.1 在 Auth0 Dashboard页面,请选择左侧导航栏中 Rules,随后点击 Create Rule,随后在模板中选择 Empty Rule。Rule 是基于 JavaScript 的代码,用于在验证用户身份的时候可以方便地扩展 Auth0 的默认行为,如用户属性的变更,拒绝特定条件的用户,或者调用外部系统的 API 增加额外的处理逻辑等等。如果想了解有关 Rules 的更多信息,请参阅 https://auth0.com/docs/rules

4.2 在 Edit Rule 页面,在 Name 一栏请填入 Rule 名称,随后在 Script 文本框填入以下内容,其中 YOUR-AWS-ACCOUNT-ID 需要替换为 AWS 网关账户 ID,YOUR-ROLE-NAME 替换为步骤3.6中创建角色的名称,YOUR-SAML-PROVIDER-NAME 替换为步骤2.3中创建的身份提供商名称。在以下这段代码中,user.awsRole 用于标识 AWS 上配置的角色和身份提供商,AWS 角色 ARN 位于逗号之前,而身份提供商 ARN 位于逗号之后

function  (user, context, callback)  {

  user.awsRole = 'arn:aws:iam::YOUR-AWS-ACCOUNT-ID:role/YOUR-ROLE-NAME,arn:aws:iam::YOUR-AWS-ACCOUNT-ID:saml-provider/YOUR-SAML-PROVIDER-NAME';
  user.awsRoleSession = user.name;
  user.awsName = user.name;

  context.samlConfiguration.mappings = {
    'https://thinkwithwp.com/SAML/Attributes/Role': 'awsRole',
    'https://thinkwithwp.com/SAML/Attributes/RoleSessionName': 'awsRoleSession',
    'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name': 'awsName'
  };

  callback (null, user, context) ;

}

4.3 为单点登录 (SSO) 应用创建用户,在 Auth0 Dashboard 页面,请选择左侧导航栏中 Users & Roles,随后点击 Users,Create User。在接下来弹出的页面中,键入需要添加用户的 email,设置密码,并点击 Create 创建用户

除了在4.2步骤中我们可以通过在 Auth0 上编辑 Rules 来限制或者过滤用户的登录之外,还可以通过在网关账户上配置角色的信任关系策略,来增加条件限制或允许用户通过联合身份认证的方式承担这个角色并登陆 AWS 控制台。
4.4 在 AWS 网关账户上登录 AWS 管理控制台并通过以下网址打开 IAM 控制台 https://console.thinkwithwp.com/iam/
4.5 在左侧导航栏中,点击角色 (Roles) ,随后搜索在步骤3.5中创建的角色名称并点击进入角色摘要页面,点击信任关系 (Trust Relationship) 标签栏,随后点击编辑信任关系 (Edit Trust Relationship)。在如下Json格式的策略中,可以在Condition节点中加入额外的条件来配用户,如本例中增加了 SAML:name 的条件,限制只有本次在Auth0新建的用户 awsuser1@samlprovider.com 通过联合身份认证的方式承担这个角色并登陆 AWS 控制台。有关更多的基于SAML的联合身份认证信任关系策略中可用的条件,请参考:https://docs.thinkwithwp.com/zh_cn/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-saml

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::YOUR-ACCOUNT-ID:saml-provider/YOUR-SAML-PROVIDER-NAME"
      },
      "Action": "sts:AssumeRoleWithSAML",
      "Condition": {
        "StringEquals": {
          "SAML:aud": "https://signin.thinkwithwp.com/saml" ,
          "SAML:name": "awsuser1@samlprovider.com"
        }
      }
    }
  ]
}

5. 测试 Auth0 单点登录到网关账户的 AWS 控制台

5.1 在 Auth0 Dashboard 页面,请选择左侧导航栏中 Applications,点击在1.3步骤中创建的 Application 名称

5.2 在Application Details页面中,点击Addons标签栏,随后点击SAML2 Web App

5.3 在接下来的页面中点击 Usage 标签栏,页面上 Identity Provider Login URL 下方文本框中所显示的 URL 即为单点登录应用访问地址,直接点击链接或将链接 URL 拷贝至浏览器导航栏中并访问,将会进入 Auth0 单点登录应用界面

5.4 在接下来弹出的 Auth0 单点登录界面,请输入在4.3步骤中创建的用户信息,随后点击 LOG IN

5.5 认证成功后将会跳转至 AWS 网关账户的控制台界面

6. AWS 系统账户上配置角色切换 (Role Switching)

为了使跨帐号角色切换正常工作,需要在源帐号和目标帐号中都进行一些配置。在本例中,源账户为网关账户,目标账户为系统账户。首先,我们将从目标帐号或您将要切换到的帐户开始,目的是创建一个使源帐号有权承担的角色。 在本例中,将创建一个拥有管理员权限的角色,并允许源帐号有承担该角色的权限。
6.1 登录 AWS 管理控制台并通过以下网址打开 IAM 控制台 https://console.thinkwithwp.com/iam/
6.2 在左侧导航栏中,点击角色 (Roles) ,随后点击创建角色 (Create Role)

6.3 创建角色页面请选择其他 AWS 账户 (Another AWS account) 类型,账户 ID 请填入源账户也就是网关账户的 ID,点击下一步 (Next)

6.4 在附加权限策略页面上,选择此角色将对账户具有的权限,本例中我们将赋予此角色管理员权限,点击下一步 (Next)

6.5 接下来为角色配置适当的标签,为角色命名,点击创建角色 (Create Role) 完成设置。请务必记住该角色的名称,因为在将来的步骤中将需要使用该角色。

7. 在AWS网关账户上配置角色切换

接下来,我们将转到单点登录后所需要访问的源帐号,也就是网关账户,本环节的主要任务是使网关账户中的角色有权承担目标帐号中的角色,此步骤通过创建一个新策略来完成的,该策略允许步骤3.6中创建的角色承担步骤6.6中创建的角色。
7.1 登录 AWS 管理控制台并通过以下网址打开 IAM 控制台 https://console.thinkwithwp.com/iam/
7.2 在左侧导航栏中,点击策略 (Policies) ,随后点击创建策略 (Create Policy)

7.3 在接下来创建策略页面中,点击 JSON 标签栏编辑策略,并在文本框中填入以下内容。其中 YOUR-AWS-ACCOUNT-ID 需要替换为 AWS 系统账户 ID,ROLE-TO-ASSUME 替换为步骤6.6中在系统账户中创建的角色名称。随后点击查看策略 (Review Policy) 进入下一步

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::YOUR-AWS-ACCONT-ID:role/ROLE-TO-ASSUME"
        }
    ]
}

7.4 在接下来页面中填入策略名称,并点击创建策略 (Create Policy)

7.5 返回 AWS 管理控制台的 IAM 页面,搜索在步骤3.6中创建的网关角色,并点击角色名称

7.6 在接下来页面中选择附加策略 (Attach Policy)

7.7 在附加权限的页面中搜索并勾选在步骤7.4中创建的策略,随后点击附加策略 (Attach Policy) ,完成配置

8. 方案验证

8.1 按照步骤5.5中指示登录到 AWS 网关账户
8.2 在 AWS 控制台页面,点击右上角账户名称,随后在下拉式菜单中点击切换角色 (Switch Role)

8.3 在随后切换角色页面中,键入AWS系统账户 ID,以及步骤6.6中创建的系统账户内的角色名称,点击切换角色 (Switch Role)

8.4 成功切换到系统账户后,在控制台界面右上角点击账户名称,通过下拉式菜单可以看到当前活跃身份等详细信息,此时已成功通过切换角色的方式从网关账户跳转到系统账户的管理员角色。如需返回网关账户请点击返回 GatewayRole

8.5 返回到网关账户的 GatewayRole后,在控制台界面右上角点击账户名称,可以看到角色切换的历史记录列表,列表会记录最近发生的角色切换操作,下次通过单点登录的方式登录到网关账户后,可以很方便的通过点击列表中的历史记录直接进行切换,无需再次输入目标账户以及角色信息。如需添加其它需要管理的 AWS 系统账户,请重复本文中步骤6和7进行配置,实现基于角色切换的多账户多用户管理

总结

客户在联合身份认证,单点登录访问控制台以及多账户管理的需求越来越多,对于管理员来说,逐渐将账户,认证和授权管理集中化,从而减少用户和权限策略相关的工作量,本文即是以此为目标,介绍了如何配置 SAML 联合身份认证,通过第三方单点登录 (SSO) 方式访问AWS控制台,以及配置 IAM 身份提供商,角色和信任策略,实现在 AWS 上基于角色切换的多账户管理。

本篇作者

李智雪

AWS 解决方案架构师,AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在互联网行业以及媒体行业应用和推广。加入AWS之前曾就职于微软、爱立信等公司,有十余年媒体行业以及解决方案架构师从业经验。