企业上云的过程中,为减少维护和管理成本,需要基于一套原则将企业内部系统中已有的账号同步到云上。阿里云通过SCIM标准协议,结合OAuth应用的安全授权,可以将企业内部系统中的账号数据同步到阿里云访问控制(RAM)中。
前提条件
本文中所有RAM控制台的操作,推荐使用RAM管理员或具有OAuth管理权限的RAM用户完成。
背景信息
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授权形态分为WebApp、NativeApp和ServerApp三种。WebApp和NativeApp都属于3-legged OAuth,而ServerApp属于2-legged OAuth。SCIM主要使用2-legged OAuth机制来完成应用程序(消费者)和API(服务提供商)之间的授权,从而进行下一步的数据同步业务。更多关于OAuth的信息,请参见OAuth 2.0和OAuth应用概览。
阿里云SCIM Endpoint:
https://scim.aliyun.com
。阿里云OAuth获取access_token的Endpoint:
https://oauth.aliyun.com/v1/token
。
步骤一:创建OAuth应用并授权
使用阿里云账号登录RAM控制台。
在左侧导航栏,单击OAuth应用(公测)。
在企业应用页签,单击创建应用,创建OAuth应用。
其中,应用类型选择ServerApp。具体操作,请参见创建应用。
单击应用名称,在应用OAuth范围页签,单击添加OAuth范围,添加OAuth应用范围。
其中,OAuth范围选择/acs/scim。具体操作,请参见添加应用范围。
为OAuth应用授权。
在应用OAuth范围页签,单击去授权。
在第三方应用授权页面,选中阿里云跨域身份管理服务,然后单击授权。
在应用密钥页签,单击创建密钥,创建应用密钥。
重要应用密钥内容(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同步账号数据的操作如下所示。
获取已授权的ServerApp的ID(client_id)和密钥内容(client_secret)。
client_id:应用ID。从步骤一:创建OAuth应用并授权获取。
client_secret:应用密钥内容。从步骤一:创建OAuth应用并授权获取。
通过
client_id
和client_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" }
查询阿里云SCIM支持的
ResourceType
和Schema
。查询SCIM支持的
ResourceType
:curl --location --request GET 'https://scim.aliyun.com/ResourceTypes'
查询SCIM支持的
Schema
:curl --location --request GET 'https://scim.aliyun.com/Schemas'
创建、查询、修改和删除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,阿里云仅支持对
id
、userName
和externalId
进行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用户成功。
说明阿里云暂时不支持软删除。如果您的系统支持软删除,建议先将软删除映射成硬删除,再同步到阿里云。