文档

通过SCIM协议将企业内部账号同步到阿里云RAM

更新时间:

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

前提条件

  • 您的阿里云账号或RAM用户有创建OAuth应用的权限。

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

背景信息

  • SCIM(System for Cross-domain Identity Management)主要用于多用户的云应用身份管理。SCIM 2.0建立在一个对象模型上,所有SCIM对象都继承Resource。Resource具有id、externalId和meta属性,RFC 7643定义了扩展公共属性的User、Group和EnterpriseUser。本文的示例将采用User来同步用户信息。

  • 开放授权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

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

  1. 使用阿里云账号登录RAM控制台

  2. 在左侧导航栏,单击OAuth应用(公测)

  3. 企业应用页签,单击创建应用,创建OAuth应用。

    其中,应用类型选择ServerApp。具体操作,请参见创建应用

  4. 单击应用名称,在应用OAuth范围页签,单击添加OAuth范围,添加OAuth应用范围。

    其中,OAuth范围选择/acs/scim。具体操作,请参见添加应用范围

  5. 为OAuth应用授权。

    1. 应用OAuth范围页签,单击去授权

    2. 应用授权页面,选中阿里云跨域身份管理服务,然后单击授权

  6. 应用密钥页签,单击创建密钥,创建应用密钥。

    重要
    • 应用密钥内容(client_secret)仅在创建时可见,请您及时保存。

    • AppSecretId是应用密钥的ID,不是应用密钥内容(client_secret)。

步骤二:同步账号数据

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

  • 客户端:您可以在客户端(One Identity)中配置SCIM信息,然后通过One Identity同步账号数据。One Identity配置方法,请参见One Identity文档

  • 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)。

  2. 通过client_idclient_secret访问https://oauth.aliyun.com/v1/token,获取access_token

    其中,请求头中的Authorization内容为"Authorization: Basic Base64Encode(client_id:client_secret)",例如:client_id=cid,client_secret=123456,那么请求头中需要输入的Authorization内容为"Authorization: Basic Y2lkOjEyMzQ1Ng=="

    请求示例:

    curl --location --request POST --header "Authorization: Basic Y2lkOjEyMzQ1Ng==" 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用户成功。

      说明

      阿里云暂时不支持软删除。如果您的系统支持软删除,建议先将软删除映射成硬删除,再同步到阿里云。