发布于: Jul 29, 2022

 

本文将会介绍一种基于 x.509 证书的认证方式,并结合 Amazon Identity and Access Management (IAM) 服务完成对相关资源的授权

 

企业在 Amazon Web Services 上构建自己的物联网云应用系统时,常常需要授权应用系统的最终用户直接访问 Amazon Web Services 资源(例如:允许最终用户访问非公开权限的 Amazon S3 存储桶)。Amazon Web Services 通过 Identity and Access Management (IAM) 服务授权用户访问 Amazon Web Services 资源。在面对最终用户时,企业可以选择 Amazon Cognito 结合 IAM 从应用程序端控制 Amazon Web Services 资源访问。这需要企业将 Amazon Cognito 与管理最终用户的身份提供商(IDP, Identity Provider)进行集成,以实现 Amazon Web Services 资源访问控制 [1]。

本文将会介绍一种基于 x.509 证书的认证方式,并结合 Amazon Identity and Access Management (IAM) 服务完成对相关资源的授权。从实现角度上看,该方式具有如下特点:

  1. 无需与第三方 IDP 即成,实现简单;
  2. 无需预付费用,适合对成本敏感的企业;
  3. 基于 509 的认证方式,安全可靠
 

在 Amazon Web Services 上,用户可以通过 Amazon Certificate Manager 或 Amazon IoT 服务获取 x.509 证书。本文所介绍的方案涉及到基于证书的认证、授权,将使用 Amazon IoT 服务对证书进行管理。

在介绍方案之前,先来简要介绍一下 Amazon IoT [2] 服务。Amazon IoT 通过“物品 (Thing)”、“证书 (Certificate)”、“策略 (Policy)”来管理物联设备。物品可以属于一个或多个物品组 (Thing Group),策略可以关联给物品、物品组、或物品组中包含的其它物品组。此外,物品还可以属于某一种物品类型 (Thing Type),属于物品类型的物品可以拥有最多 50 个属性 (Attribute) 用于描述物品,而不属于任何物品类型的物品最多只能拥有 3 个属性。下图所表示的是它们之间的对应关系:

amazon-iot-certificates-authorize-end-users1

图 1:Amazon IoT 基本概念

 

借助 Amazon IoT 证书实现对最终用户的认证、授权管理,本质上就是将最终用户在逻辑上视作一个物联设备,借助 Amazon IoT 中的“物品”及物品属性的概念管理用户信息,利用 Amazon IoT 证书的认证、授权过程实现针对最终用户的认证、授权。接下来,我将进一步阐述这一对应关系。

概念对应关系

  • 用户信息 vs 物品属性:
    通常,在应用系统中进行用户管理时往往需要一个数据库来记录用户信息,例如记录用户的 ID、姓名、电话、邮箱等。Amazon IoT 中的物品可以通过属性的方式来记录物品的元数据,这些元数据可以用来表示最终用户的基本信息。
  • 用户组 vs 物品组:
    用户组通常用来简化对一批同类用户进行授权的过程。在 Amazon IoT 服务中,物品组在关联策略之后可以向组内所有物品进行统一授权,这与用户组的概念非常接近。本文中的方法也是用 Amazon IoT 物品组代表用户组。
  • 公司/组织 vs 物品类型:
    每一个物品仅能属于一个物品类型,正如一个用户往往只属于一个公司或组织。在本文中将使用 Amazon IoT 物品类型代表现实中的公司。这对于那些多租户的 SaaS 应用非常必要。

整体对应关系如下表示:

amazon-iot-certificates-authorize-end-users2

图 2:概念对应

权限设计

借助关联给物品的证书,Amazon IoT 服务与 Amazon IAM、Amazon STS 等服务集成,可以授权物品直接访问 Amazon Web Services 资源和服务。这一过程如下图所示:

amazon-iot-certificates-authorize-end-users3

图 3:借助 Amazon IoT 服务直接访问 Amazon Web Services 资源

上图所示过程可以在官方文档上找到详细说明 [3],本文不再赘述。概括而言,这一过程可以细分为两次验证、两次授权:

  1. Amazon IoT 服务验证证书的有效性,完成认证过程;
  2. Amazon IoT 对用户进行授权,允许通过 Amazon STS 服务继承特定的 IAM 角色,获得临时用户凭证(AKSK);
  3. 用户使用临时用户凭证对 API 调用请求进行签名,Amazon Web Services 验证签名的有效性;
  4. 验证请求有效后,根据对应的 IAM 角色授予相关 Amazon Web Services 资源的访问权限。

 

验证有效性的工作由 Amazon Web Services 服务自动完成,用户只需对上述 2、4 两个环节中涉及到的权限进行设置:

  • Amazon IoT 权限:授权所使用的证书可以使用 sts:AssumeRole。这是必须授予的权限,是后续操作正常完成的前提。
  • Amazon IAM Role 权限:授予用户访问具体 Amazon Web Services 服务的权限。该权限根据不同应用、不同用户进行对应的设置。

 

在实际应用过程中往往通过“用户组”和/或传递变量的方式来简化授权过程。如前文中所提到的,我们可以使用 Amazo IoT Thing Group 作为“用户组”实现批量授权。在变量方面,Amazon IAM 可以接受的 Amazon IoT 变量类型如下:

  • credentials-iot: ThingName
  • credentials-iot: ThingTypeName
  • credentials-iot: AwsCertificateId

 

我们可以利用这些变量实现只使用一个 Amazon IAM Role 就可以针对不同用户授予不同权限的目的(例如:每一个用户仅可以访问 Amazon S3 存储桶中自己的目录)。

 

相关文章