除了內建檔案式和 LDAP 式認證機制,Message Queue 也支援 Java 認證與授權服務 (JAAS),可讓您將各種服務外掛到代理程式,以認證 Message Queue 用戶端。本節說明代理程式提供給 JAAS 相容認證服務的資訊,並說明如何配置代理程式使用這類服務。
JAAS API 不在本文件的論述範疇內。如需瞭解更多資訊,請參閱下列資訊來源。
如需有關 JAAS API 的完整資訊,請參閱「Java Authentication and Authorization Service (JAAS) Reference Guide」。
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/JAASRefGuide.html
如需有關撰寫 LoginModule 的資訊,請參閱「Java Authentication and Authorization Service (JAAS) LoginModule Developer's Guide」。
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/JAASLMDevGuide.html
JAAS API 是 J2SE 的核心 API,因此是 Message Queue 執行階段環境不可或缺的一部分。JAAS 會在應用程式與認證機制之間定義一個抽象層,允許外掛所需的機制,而無須變更應用程式的程式碼。對於 Message Queue 服務而言,此抽象層位於代理程式 (應用程式) 與認證提供者之間。藉由設定某些代理程式特性,可以在不中斷或變更代理程式的程式碼情況下,外掛任何 JAAS 相容認證服務並升級此服務。
若使用 JAAS 式認證,便可使用 JMX 用戶端管理代理程式,但在啟動代理程式之前,必須手動設定 JAAS 支援 (藉由設定與 JAAS 相關的代理程式特性)。您無法使用 JMX API 變更這些特性。
圖 1–1 說明了 JAAS 的基本元素:JAAS 用戶端、JAAS 相容認證服務與 JAAS 配置檔案。
JAAS 用戶端是需要使用 JAAS 相容認證服務執行認證的應用程式。該用戶端使用 LoginModule 與此服務通訊,並負責提供 LoginModule 可呼叫的回呼處理程式,以取得使用者名稱、密碼與其他相關資訊。
JAAS 相容認證服務包含一或多個 LoginModule,以及執行所需認證的邏輯。LoginModule 可能包含認證邏輯,或可能使用私有通訊協定或 API 與提供該邏輯的模組通訊。
JAAS 配置檔案是文字檔,讓 JAAS 用戶端用來找出與 JAAS 相容服務通訊時所需的 LoginModule。
下一節說明 Message Queue 服務如何使用這些元素,以提供 JAAS 相容認證。
下圖說明 Message Queue 代理程式如何使用 JAAS。該圖說明的 JAAS 模型實作比上圖所示更為複雜。
如同較簡單的範例所示,此認證服務層與代理程式是分開的。認證服務包含一或多個登入模組 (LoginModule),並視需要包含其他認證模組。執行登入模組的 Java 虛擬機器與執行代理程式的 Java 虛擬機器相同。Message Queue 代理程式被登入模組視為 LogInContext,並藉由屬於代理程式執行階段程式碼的 CallBackHandler 與登入模組通訊。
認證服務也提供 JAAS 配置檔案 (包含登入模組的項目)。配置檔案會指定使用模組的順序,以及某些使用條件。啟動代理程式時,JAAS 會依 Java 系統特性 java.security.auth.login.config 或 Java 安全性特性檔案找出配置檔案。接著會根據代理程式特性 imq.user_repository.jaas.name 的值,選取 JAAS 配置檔案中的項目。此項目會指定認證將使用的登入模組。如圖所示,代理程式可使用多個登入模組。(圖 1–3 說明了配置檔案與登入模組以及代理程式之間的關係。)
Message Queue 用戶端完全不會感受到代理程式使用 JAAS 外掛認證服務。用戶端會如同往常繼續連線至代理程式,並傳遞使用者名稱與密碼。而代理程式會使用回呼處理程式將此資訊傳遞至認證服務,再由服務使用該資訊認證使用者並傳回結果。認證一旦成功,代理程式便會授權連線;如果失敗,用戶端執行階段會傳回用戶端必須處理的 JMS 安全性異常。
Message Queue 用戶端經過認證之後,如果需要進一步的授權,則代理程式會如同往常進行;它會參考存取控制檔案,決定是否授權已認證的用戶端以執行所負責的動作:存取目標、使用訊息、瀏覽佇列等。
設定 JAAS 相容認證的步驟,包含設定代理程式和系統特性以選取此認證類型、指定配置檔案的位置,以及指定將使用的登入模組項目。
本節說明 JAAS 用戶端、登入模組以及 JAAS 配置檔案之間如何相互關聯,接著說明設定 JAAS 相容認證所需的程序。下圖說明配置檔案、登入模組與代理程式之間的關係。
如圖所示,JAAS 配置檔案 MyJAASCFile.config 包含數個登入模組的參照,共同組成一個進入點。代理程式會藉由查詢 Java 系統特性 java.security.auth.login.config 或 Java 安全性特性檔案,以找出配置檔案。決定要使用的登入模組時須查詢代理程式特性 imq.user_repository.jaas.name,該特性會指定配置檔案中的所需項目。這些模組的類別位於 lib/ext 目錄中。
若要設定 JAAS 對 Message Queue 的支援,您必須完成下列步驟。(在開發環境中,這些步驟可能是由開發人員完成。在生產環境中,管理員會接管部分此類作業。)
建立可實作認證服務的一或多個登入模組類別。以下列出代理程式支援的 JAAS 回呼類型。
代理程式使用此回呼,將執行代理程式所在的語言環境傳遞給認證服務。此值可用於本土化。
代理程式使用此回呼,將請求連線時由 Message Queue 用戶端所指定的使用者名稱,傳遞至認證服務。
代理程式使用此回呼,在 TextInputCallback.getPrompt() 為 imq.authentication.type 時,將 imq.authentication.type 的值指定給認證服務。現在此欄位唯一可能的值為 basic。這表示 Base-64 密碼編碼。
代理程式使用此回呼,將請求連線時由 Message Queue 用戶端所指定的密碼,傳遞至認證服務。
代理程式使用此回呼將文字輸出記錄到代理程式記錄檔,以提供記錄服務給認證服務。回呼的訊息類型 ERROR、INFORMATION 和 WARNING 分別對映至代理程式的記錄層級 ERROR、INFO 和 WARNING。
建立包含參照登入模組類別之項目的 JAAS 配置檔案,並將此檔案的位置指定給 Message Queue 管理員。(該檔案可位於遠端,並可由 URL 指定其位置。)
記下 JAAS 配置檔案中參照登入實作類別的項目名稱。
將實作登入模組的類別歸檔為 jar 檔案,並將 jar 檔案置於 Message Queue 的 lib/ext 目錄中。
配置與 JAAS 支援相關的代理程式特性。這些特性說明於表 1–2 中。
設定下列系統特性,以指定 JAAS 配置檔案的位置。
java.security.auth.login.config= JAAS_Config_File_Location
例如,您可以在啟動代理程式時指定配置檔案。
imqbrokerd -Djava.security.auth.login.config=JAAS_Config_File_Location
還有其他方法可指定 JAAS 配置檔案的位置。如需其他資訊,請參閱
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/tutorials/LoginConfigFile.html
下表列出設定 JAAS 支援所需的代理程式特性。
表 1–2 JAAS 支援的代理程式特性
特性 |
說明 |
---|---|
imq.authentication.type |
設定為 basic,以表示為 Base-64 密碼編碼。此為 JAAS 認證的唯一允許值。 |
imq.authentication.basic.user_repository |
設定為 jaas,以指定 JAAS 認證。 |
imq.accesscontrol.type |
設定為 file。 |
imq.user_repository.jaas.name |
設定為參照需要用做認證機制之登入模組的所需項目 (位於 JAAS 配置檔案中) 名稱。這是您在步驟 3 中記下的名稱。 |
imq.user_repository.jaas.userPrincipalClass |
此特性由 Message Queue 存取控制所使用,會指定登入模組中的 java.security.Principal 實作類別,讓代理程式用來擷取在 Message Queue 存取控制檔案中表示使用者實體的主體名稱。若未指定,則會改用請求連線時從 Message Queue 用戶端傳遞的使用者名稱。 |
imq.user_repository.jaas.groupPrincipalClass |
此特性由 Message Queue 存取控制所使用,會指定登入模組中的 java.security.Principal 實作類別,讓代理程式用來擷取在 Message Queue 存取控制檔案中表示使用者實體的主體名稱。若未指定,則會忽略 Message Queue 存取控制檔案中的群組規則 (若有的話)。 |