企业上云的过程中,为减少维护和管理成本,需要基于一套原则将企业内部系统中已有的账号同步到云上。阿里云通过SCIM标准协议,结合OAuth应用的安全授权,可以将企业内部系统中的账号数据同步到阿里云访问控制(RAM)中。

前提条件

  • 您的阿里云账号或RAM用户有创建OAuth应用的权限。
  • 您的阿里云账号或RAM用户有为ServerApp授权的权限,且您仅能给自己账号下的ServerApp授权。

背景信息

  • SCIM(System for Cross-domain Identity Management)主要用于多用户的云应用身份管理。SCIM 2.0建立在一个对象模型上,所有SCIM对象都继承Resource。Resource具有id、externalId和meta属性,RFC7643定义了扩展公共属性的User、Group和EnterpriseUser。本文的示例将采用User来同步用户信息。更多关于SCIM的信息,请参见SCIM
  • 开放授权OAuth(Open Authorization)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号和密码,就可获取到用户的授权信息。阿里云当前的OAuth授权形态分为WebAppNativeAppServerApp三种。WebAppNativeApp都属于3-legged OAuth,而ServerApp属于2-legged OAuth。SCIM主要使用2-legged OAuth机制来完成应用程序(消费者)和API(服务提供商)之间的授权,从而进行下一步的数据同步业务。更多关于OAuth的信息,请参见OAuth 2.0OAuth应用概览
  • 阿里云SCIM Endpoint:https://scim.aliyun.com
  • 阿里云OAuth获取access_token的Endpoint:https://oauth.aliyun.com/v1/token

步骤1:创建OAuth应用并授权

  1. 云账号登录RAM控制台
  2. 单击OAuth应用管理 > 创建应用,创建OAuth应用。
    其中,应用类型选择ServerApp创建OAuth应用
  3. 单击应用名称,然后在应用OAuth范围页签下单击添加OAuth范围
    其中,OAuth范围选择/acs/scim添加OAuth范围
  4. 应用OAuth范围页签,先单击去授权,然后单击管理员授权
    123
  5. 应用密钥页签,单击创建密钥
    创建密钥
    注意
    • 密钥仅在创建时可见,请您注意保存。
    • AppSecretId是密钥的ID,不是密钥(client_secret)内容。

步骤2:同步账号数据

支持通过客户端(例如:One Identity)或SCIM API两种方式同步账号数据。

  • 客户端:您可以在客户端(One Identity)中配置SCIM信息,然后通过One Identity同步账号数据。One Identity配置方法,请参见Setting up Synchronization with a Cloud Application
  • SCIM API:您可以通过SCIM API将企业内部系统中的账号映射成RAM用户,进行创建、删除、查询和修改操作。支持对RAM用户的如下字段进行操作:
    • id:RAM用户ID,全局唯一,服务端生成。
    • externalId:RAM用户外键,用户级别唯一,客户端指定,用于将阿里云的RAM用户和企业内部系统中的用户关联。
      说明 通过控制台创建的RAM用户无externalId字段。
    • userName:RAM用户名称,用户级别唯一,客户端指定。
    • displayName:RAM用户显示名称,客户端指定。

