企業上云的過程中,為減少維護和管理成本,需要基于一套原則將企業內部系統中已有的賬號同步到云上。阿里云通過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用戶成功。
說明阿里云暫時不支持軟刪除。如果您的系統支持軟刪除,建議先將軟刪除映射成硬刪除,再同步到阿里云。