本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon OpenSearch Service 的 JWT 身分驗證和授權
Amazon OpenSearch Service 現在可讓您使用 JSON Web Token (JWTs) 進行身分驗證和授權。JWTs是以 JSON 為基礎的存取字符,用於授予單一登入 (SSO) 存取。您可以使用 OpenSearch Service 中的 JWTs來建立單一登入字符,以驗證對 OpenSearch Service 網域的請求。若要使用 JWTs,您必須啟用精細存取控制,而且必須提供有效的 RSA 或 ECDSA PEM 格式公有金鑰。如需精細存取控制的詳細資訊,請參閱 Amazon OpenSearch Service 中的精細存取控制。
您可以使用 OpenSearch Service 主控台、 AWS Command Line Interface (AWS CLI) 或 AWS SDKs來設定 JSON Web 權杖。
考量事項
將 JWTs與 Amazon OpenSearch Service 搭配使用之前,您必須考慮下列事項:
-
由於 RSA 公有金鑰的大小採用 PEM 格式,我們建議您使用 AWS 主控台來設定 JWT 身分驗證和授權。
-
指定 JWTs 的主題和角色欄位時,您必須提供有效的使用者和角色,否則請求將被拒絕。
-
OpenSearch 2.11 是可用於 JWT 身分驗證的最早相容版本。
修改網域存取政策
您必須先更新網域存取政策,以允許 JWT 使用者存取網域,才能將網域設定為使用 JWT 身分驗證和授權。否則,所有傳入的 JWT 授權請求都會遭到拒絕。提供子資源 (/*) 完整存取權的建議網域存取政策為:
設定 JWT 身分驗證和授權
您可以在網域建立程序期間或透過更新現有網域來啟用 JWT 身分驗證和授權。設定步驟會因您選擇的選項而略有不同。
下列步驟說明如何在 OpenSearch Service 主控台中設定 JWT 身分驗證和授權的現有網域:
-
在網域組態下,導覽至 OpenSearch 的 JWT 身分驗證和授權,選取啟用 JWT 身分驗證和授權。
-
設定要用於網域的公有金鑰。若要這樣做,您可以上傳 PEM 檔案、包含公有金鑰,或手動輸入。
注意
如果上傳或輸入的金鑰無效,則會在指定問題的文字方塊上方顯示警告。
-
(選用) 在其他設定下,您可以設定下列選用欄位
-
主旨金鑰 — 您可以保留此欄位空白,以使用 JWTs的預設
sub金鑰。 -
角色金鑰 — 您可以保留此欄位空白,以使用 JWTs的預設
roles金鑰。
完成變更後,請儲存您的網域。
-
使用 JWKS 端點來驗證 JWT
您可以設定 JSON Web 金鑰集 (JWKS) 端點 URL,從身分提供者動態擷取公有金鑰,而不是設定靜態公有金鑰。設定 JWKS 端點時,OpenSearch Service 會自動擷取和快取用於驗證 JWT 簽章的公有金鑰,無需在身分提供者輪換簽署金鑰時手動更新金鑰。
JWKS 端點組態需要 OpenSearch 3.3 版或更新版本。
注意
同時設定 JWKS URL 和靜態公有金鑰時,會優先使用 JWKS URL,並忽略靜態公有金鑰。
回溯相容性
此功能可維持完整的回溯相容性:
-
當
JwksUrl未指定或設定為 null 時,系統會使用現有的靜態公有金鑰機制。 -
現有的 JWT 組態會繼續運作,無需修改。
-
您可以更新網域組態,在靜態金鑰和 JWKS 之間切換。
設定 JWKS 端點
您可以使用 OpenSearch Service 主控台、 AWS CLI或組態 API 來設定 JWKS 端點。
設定 JWKS 端點
-
在網域組態下,導覽至 OpenSearch 的 JWT 身分驗證和授權。
-
選取啟用 JWT 身分驗證和授權。
-
針對金鑰來源,選取 JWKS URL。
-
輸入身分提供者提供的 JWKS 端點 URL (例如
https://example.com/.well-known/jwks.json)。 -
(選用) 在其他設定下設定主旨金鑰和角色金鑰欄位。
-
選擇儲存變更。
下列 AWS CLI 命令會為現有網域上的 JWT 身分驗證設定 JWKS 端點:
aws opensearch update-domain-config \ --domain-namemy-domain\ --advanced-security-options '{"JWTOptions":{"Enabled":true, "JwksUrl":"https://example.com/.well-known/jwks.json", "SubjectKey":"sub", "RolesKey":"roles"}}'
對組態 API 的下列請求會為現有網域上的 JWT 身分驗證設定 JWKS 端點:
POST https://es.us-east-1.amazonaws.com/2021-01-01/opensearch/domain/my-domain/config { "AdvancedSecurityOptions": { "JWTOptions": { "Enabled": true, "JwksUrl": "https://example.com/.well-known/jwks.json", "RolesKey": "optional-roles-key", "SubjectKey": "optional-subject-key" } } }
JWT 標頭需求
使用 JWKS 端點時,JWT 標頭必須包含金鑰 ID (kid),以識別要用於驗證的特定金鑰:
{ "alg": "RS256", "typ": "JWT", "kid": "V-diposfUJIk5jDBFi_QRouiVinG5PowskcSWy5EuCo" }
此kid值必須符合 JWKS 端點回應中的金鑰識別符。
如需 JWKS 組態選項和安全性設定的詳細資訊,請參閱 OpenSearch 文件中的使用 JWKS 端點來驗證 JWT
使用 JWT 傳送測試請求
使用指定的主旨和角色對建立新的 JWT 之後,您可以傳送測試請求。若要這樣做,請使用私有金鑰,透過建立 JWT 的工具簽署您的請求。OpenSearch Service 能夠透過驗證此簽章來驗證傳入請求。
注意
如果您為 JWT 指定自訂主體金鑰或角色金鑰,則必須為 JWT 使用正確的宣告名稱。
以下是如何使用 JWT 字符透過網域的搜尋端點存取 OpenSearch Service 的範例:
curl -XGET "$search_endpoint" -H "Authorization: Bearer <JWT>"
如果網域存在,以下 AWS CLI 命令會啟用 OpenSearch 的 JWT 身分驗證和授權:
aws opensearch update-domain-config --domain-name <your_domain_name> --advanced-security-options '{"JWTOptions":{"Enabled":true, "PublicKey": "<your_public_key>", "SubjectKey": "<your_subject_key>", "RolesKey": "<your_roles_key>"}}'
設定 JWT 身分驗證和授權 (透過 API 設定)
下列對組態 API 的請求會在現有網域上啟用 OpenSearch 的 JWT 身分驗證和授權:
POST https://es.us-east-1.amazonaws.com/2021-01-01/opensearch/domain/my-domain/config
{
"AdvancedSecurityOptions": {
"JWTOptions": {
"Enabled": true,
"PublicKey": "public-key",
"RolesKey": "optional-roles-key",
"SubjectKey": "optional-subject-key"
}
}
}
產生金鑰對
為了為您的 OpenSearch 網域設定 JWTs,您需要以隱私權增強郵件 (PEM) 格式提供公有金鑰。Amazon OpenSearch Service 目前在使用 JWTs時支援兩種非對稱加密演算法:RSA 和 ECDSA。
若要使用通用 openssl 程式庫建立 RSA 金鑰對,請遵循下列步驟:
-
openssl genrsa -out privatekey.pem 2048 -
openssl rsa -in privatekey.pem -pubout -out publickey.pem
在此範例中, publickey.pem 檔案包含用於 Amazon OpenSearch Service 的公有金鑰,而 privatekey.pem包含用於簽署傳送至服務的 JWTs的私有金鑰。此外,如果您需要私有金鑰來產生 JWTs,您可以選擇將私有金鑰轉換為常用pkcs8格式。
如果您使用上傳按鈕將 PEM 檔案直接新增至主控台,則檔案必須具有.pem副檔名、其他副檔名,例如 .crt.cert或 目前.key不受支援。