通过阿里云SCIM API同步账号数据的操作如下所示。

  1. 获取已授权的ServerApp的ID(client_id)和密钥(client_secret)。
    • client_id:在RAM控制台的企业应用页签,查看ServerApp的ID(client_id)。client_id
    • client_secret:在RAM控制台,创建密钥时保存的密钥。
  2. 通过client_idclient_secret访问https://oauth.aliyun.com/v1/token,获取access_token

    请求示例:

    curl --location --request POST --header "Authorization: Basic NDA0NzE****" https://oauth.aliyun.com/v1/token?grant_type=client_credentials&client_id=463790568674183****

    返回示例:

    {
        "scope": "/acs/scim",
        "request_id": "8dc768e0-d6fe-4f52-a788-05631dd6c584",
        "access_token": "eyJ***hKg",
        "token_type": "Bearer",
        "expires_in": "3599"
    }
  3. 查询阿里云SCIM支持的ResourceTypeSchema

    查询SCIM支持的ResourceType

    curl --location --request GET 'https://scim.aliyun.com/ResourceTypes'

    查询SCIM支持的Schema

    curl --location --request GET 'https://scim.aliyun.com/Schemas'
  4. 创建、查询、修改和删除RAM用户。
    • 创建RAM用户。

      根据企业内部系统中的账号信息,指定与之对应的RAM用户名称(userName)、显示名称(displayName)和外键(externalId),然后创建RAM用户。

      请求示例:

      curl --location --request POST 'https://scim.aliyun.com/Users' \
      --header 'Authorization: Bearer  eyJ***hKg' \
      --header 'Content-Type: application/json' \
      --data-raw '{
          "displayName": "j2gg0s_****",
          "schemas": [
              "urn:ietf:params:scim:schemas:core:2.0:User"
          ],
          "externalId": "6e74eec4-ddb5-4e74-bd12-5e7b99b2****",
          "userName": "j2gg0screatedbyscim_exa****"
      }'

      返回示例:

      {
          "displayName": "j2gg0s_****",
          "meta": {
              "created": "2020-02-14T03:58:59Z",
              "location": "https://scim.aliyun.com/Users/27648498165273****",
              "lastModified": "2020-02-14T03:58:59Z",
              "resourceType": "User"
          },
          "schemas": [
              "urn:ietf:params:scim:schemas:core:2.0:User"
          ],
          "externalId": "6e74eec4-ddb5-4e74-bd12-5e7b99b2****",
          "id": "27648498165273****",
          "userName": "j2gg0screatedbyscim_exa****"
      }
    • 查询指定的RAM用户。
      • 通过GET /Users/{id},查询指定id的RAM用户。
      • 通过GET /Users?filter=externalId eq xxx,查询指定externalId的RAM用户。
      • 通过GET /Users?filter=userName eq xxx,查询指定userName的RAM用户。请求示例和响应示例如下。

        请求示例:

        curl --location --request GET 'https://scim.aliyun.com/Users?filter=userName%20eq%20%22j2gg0screatedbyscim****%22' \
        --header 'Authorization: Bearer  eyJ***hKg'

        返回示例:

        {
            "startIndex": 1,
            "totalResults": 1,
            "itemsPerPage": 30,
            "schemas": [
                "urn:ietf:params:scim:api:messages:2.0:ListResponse"
            ],
            "Resources": [
                {
                    "displayName": "j2gg0screatedbyscim****",
                    "meta": {
                        "created": "2019-12-11T01:53:19Z",
                        "location": "https://scim.aliyun.com/Users/27769827602919****",
                        "lastModified": "2019-12-11T02:10:39Z",
                        "resourceType": "User"
                    },
                    "schemas": [
                        "urn:ietf:params:scim:schemas:core:2.0:User"
                    ],
                    "externalId": "6e74eec4-ddb5-4e74-bd12-5e7b99b2****",
                    "id": "27769827602919****",
                    "userName": "j2gg0screatedbyscim****"
                }
            ]
        }
        说明 对于SCIM Filter,阿里云仅支持对iduserNameexternalId进行and和eq操作。
    • 修改RAM用户属性。

      请求示例:

      curl --location --request PUT 'https://scim.aliyun.com/Users/27648498165273****' \
      --header 'Authorization: Bearer  eyJ***hKg' \
      --header 'Content-Type: application/json' \
      --data-raw '{
          "displayName": "j2gg0s_new_****",
          "schemas": [
              "urn:ietf:params:scim:schemas:core:2.0:User"
          ],
          "externalId": "6e74eec4-ddb5-4e74-bd12-5e7b99b2****",
          "userName": "j2gg0screatedbyscim_new_exa****"
      }'

      返回示例:

      {
          "displayName": "j2gg0s_new_****",
          "meta": {
              "created": "2020-02-14T03:58:59Z",
              "location": "https://scim.aliyun.com/Users/27648498165273****",
              "lastModified": "2020-02-14T04:03:55Z",
              "resourceType": "User"
          },
          "schemas": [
              "urn:ietf:params:scim:schemas:core:2.0:User"
          ],
          "externalId": "6e74eec4-ddb5-4e74-bd12-5e7b99b2****",
          "id": "27648498165273****",
          "userName": "j2gg0screatedbyscim_new_exa****"}
    • 删除RAM用户。

      请求示例:

      curl --location --request DELETE 'https://scim.aliyun.com/Users/27648498165273****' \
      --header 'Authorization: Bearer  eyJ***hKg' \
      --header 'Content-Type: application/json'

      返回的HTTP状态码为204时,表示删除RAM用户成功。

      说明
      • 如果RAM用户有关联的AccessKey、RAM Policy等,考虑到安全因素,不支持通过SCIM API直接删除RAM用户。
      • 阿里云暂时不支持软删除。如果您的系统支持软删除,建议先将软删除映射成硬删除,再同步到阿里云。