本文為您介紹如何使用角色SSO的方式訪問Hologres。
背景資訊
阿里雲支援企業使用者通過在阿里雲控制台輸入帳號、密碼後登入阿里雲來管理和使用雲資源。隨著企業安全監管要求的日益嚴格,部分企業更願意通過角色登入(Role Base_SSO)的方式登入阿里雲。詳情請參見SAML角色SSO概覽。
適用情境
一般情況下,對於阿里雲企業使用者,需要使用者通過在阿里雲控制台輸入帳號、密碼後登入阿里雲來管理和使用雲資源。但是隨著企業安全監管要求的日益嚴格,希望集中管理登入鑒權資訊,企業往往會選擇單點登入(SSO)的方式登入應用。SSO是指在多個應用系統中,使用者只需要登入一次,就可以訪問所有相互信任的應用系統。現在Hologres支援基於角色的SSO登入模式,詳情請參見SAML角色SSO概覽。基於該功能,您可以使用企業帳號,扮演RAM角色訪問Hologres執行個體。具體的存取權限由RAM角色控制。一個調用的範例如下。
使用者使用瀏覽器在Idp的登入頁面中選擇阿里雲作為目標服務。
例如:如果企業IdP使用AD FS(Microsoft Active Directory Federation Service),則登入URL為:https://ADFSServiceName/adfs/ls/IdpInitiatedSignOn.aspx。
說明有些IdP會要求使用者先登入,再選擇代表阿里雲的SSO應用。
IdP產生一個SAML響應並返回給瀏覽器。
瀏覽器重新導向到SSO服務頁面,並轉寄SAML響應給SSO服務。
SSO服務使用SAML響應向阿里雲STS服務要求臨時安全憑證,並產生一個可以使用臨時安全憑證登入阿里雲控制台的URL。
說明如果SAML響應中包含映射到多個RAM角色的屬性,系統將會首先提示使用者選擇一個用於訪問阿里雲的角色。
SSO服務將URL返回給瀏覽器。
瀏覽器重新導向到該URL,以指定RAM角色登入到阿里雲控制台,使用者使用企業賬戶扮演RAM角色登入Hologres執行個體。
Hologres支援的使用者訪問方式
Hologres支援如下兩種訪問方式:
通過雲帳號(阿里雲帳號或RAM使用者)訪問Hologres。
您可以通過輸入帳號、密碼的方式登入阿里雲管理主控台,並以當前登入帳號的身份使用Hologres。此時,阿里雲帳號將成為Hologres某個執行個體的成員,擁有Hologres產品的使用許可權。
通過RAM角色SSO的方式登入Hologres。
您也可以通過角色SSO的方式(SAML角色SSO概覽)登入阿里雲,並使用Hologres。此時,阿里雲存取控制角色(RAM Role)將成為Hologres某個執行個體的成員,扮演該RAM Role的使用者將擁有和雲帳號類成員同樣的產品使用許可權。RAM角色的描述,詳情請參見RAM角色概覽。
對於Hologres來說,RAM角色(RAM Role)和阿里雲帳號(包括主帳號和RAM使用者)是同等地位的帳號。因此,對於Hologres來說,RAM角色就是一個普通的可登入帳號。Superuser需要對這個RAM角色(而不是背後的雲帳號)進行授權來賦予這個RAM角色許可權(SELECT/INSERT/UPDATE等),這個RAM角色才能在許可權範圍內使用Hologres。
RAM角色SSO(STS)介紹
通過RAM角色SSO的方式登入並訪問Hologres是基於阿里雲STS服務實現的。阿里雲STS(Security Token Service)是為阿里雲帳號(或RAM使用者)提供短期存取權限管理的雲端服務。通過STS,您可以為使用者(您的本地帳號系統所管理的使用者)頒發一個自訂時效和存取權限的訪問憑證。使用者可以使用STS短期訪問憑證直接連接Hologres並訪問被授權的資源。
使用STS Token有以下優勢:
減少了帳號AccessKey ID和AccessKey Secret泄露的風險,只需要產生一個臨時訪問憑證給使用者使用即可。
能使用靈活的許可權控制,STS Token有一定的時間期限,不需要關心許可權撤銷問題,臨時訪問憑證到期後會自動失效。
如下操作步驟將指導您通過建立RAM角色並授權訪問Hologres。
步驟一:建立RAM角色
登入存取控制,建立RAM角色。當前可信實體類型,可以選擇阿里雲帳號或者身份供應商。
如果需要通過阿里雲管理主控台切換身份方式扮演該角色,選擇阿里雲帳號類型的角色。具體操作請參見通過RAM使用者扮演角色並添加許可權。
如果需要通過本地IDP身份供應商帳號登入至阿里雲扮演該角色,選擇身份供應商類型的角色。具體操作請參見通過IDP身份供應商帳號來扮演角色並添加許可權。
通過RAM使用者扮演角色並添加許可權
如果需要通過RAM使用者來扮演RAM角色並基於阿里雲控制台切換身份方式扮演該角色,請登入存取控制,建立RAM角色。當前可信實體類型,可以選擇阿里雲帳號。
建立可信實體類型為阿里雲帳號的RAM角色。
登入存取控制,在左側導覽列,單擊身份管理>角色。
在建立角色頁面,單擊建立角色,信任主體類型選擇雲帳號,信任主體名稱選擇當前雲帳號。單擊確定。
在建立角色對話方塊輸入角色名稱,單擊確定完成建立。
建立並添加權限原則。
在RAM角色管理列表頁,單擊目標角色名稱,進入角色資訊詳情頁。
選擇信任策略頁簽,單擊編輯信任策略修改信任策略為如下指令碼內容。
參數說明
在策略配置時,您需要將如下指令碼中的
acs:ram::主帳號ID:root資訊中的主帳號ID,替換為需要授權的帳號資訊。請前往使用者資訊頁面,擷取帳號ID。指令碼配置
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::主帳號ID:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "dataworks.aliyuncs.com" ] } } ], "Version": "1" }
單擊確定,完成權限原則配置。
建立RAM使用者並授予角色許可權。
通過IDP身份供應商帳號來扮演角色並添加許可權
如果需要通過本地IDP身份供應商帳號登入至阿里雲扮演RAM角色,請登入存取控制,建立RAM角色。當前可信實體類型,可以選擇身份供應商。
建立可信實體類型為身份供應商的RAM角色。
登入存取控制在左側導覽列,單擊身份管理 > 角色。
在角色頁面,單擊建立角色,當前可信實體類型選擇身份供應商。
單擊確定,配置角色名稱和備忘。
選擇身份供應商類型、選擇身份供應商並查看限制條件後,單擊完成,頁面提示角色建立成功完成建立。
建立並添加權限原則。
在角色列表頁,單擊目標角色名稱,進入角色資訊詳情頁。
選擇信任策略頁簽,單擊編輯信任策略,修改新任策略為如下指令碼內容。
參數說明
在策略配置時,您需要將如下指令碼中的
acs:ram::主帳號ID:saml-provider/IDP資訊中的主帳號ID,替換為需要授權的帳號資訊。請前往使用者資訊頁面,擷取帳號ID。指令碼配置
"Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "saml:recipient": "https://signin.aliyun.com/saml-role/sso" } }, "Effect": "Allow", "Principal": { "Federated": [ "acs:ram::主帳號ID:saml-provider/IDP" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "dataworks.aliyuncs.com" ] } } ], "Version": "1" } }
單擊確定,完成權限原則配置。
步驟二:添加RAM角色至Hologres執行個體並授權
RAM角色需要有Hologres執行個體的開發許可權,才能在許可權範圍內使用Hologres。由於RAM角色預設沒有Hologres管控台的查看和操作執行個體的許可權,因此需要主帳號完成RAM相關許可權授予才能進行後續操作。具體操作,請參見授予RAM使用者權限。添加RAM角色至Hologres執行個體,您可以通過如下方式進行授權。
登入Hologres管理主控台進行授權。
在左側導覽列選擇進入執行個體列表頁面,單擊需要授權的執行個體,在使用者管理頁簽找到RAM角色並新增使用者至執行個體。
在DB授權頁簽,為該RAM使用者授予具體的執行個體開發許可權。
通過SQL方式授權。
您可以通過SQL方式進行授權,具體請參見許可權管理概述。
若是通過RAM使用者扮演RAM角色,RAM角色預設沒有Hologres管理主控台的許可權,需要主帳號給RAM使用者在存取控制頁面授予AliyunRAMReadOnlyAccess許可權,否則RAM角色無法在Hologres管理主控台進行任何操作。詳情請參見文檔授予RAM使用者權限。
步驟三:登入阿里雲並使用Hologres
管控台登入和HoloWeb登入
當您完成授權之後,使用者就可以扮演user-role角色登入並使用Hologres。
使用RAM角色,登入Hologres管理主控台,對Hologres執行個體進行管控。
在Hologres控制台頁面,單擊左側導覽列前往HoloWeb,進入HoloWeb頁面,進行Hologres結構設計和資料開發。具體操作請參見串連HoloWeb並執行查詢。
JDBC和PSQL用戶端登入
從Hologres V2.0版本開始,Hologres支援在PostgreSQL協議的串連選項中指定Security Token。您可以憑藉Security Token,通過PostgreSQL用戶端,如JDBC或PSQL,實現RAM角色登入訪問Hologres。
在訪問Hologres之前,您需要先確認已完成下述兩項操作:
您已添加RAM角色至Hologres執行個體並授權。詳情請參見步驟二:添加RAM角色至Hologres執行個體並授權。
您已調用存取控制中的API(AssumeRole - 擷取扮演角色的臨時身份憑證)擷取STS Token三元組(AccessKeyId、AccessKeySecret和SecurityToken)。具體操作步驟,詳情請參見STS SDK調用樣本。STS Token樣本資訊如下:
"Credentials": { "SecurityToken": "CAISuwJ1q6Ft5B2yu****KiAA", "AccessKeyId": "STS.NTKaenSkmLhG4HpM5****76UV", "AccessKeySecret": "6itECZnhbG2RU6ktTSBSd6JxeLHKPWyBt****SS62", "Expiration": "2025-02-21T03:47:07Z" }
確認完成操作後,您可以通過以下方式串連並使用Hologres。
JDBC JAVA串連方式:更多操作資訊,詳情請參見JDBC串連Hologres。
範例程式碼1:通過PostgreSQL JDBC Driver內建的PGProperty類的屬性來載入STS Token三元組完成身份校正。
import org.postgresql.PGProperty; import java.sql.*; import java.io.IOException; import java.util.Properties; public class JdbcLinkHologres1 { public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException { // 此處以把AccessKey和AccessKeySecret儲存在環境變數為例說明。您也可以根據業務需要,儲存到設定檔裡 // 強烈建議不要把AccessKey和AccessKeySecret儲存到代碼裡,會存在密鑰泄漏風險 String accessKeyId = "ALIBABA_CLOUD_ACCESS_KEY_ID"; String accessKeySecret = "ALIBABA_CLOUD_ACCESS_KEY_SECRET"; String securityToken = "<SecurityToken>"; String url = "jdbc:postgresql://<host>:<port>/<database>"; Properties props = new Properties(); PGProperty.USER.set(props, accessKeyId); PGProperty.PASSWORD.set(props, accessKeySecret); PGProperty.OPTIONS.set(props, "sts_token=" + securityToken); Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(url, props); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM tabletest"); // Process the resultSet while (resultSet.next()) { System.out.println("Result: " + resultSet.getInt(1)); System.out.println("Result: " + resultSet.getString(2)); } } }範例程式碼2:通過先對SecurityToken資訊進行URL編碼然後拼接至JDBC的URL中,再通過驅動類擷取Hologres連結時載入AccessKeyId和AccessKeySecret進行身分識別驗證。
import java.net.URLEncoder; import java.sql.*; import java.io.IOException; public class JdbcLinkHologres2 { public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException { // 此處以把AccessKey和AccessKeySecret儲存在環境變數為例說明。您也可以根據業務需要,儲存到設定檔裡 // 強烈建議不要把AccessKey和AccessKeySecret儲存到代碼裡,會存在密鑰泄漏風險 String accessKeyId = "ALIBABA_CLOUD_ACCESS_KEY_ID"; String accessKeySecret = "ALIBABA_CLOUD_ACCESS_KEY_SECRET"; String securityToken = "<SecurityToken>"; String url = "jdbc:postgresql://<host>:<port>/<database>"; String urlWithOptions = url + "?options=sts_token=" + URLEncoder.encode(securityToken, "UTF-8"); Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(urlWithOptions, accessKeyId, accessKeySecret); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM tabletest"); // Process the resultSet while (resultSet.next()) { System.out.println("Result: " + resultSet.getInt(1)); System.out.println("Result: " + resultSet.getString(2)); } } }
PSQL用戶端串連方式:Linux系統語句如下。更多操作資訊,詳情請參見PSQL用戶端串連Hologres。
PGUSER=<AccessKeyId> PGPASSWORD=<AccessKeySecret> PGOPTIONS="sts_token=<SecurityToken>" psql -h <host> -p <port> -d <database>
常見問題
RAM角色登入報錯password authentication failed for user "<AccessKeyId>",應當如何排查?
該錯誤表示可能存在AccessKeyId錯誤、AccessKeySecret錯誤、Security Token錯誤,或當前登入的使用者尚未在Hologres執行個體中建立。建議按照以下順序進行排查:
檢查執行個體內是否存在當前正在登入的使用者。若不存在,可將RAM角色新增至該執行個體。詳情請參見步驟二:添加RAM角色至Hologres執行個體並授權。
檢查Security Token傳遞方式是否正確,當通過URL進行傳遞時,需要經過
URLEncoder.encode處理。檢查AccessKeyId、AccessKeySecret和Security Token是否正確無誤。
