您可透過下列方式管理安全性:配置使用者儲存庫以對使用者進行認證、定義存取控制、配置安全通訊端層 (SSL) 連線服務以對用戶端與代理程式間的通訊進行加密,以及設定用於啟動代理程式的密碼檔案。
本章包含下列各節:
當使用者嘗試連線至代理程式時,此代理程式將檢查使用者提供的名稱和密碼,以便進行認證。如果名稱和密碼與配置每個代理程式要參考的特定代理程式使用者儲存庫中的名稱和密碼相符,則代理程式承認此連線。
您負責維護使用者儲存庫中的使用者清單、使用者群組清單以及使用者密碼清單。您可以在每個代理程式實例使用不同的使用者儲存庫。本節介紹如何建立、寫入和管理儲存庫。
儲存庫可能是下列任一類型:
Message QueueTM 隨附的平面檔案儲存庫
這種類型的使用者儲存庫使用非常容易。您可以使用使用者管理員公用程式 (imqusermgr) 寫入和管理此儲存庫。若要啟用認證,您應在使用者儲存庫中寫入每個使用者的名稱、密碼以及使用者群組名稱。
如需設定與管理使用者儲存庫的更多資訊,請參閱使用平面檔案使用者儲存庫。
LDAP 伺服器
可以是使用 LDAP v2 或 v3 協定之現有或新的 LDAP 目錄伺服器。它不如平面檔案儲存庫易於使用,但是它可延展,因此更適用於生產環境。
如果您要使用 LDAP 使用者儲存庫,可以利用 LDAP 供應商提供的工具來寫入和管理使用者儲存庫。如需更多資訊,請參閱將 LDAP 伺服器用於使用者儲存庫。
Message Queue 提供平面檔案使用者儲存庫和指令行工具,即使用者管理員公用程式 (imqusermgr),您可以使用此工具寫入和管理平面檔案使用者儲存庫。以下各節描述平面檔案使用者儲存庫,以及您如何使用使用者管理員公用程式寫入和管理儲存庫。
平面檔案使用者儲存庫是針對實例的。您啟動的每個代理程式實例,都會自動建立預設的使用者儲存庫 (稱為 passwd)。此使用者儲存庫的所在目錄名稱,與此儲存庫相關聯之代理程式實例名稱相同 (請參閱附錄 AMessage QueueTM 資料的特定平台位置):
…/instances/instanceName/etc/passwd
此儲存庫在建立時就有兩個項目。表 7–1 的每一列表示一個項目。
表 7–1 使用者儲存庫中的初始項目
使用者名稱 |
密碼 |
群組 |
狀態 |
---|---|---|---|
admin |
admin |
admin |
active |
guest |
guest |
anonymous |
active |
這些初始項目可讓 Message Queue 代理程式在安裝之後立即使用,而無需管理員的介入:
初始 admin 使用者項目可讓您使用 imqcmd 指令和預設的 admin 使用者名稱和密碼來管理代理程式實例。您應該更新此初始項目以變更密碼 (請參閱變更預設管理員密碼)。
以下各節介紹如何寫入和管理平面檔案使用者儲存庫。
Message Queue 使用者管理員公用程式 (imqusermgr) 可讓您編輯或寫入平面檔案使用者儲存庫。本節介紹使用者管理員公用程式。後續各節介紹如何使用 imqusermgr 子指令完成特定的工作。
如需 imqusermgr 指令的完整參考資訊,請參閱第 13 章, 指令行參照。
操作使用者管理員之前,請注意以下事項:
如果代理程式專用的使用者儲存庫不存在,您必須啟動對應的代理程式實例來建立儲存庫。
必須在安裝代理程式的主機上執行 imqusermgr 指令。
您必須擁有寫入儲存庫的適當權限:也就是說,在 Solaris 和 Linux 上,您必須是超級使用者或是第一個建立代理程式實例的使用者。
以下各節中的範例均假設為預設的代理程式實例。
imqusermgr 指令有子指令 add、delete、list 和 update。
add 子指令可以將使用者和相關密碼增加到指定的 (或預設的) 代理程式實例儲存庫,並可選擇性指定使用者的群組。子指令語法如下:
add [-i instanceName] -u userName -p passwd [-g group] [ -s]
delete 子指令可以從指定的 (或預設的) 代理程式實例儲存庫刪除指定的使用者。子指令語法如下:
delete [-i instanceName] -u userName [ -s] [-f]
list 子指令可以顯示有關指定的 (或預設的) 代理程式實例儲存庫中,指定的使用者或所有使用者的資訊。子指令語法如下:
list [ -i instanceName] [-u userName]
update 子指令可以更新指定的 (或預設的) 代理程式實例儲存庫中,指定使用者的密碼和 (或) 狀態。子指令語法如下:
update [ -i instanceName] -u userName -p passwd [ -a state] [-s] [ -f]
update [-i instanceName] -u userName -a state [-p passwd] [-s] [-f]
表 7–2 列出了 imqusermgr 指令的選項。
表 7–2 imqusermgr 選項
選項 |
說明 |
---|---|
-a activeState |
指定使用者的狀態是否應為使用中 (true/false)。值 true 表示狀態為使用中。這是預設值。 |
-f |
未經使用者確認即執行動作。 |
-h |
顯示用法說明。不執行指令行上的其他任何指令。 |
-i instanceName |
指定要套用指令的代理程式實例名稱。如果未指定,則使用預設實例名稱 imqbroker。 |
-p passwd |
指定使用者密碼。 |
-g group |
指定使用者群組。有效值為 admin、user 和 anonymous。 |
-s |
設定無訊息模式。 |
-u userName |
指定使用者名稱。 |
-v |
顯示版本資訊。不執行指令行上的其他任何指令。 |
為代理程式實例的使用者儲存庫增加使用者項目時,您可以指定三個預先定義群組中的任一項:admin、user 或 anonymous。如果未指定群組,則預設為指定群組 user。請遵照以下說明指定群組:
admin 群組:用於代理程式管理員。依預設,已指定至此群組的使用者可以配置和管理代理程式。您可以將多個使用者指定給 admin 群組。
user 群組:用於一般 (非管理) Message Queue 用戶端使用者。大多數用戶端使用者屬於 user 群組。依預設,此群組中的使用者可以產生訊息到所有主題與佇列、使用來自所有主題與佇列的訊息,以及瀏覽任何佇列中的訊息。
anonymous 群組:用於不想使用代理程式知道的使用者名稱的 Message Queue 用戶端,可能是因為這些用戶端應用程式不知道應使用的實際使用者名稱。此帳號與大多數 FTP 伺服器中存在的匿名帳號類似。您一次僅可將一個使用者指定給 anonymous 群組。與 user 群組不一樣的是,您應當限制此群組的存取權限,或者應在部署時移除此群組中的使用者。
若要變更使用者的群組,您必須刪除此使用者項目,然後為此使用者增加其他項目,指定新的群組。
您不能將系統建立的群組重新命名或刪除,也不能建立新群組。但是,您可以指定用來定義群組成員可執行作業的存取規則。如需更多資訊,請參閱使用者授權:存取控制特性檔案。
增加使用者至儲存庫時,使用者的狀態預設為使用中。若要讓此使用者變成非使用中狀態,您必須使用更新指令。例如,以下指令可讓使用者 JoeD 的狀態變成非使用中:
imqusermgr update -u JoeD -a false
已變成非使用中使用者的項目會保留在儲存庫中;但是,非使用中的使用者無法開啟新的連線。如果使用者為非使用中,且您新增具有相同名稱的其他使用者,則作業將失敗。您必須刪除非使用中使用者項目或變更新使用者的名稱,或者為新使用者命名其他名稱。這可防止您新增重複的使用者名稱。
使用者名稱中不能包含星號 (*)、逗號 (,)、冒號 (:)、新行或換行字元。
使用者名稱或密碼必須至少包含一個字元。
如果使用者名稱或密碼包含空格,則必須將整個名稱或密碼括在引號內。
密碼或使用者名稱的長度沒有限制,除非指令 shell 對指令行上可輸入的最大字元數有所限制。
使用 add 子指令可增加使用者至儲存庫。例如,以下指令可將使用者 Katharine 和密碼 sesame,增加到預設的代理程式實例使用者儲存庫。
imqusermgr add -u Katharine -p sesame -g user
使用 delete 子指令可從儲存庫刪除使用者。例如,以下指令可刪除使用者 Bob:
imqusermgr delete -u Bob
使用 update 子指令可變更使用者的密碼或狀態。例如,以下指令將 Katharine 的密碼變更為 aladdin:
imqusermgr update -u Katharine -p aladdin
若要列出有關一個或所有使用者的資訊,請使用 list 指令。以下指令顯示名為 isa 的使用者之相關資訊:
imqusermgr list -u isa
% imqusermgr list -u isa User repository for broker instance: imqbroker ---------------------------------- User Name Group Active State ---------------------------------- isa admin true |
以下指令列出所有使用者的相關資訊:
imqusermgr list
% imqusermgr list User repository for broker instance: imqbroker -------------------------------------- User Name Group Active State -------------------------------------- admin admin true guest anonymous true isa admin true testuser1 user true testuser2 user true testuser3 user true testuser4 user false testuser5 user false |
為了安全性起見,您應將 admin 的預設密碼變更為只有您自己知道的密碼。以下指令將 mybroker 代理程式實例的預設管理員密碼 admin 變更為 grandpoobah。
imqusermgr update mybroker -u admin -p grandpoobah
當代理程式實例正在執行時,您可以透過執行任一指令行工具,以快速確認此變更是否生效。例如,下列指令會提示您提供密碼:
imqcmd list svc mybroker -u admin
輸入新密碼 (grandpoobah) 即生效,輸入舊密碼即失敗。
變更密碼後,使用任一 Message Queue 管理工具 (包括管理主控台) 時,您均應提供新的密碼。
編輯實例配置檔案
設定管理員的存取控制
若要代理程式使用目錄伺服器者,請在代理程式實例配置檔案 config.properties 中設定一些特性值。當使用者嘗試連線至代理程式實例或執行訊息傳送作業時,這些特性可讓代理程式實例查詢 LDAP 伺服器,以取得使用者和群組的相關資訊。
…/instances/instanceName /props/config.properties
如需作業系統專用的實例目錄位置之詳細資訊,請參閱附錄 AMessage QueueTM 資料的特定平台位置。
透過設定以下特性,以指定您要使用 LDAP 使用者儲存庫:
imq.authentication.basic.user_repository=ldap |
設定 imq.authentication.type 特性,以確定密碼應以 Base64 編碼 (basic) 還是以 MD5 編碼 (digest),從用戶端傳送至代理程式。將 LDAP 目錄伺服器用於使用者儲存庫時,您必須將認證類型設定為 basic。例如:
imq.authentication.type=basic |
您還必須設定可控制 LDAP 存取的代理程式特性。這些特性儲存在代理程式的實例配置檔案中。安全性服務中討論這些特性,安全性特性中也有摘要。
Message Queue 使用 JNDI API 與 LDAP 目錄伺服器通訊。如需這些特性中所參考之語法和專有名詞的更多資訊,請參閱 JNDI 文件。Message Queue 使用 Sun JNDI LDAP 提供者和簡單認證。
Message Queue 支援 LDAP 認證容錯移轉:您可以指定在進行認證時嘗試使用的 LDAP 目錄伺服器之清單 (請參閱 imq.user.repos.ldap.server 特性的參考資訊)。
如需 LDAP 使用者儲存庫相關特性的設定範例,請參閱代理程式的 config.properties 檔案。
如有必要,您需要編輯存取控制特性檔案中的使用者/群組和規則。如需使用存取控制特性檔案的更多資訊,請參閱使用者授權:存取控制特性檔案。
如果在連線認證和群組搜尋期間,您要讓代理程式透過 SSL 與 LDAP 目錄伺服器通訊,則需要啟動 LDAP 伺服器中的 SSL,然後在代理程式配置檔案中設定以下特性:
指定 LDAP 伺服器用於 SSL 通訊的連接埠。例如:
imq.user_repository.ldap.server=myhost:7878 |
將代理程式特性 imq.user_repository.ldap.ssl.enabled 設為 true。
部署多台 LDAP 目錄伺服器時,請使用 ldap:// 指定其他每一台目錄伺服器。例如:
imq.user_repository.ldap.server = myHost:7878 ldap:// otherHost:7878 …
以空格分隔每一台目錄伺服器。清單中的所有目錄伺服器必須使用相同的值,以供其他與 LDAP 相關的特性使用。
若要建立管理使用者,您可以使用存取控制特性檔案,指定可以建立 ADMIN 連線的使用者和群組。這些使用者和群組必須預先在 LDAP 目錄中定義。
任何使用者或群組只要能夠建立 ADMIN 連線,即可下達管理指令。
將代理程式特性 imq.accesscontrol.enabled 設定為 true 預設值,啟用存取控制檔案。
imq.accesscontrol.enabled 特性可以啟用存取控制檔案。
開啟存取控制檔案 accesscontrol.properties。附錄 AMessage QueueTM 資料的特定平台位置 中會列出此檔案的位置。
此檔案包含一個項目,如下所示:
service connection access control##################################connection.NORMAL.allow.user=*connection.ADMIN.allow.group=admin
列出的項目僅為範例。請注意檔案式使用者儲存庫中有 admin 群組,但是依預設,LDAP 目錄中沒有此群組。您必須將 LDAP 目錄中已定義的群組名稱,替換為要授予 Message Queue 管理員權限的群組名稱。
若要將 Message Queue 管理員權限授予使用者,請如下所示,輸入使用者名稱:
connection.ADMIN.allow.user= userName[[,userName2] …]
若要將 Message Queue 管理員權限授予群組,請如下所示,輸入群組名稱:
connection.ADMIN.allow.group= groupName[[,groupName2] …]
存取控制特性檔案 (ACL 檔案) 包含的規則,指定使用者和群組使用者可以執行的作業。您可以編輯 ACL 檔案,限制某些使用者和群組執行作業。您可以在每個代理程式實例使用不同的 ACL 檔案。
無論使用者資訊放在平面檔案使用者儲存庫中還是放在 LDAP 使用者儲存庫中,均可使用 ACL 檔案。當用戶端應用程式執行以下作業時,代理程式會檢查其 ACL 檔案:
建立連線
建立產生器
建立用戶
瀏覽佇列
代理程式會檢查 ACL 檔案,判斷提出請求的使用者或該使用者所屬的群組,是否已有執行此作業的授權。
如果您編輯 ACL 檔案,新的設定會在下次代理程式檢查檔案以驗證授權時生效。您編輯此檔案後,不需要重新啟動代理程式。
不同實例有不同的 ACL 檔案。每次啟動代理程式實例時,會在實例目錄中建立預設檔案 accesscontrol.properties。此檔案的路徑格式如下 (請參閱附錄 AMessage QueueTM 資料的特定平台位置):
…/instances/brokerInstanceName/etc/accesscontrol.properties
ACL 檔案的格式與 Java 特性檔案的格式類似。先定義檔案的版本,然後分三部分指定存取控制規則:
連線存取控制
實體目標存取控制
實體目標自動建立存取控制
version 特性定義 ACL 特性檔案的版本;您不能變更此項目。
version=JMQFileAccessControlModel/100
以下說明存取規則的基本語法並介紹如何計算權限,之後描述可指定存取控制規則的 ACL 檔案三部分。
在 ACL 特性檔案中,存取控制會定義特定使用者或群組對受保護的資源 (如實體目標和連線服務) 擁有何種存取權。存取控制由一條或一組規則表示,每條規則皆以 Java 特性表示:
這些規則的基本語法如下:
resourceType.resourceVariant .operation.access. principalType=principals
表 7–3 描述了語法規則的元素。
表 7–3 存取規則的語法元素
元素 |
說明 |
---|---|
resourceType |
下列其中一項:connection、queue 或 topic。 |
resourceVariant |
resourceType 指定的類型實例。例如,myQueue。您可使用萬用字元符號 (*) 來表示所有連線服務類型或所有實體目標。 |
operation |
值取決於要制定的存取規則種類。 |
access |
下列其中一項:allow 或 deny。 |
principalType |
下列其中一項:user 或 group。如需更多資訊,請參閱群組。 |
principals |
可以擁有在規則左側所指定存取權的使用者。如果 principalType 為 user,則此項可以為個別使用者或使用者清單 (以逗號分隔);如果 principalType 為 group,則此項可以為單一群組或群組清單 (以逗號分隔的清單)。您可使用萬用字元符號 (*) 來表示所有使用者或所有群組。 |
以下為存取規則的一些範例:
以下規則表示任何使用者均可以將訊息傳送至名為 q1 的佇列。
queue.q1.produce.allow.user=*
以下規則表示任何使用者均可以將訊息傳送至任何佇列。
queue.*.produce.allow.user=*
若要指定非 ASCII 的使用者、群組或目標名稱,請使用 Unicode 換碼 (\\uXXXX) 表示法。如果您已經編輯並儲存具有非 ASCII 編碼名稱的 ACL 檔案,則可以使用 Java native2ascii 工具將其轉換為 ASCII。如需更多詳細資訊,請至
http://java.sun.com/j2se/1.4/docs/guide/intl/faq.html
特定存取規則置換一般存取規則。套用以下兩條規則之後,所有使用者均可以將訊息傳送至所有佇列,但是 Bob 卻無法將訊息傳送至 tq1。
queue.*.produce.allow.user=* queue.tq1.produce.deny.user=Bob
賦予明確 principal 的存取權會置換賦予 * principal 的存取權。以下規則拒絕 Bob 產生訊息傳給 tq1,但允許其他所有使用者執行這項作業。
queue.tq1.produce.allow.user=* queue.tq1.produce.deny.user=Bob
用於使用者的 * principal 規則置換用於群組的相應 * principal 規則。例如,以下兩條規則允許所有認證使用者將訊息傳送至 tq1。
queue.tq1.produce.allow.user=* queue.tq1.produce.deny.group=*
授予使用者的存取權會置換授予使用者群組的存取權。在下列範例中,即使 Bob 是 User 成員,也無法產生訊息傳給 tq1。User 的所有其他成員皆可執行這項作業。
queue.tq1.produce.allow.group=User queue.tq1.produce.deny.user=Bob
任何未透過存取規則明確授予的存取權限,都會遭到隱式拒絕。例如,如果 ACL 檔案不包含存取規則,則所有使用者都無法執行所有作業。
相同使用者或群組的拒絕和允許權限會相互抵銷。例如,以下兩條規則導致 Bob 無法瀏覽 q1:
queue.q1.browse.allow.user=Bob queue.q1.browse.deny.user=Bob
以下兩條規則導致 User 群組無法使用 q5 的訊息。
queue.q5.consume.allow.group=User queue.q5.consume.deny.group=User
當存在多條相同的左側規則時,只有最後一項生效。
ACL 特性檔案中的連線存取控制區段,包含用於代理程式連線服務的存取控制規則。連線存取控制規則的語法如下:
connection.resourceVariant. access.principalType= principals
resourceVariant 定義有兩個值:NORMAL 和 ADMIN。您只能授權存取這些連線服務類型的預定值。
預設 ACL 特性檔案授權所有使用者存取 NORMAL 連線服務,並授權 admin 群組中的使用者存取 ADMIN 連線服務:
connection.NORMAL.allow.user=* connection.ADMIN.allow.group=admin
如果您使用檔案式的使用者儲存庫,使用者管理員公用程式會建立預設群組 admin。如果您使用 LDAP 使用者儲存庫,只要執行下列一項作業即可使用預設 ACL 特性檔案:
在 LDAP 目錄中定義 admin 群組。
將 ACL 特性檔案中的 admin 名稱,換成 LDAP 目錄中已定義的一個或多個群組名稱。
您可以限制連線存取權限。例如,以下規則拒絕 Bob 存取 NORMAL,但是允許其他所有使用者進行存取:
connection.NORMAL.deny.user=Bob connection.NORMAL.allow.user=*
您可以使用星號 (*) 字元代表所有認證使用者或群組。
對於檔案式使用者儲存庫和 LDAP 使用者儲存庫,使用 ACL 特性檔案授權存取 ADMIN 連線的方式有下列不同:
LDAP 使用者儲存庫。 如果您使用 LDAP 使用者儲存庫,請執行下列所有作業:
啟用存取控制。
編輯 ACL 檔案,並提供可以建立 ADMIN 連線的使用者或群組名稱。指定 LDAP 目錄伺服器中已定義的任何使用者或群組。
存取控制特性檔案的目標存取控制區段,包含實體目標型的存取控制規則。這些規則決定何人 (使用者/群組) 可以在何處 (實體目標) 做什麼 (作業)。這些規則所規定的存取權類型包括:將訊息傳送至佇列、將訊息發佈至主題、接收來自佇列的訊息、訂閱主題以及瀏覽佇列中的訊息。
依預設,任何使用者或群組對任何實體目標都擁有所有類型的存取權。您可以新增更多特定的目標存取規則,或編輯預設規則。本節的其餘部分介紹實體目標存取規則的語法,您必須理解此語法以編寫自己的規則。
目標規則的語法如下:
resourceType.resourceVariant.operation.access.principalType=principals
表 7–4 中有這些元素的描述:
表 7–4 實體目標存取控制規則的元素
元件 |
說明 |
---|---|
resourceType |
可以是 queue 或 topic。 |
resourceVariant |
某一個實體目標名稱;或所有的實體目標 (*),表示所有佇列或所有主題。 |
operation |
可以是 produce、consume 或 browse。 |
access |
可以是 allow 或 deny。 |
principalType |
可以是 user 或 group。 |
可以將存取權賦予一個或多個使用者和 (或) 一個或多個群組。
以下範例說明了不同種類的實體目標存取控制規則:
允許所有使用者將訊息傳送至任何佇列目標。
queue.*.produce.allow.user=*
拒絕群組 user 的任何成員訂閱主題 Admissions。
topic.Admissions.consume.deny.group=user
ACL 特性檔案最後部分的存取規則,可以指定代理程式將為哪些使用者和群組自動建立實體目標。
當使用者在並不存在的實體目標上建立產生器或用戶時,如果已啟用代理程式的自動建立特性,則代理程式將會建立此目標。
依預設,任何使用者或群組均有權讓代理程式自動建立實體目標。此權限由以下規則指定:
queue.create.allow.user=* topic.create.allow.user=*
您可以編輯 ACL 檔案以限制此類型的存取權。
實體目標自動建立存取規則的一般語法如下:
resourceType.create.access.principalType=principals
其中 resourceType 為 queue 或 topic。
例如,以下規則可讓代理程式為所有使用者 (除 Snoopy 之外) 自動建立主題目標。
topic.create.allow.user=* topic.create.deny.user=Snoopy
請注意,實體目標自動建立規則的效果必須與實體目標存取規則的效果一致。例如,如果您 1) 變更目標存取規則,以禁止任何使用者將訊息傳送至目標,但是 2) 啟用目標的自動建立功能,如果此目標不存在,則代理程式將會建立此實體目標,但不會將訊息傳送至此目標。
本節說明如何設定以安全通訊端層 (SSL) 標準為基礎的連線服務,在用戶端和代理程式之間傳送加密訊息。Message Queue 支援下列 SSL 型連線服務:
ssladmin 服務使用 TCP/IP 傳輸協定,在 Message Queue 指令公用程式 (imqcmd) 和代理程式之間建立安全、加密的連線。管理主控台 (imqadmin) 不支援加密的連線。
httpsjms 服務使用 HTTPS 通道 Servlet 和 HTTP 傳輸協定,在用戶端和代理程式之間傳送安全、加密的訊息。
本節後續部分說明如何使用 ssljms、ssladmin 和 cluster 連線服務,透過 TCP/IP 設定安全連線。如需有關使用 httpsjms 服務,透過 HTTP 設定安全連線的詳細資訊,請參閱附錄 CHTTP/HTTPS 支援。
若要透過 TCP/IP 使用 SSL 型連線服務,您必須使用金鑰工具公用程式 (imqkeytool) 產生公開/私密金鑰對。此公用程式將公開金鑰內嵌於自我簽署的憑證中,此憑證將傳送至請求與代理程式連線的用戶端,此用戶端使用此憑證設定加密連線。本節描述如何使用此類自我簽署的憑證,設定 SSL 型服務。
若要提高認證層級,您可以使用憑證授權單位驗證的簽署憑證。相較於自我簽署的憑證,使用簽署憑證需要更多必要步驟。您必須先執行本節所述的步驟,接著執行使用簽署的憑證中的額外步驟。
Message Queue 支援具有自我簽署憑證的 SSL,會認為用戶端正與已知並可信任的伺服器通訊,而保護所傳送的資料。下列程序說明使用自我簽署的憑證設定 SSL 型連線服務的必要步驟。後續小節會詳細說明每個步驟。
產生自我簽署的憑證。
啟用代理程式中的 ssljms、ssladmin 或 cluster 連線服務。
啟動代理程式。
配置並執行用戶端。
這個步驟僅適用於 ssljms 連線服務,不適用於 ssladmin 或 cluster。
執行金鑰工具公用程式 (imqkeytool),為代理程式產生自我簽署的憑證。(在 UNIX® 系統上,需要以超級使用者 (root) 的身份執行此公用程式,才擁有建立金鑰庫的權限。)相同的憑證可用於 ssljms、ssladmin 或 cluster 連線服務。
imqkeytool -broker
金鑰工具公用程式會提示您輸入金鑰庫密碼。
Generating keystore for the broker ... Enter keystore password:
接著,公用程式會提示您輸入憑證所屬代理程式的識別資訊。您提供的資訊會組成 X.500 辨別名稱。表 7–5 顯示提示以及提供給每個提示的值。這些值不區分大小寫,而且可以包含空格。
表 7–5 自我簽署憑證所需之識別名稱資訊
提示 |
X.500 屬性 |
說明 |
範例 |
---|---|---|---|
What is your first and last name? |
commonName (CN) |
執行代理程式的伺服器之完全合格的名稱 |
mqserver.sun.com |
What is the name of your organizational unit? |
organizationalUnit (OU) |
部門名稱 |
purchasing |
What is the name of your organization? |
organizationName (ON) |
較大的組織名稱,例如公司或政府實體。 |
My Company, Inc. |
What is the name of your city or locality? |
localityName (L) |
城市或所在地名稱 |
San Francisco |
What is the name of your state or province? |
stateName (ST) |
州或省的全名 (不使用縮寫) |
California |
What is the two-letter country code for this unit? |
country (C) |
標準的雙字母國家代碼 |
US |
輸入完畢後,金鑰工具公用程式會顯示您輸入的資訊,請您確認。例如:
Is CN=mqserver.sun.com, OU=purchasing, ON=My Company, Inc., L=San Francisco, ST=California, C=US correct?
若要接受目前的值並繼續執行,請輸入 yes;若要重新輸入這些值,請接受預設值或輸入 no。您確認後,此公用程式會產生金鑰對並暫停其他作業。
接著,公用程式會要求您提供用於鎖定金鑰對的密碼 (即金鑰密碼)。看到此提示請按下 Return 鍵,表示金鑰密碼與金鑰庫密碼相同。
請記住您指定的密碼。啟動代理程式時必須提供此密碼,代理程式才能開啟金鑰庫。您可以在密碼檔案中儲存金鑰庫密碼 (請參閱密碼檔案)。
金鑰工具公用程式會產生自我簽署的憑證,並將其放置在 Message Queue 的金鑰庫中。金鑰庫所在目錄取決於作業系統,請參閱附錄 AMessage QueueTM 資料的特定平台位置。
以下是 SSL 型連線服務之 Message Queue 金鑰庫的可配置特性:
imq.keystore.file.dirpath:包含金鑰庫檔案之目錄的路徑。如需預設值,請參閱附錄 AMessage QueueTM 資料的特定平台位置。
有時您可能需要重新產生金鑰對,以解決某些問題:例如,您忘記了金鑰庫密碼,或者啟動代理程式時, SSL 型服務無法初始化,並且您遇到以下異常:
java.security.UnrecoverableKeyException:Cannot recover key
(如果在產生自我簽署的憑證時,所提供的金鑰密碼與金鑰庫密碼不同,則可能導致此異常。)
移除代理程式的金鑰庫,其位置如附錄 AMessage QueueTM 資料的特定平台位置中所示。
重新執行 imqkeytool 以產生新的金鑰對,如上所述。
若要在代理程式中啟用 SSL 型連線服務,您需要將 ssljms (或 ssladmin) 增加到 imq.service.activelist 特性。
開啟代理程式的實例配置檔案。
實例配置檔案的所在目錄名稱,與此配置檔案相關聯之代理程式實例名稱 (instanceName) 相同 (請參閱附錄 AMessage QueueTM 資料的特定平台位置):
.../instances/instanceName/props/config.properties
增加表示 imq.service.activelist 特性的項目 (如果項目尚未存在),並將所需的 SSL 型服務納入清單。
依預設,此特性包括 jms 和 admin 連線服務。增加 SSL 型服務或您要啟動的服務 (ssljms、ssladmin,或兩者):
imq.service.activelist=jms,admin,ssljms,ssladmin
請使用 imq.cluster.transport 特性啟用 SSL 型 cluster 連線服務,而非使用 imq.service.activelist 特性;請參閱連線代理程式。
儲存並關閉實例配置檔案。
啟動代理程式,提供金鑰庫密碼。您可以透過以下任何一種方法提供密碼:
允許代理程式在啟動時提示您提供密碼:
imqbrokerd Please enter Keystore password:
將密碼放在密碼檔案中,如密碼檔案中所述。然後設定特性 imq.passfile.enabled = true,並執行下列其中一項作業:
將密碼檔案的位置傳送給 imqbrokerd 指令:
imqbrokerd -passfile /passfileDirectory/passfileName
啟動代理程式時,不使用 --passfile 選項,而是透過以下兩個代理程式配置特性來指定密碼檔案的位置:
imq.passfile.dirpath=/passfileDirectory imq.passfile.name=passfileName
啟動使用 SSL 的代理程式或用戶端時,CPU 使用率可能在幾秒鍾內劇增。這是因為 Message Queue 使用 JSSE (Java Secure Socket Extension) 方法 java.security.SecureRandom 產生隨機數字,此方法建立初始隨機數種子要佔用大量時間。建立種子之後,CPU 使用率會降至正常。
將用戶端配置為使用 SSL 型連線服務的程序, 根據其為應用程式用戶端 (使用 ssljms 連線服務) 還是 Message Queue 管理用戶端 (例如使用 ssladmin 連線服務的 imqcmd) 而有所不同。
針對應用程式用戶端,您必須確保用戶端在其 CLASSPATH 變數中已指定下列 .jar 檔案:
imq.jar
jms.jar
如果您使用 1.4 版之前的 Java 2 Software Development Kit (J2SDK),也必須包含下列 Java Secure Socket Extension (JSSE) 和 Java Naming and Directory Interface (JNDI) .jar 檔案:
jsse.jar
jnet.jar
jcert.jar
jndi.jar
(如果您使用 J2SDK 1.4 或更新版本,因為已內建 JSSE 和 JNDI 支援,則不需要包含這些檔案。)
正確指定 CLASSPATH 檔案後,請啟動用戶端並將其連線至代理程式的 ssljms 連線服務,完成此作業的方法之一是輸入以下指令:
java -DimqConnectionType=TLS clientAppName
如此可告知連線使用 SSL 型連線服務。
針對管理用戶端,您可以透過在呼叫 imqcmd 指令時加入 -secure 選項,來建立安全連線:例如:
imqcmd list svc -b hostName:portNumber -u adminName -secure
其中 adminName 是 Message Queue 使用者儲存庫中的有效項目。此指令會提示您輸入密碼。(如果您使用平面檔案儲存庫,請參閱變更預設管理員密碼)。
列出連線服務是驗證 ssladmin 服務正在執行的一種方法,也可以驗證是否能成功建立安全的管理連線,如下所示:
Listing all the services on the broker specified by: Host Primary Port localhost 7676 Service Name Port Number Service State admin 33984 (dynamic) RUNNING httpjms - UNKNOWN httpsjms - UNKNOWN jms 33983 (dynamic) RUNNING ssladmin 35988 (dynamic) RUNNING ssljms dynamic UNKNOWN Successfully listed services. |
簽署憑證提供的伺服器認證,比自我簽署憑證的伺服器認證更安全。您只能在用戶端和代理程式之間 (不能在叢集的多個代理程式之間) 實作簽署憑證。除了上述配置自我簽署憑證所需步驟之外,您還需要執行下列額外的步驟。後續小節會詳細說明這些步驟。
下列程序說明如何取得並安裝簽署的憑證。
使用 J2SE keytool 指令,為您在上節中產生的自我簽署憑證,產生憑證簽署請求 (CSR)。
下列網站提供有關 keytool 指令的資訊:
http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html
範例:
keytool -certreq -keyalg RSA -alias imq -file certreq.csr -keystore /etc/imq/keystore -storepass myStorePassword |
這會產生 CSR,將憑證封裝在指定的檔案中 (此範例中的 certreq.csr )。
使用 CSR 產生或請求簽署的憑證。
您可以使用下列方法之一:
請 Thawte 或 Verisign 等知名的憑證授權單位 (CA) 簽署憑證。如需如何執行此作業的詳細資訊,請參閱您的 CA 文件。
使用 SSL 簽署套裝軟體,自行簽署憑證。
簽出的憑證是一串 ASCII 字元。如果您收到 CA 簽署的憑證,它可能是一個電子郵件附件或是郵件中的文字。
將簽署的憑證儲存在檔案中。
以下說明中,使用 broker.cer 範例名稱來代表代理程式憑證。
檢查 J2SE 依預設是否支援您的憑證授權單位。
以下指令會列出系統金鑰庫中的根 CA:
keytool -v -list -keystore $JAVA_HOME/lib/security/cacerts
如果有列出您的 CA,請跳過下一個步驟。
如果 J2SE 未支援您的憑證授權單位,請將 CA 的根憑證匯入 Message Queue 金鑰庫中。
範例:
keytool -import -alias ca -file ca.cer -noprompt -trustcacerts -keystore /etc/imq/keystore -storepass myStorePassword
其中 ca.cer 檔案包含 CA 提供的根憑證。
如果您使用 CA 測試憑證,可能需要匯入測試 CA 根憑證。您的 CA 應該會指示如何取得該憑證的副本。
將簽署的憑證匯入金鑰庫中,替代原始的自我簽署憑證。
範例:
keytool -import -alias imq -file broker.cer -noprompt -trustcacerts -keystore /etc/imq/keystore -storepass myStorePassword
broker.cer 是您從 CA 獲得的簽署憑證所在的檔案。
現在 Message Queue 金鑰庫包含簽署憑證,可用於 SSL 連線。
現在您必須配置 Message Queue 用戶端執行階段以請求簽署的憑證,並確保用戶端信任簽署此憑證的憑證授權單位。
將連線工廠的 imqSSLIsHostTrusted 屬性設定為 false。
依預設,用戶端將用來建立代理程式連線的連線工廠物件之 imqSSLIsHostTrusted 屬性設定為 true,這表示用戶端執行階段會接受所出示的任何憑證。您必須將此值變更為 false,讓用戶端執行階段嘗試驗證所出示的所有憑證。如果憑證簽署者未出現在用戶端的信任清單存放區,驗證便會失敗。
驗證簽署的授權單位是否已在用戶端的信任清單存放區中註冊。
若要測試用戶端是否會接受您的憑證授權單位所簽署的憑證,請嘗試建立 SSL 連線,如上節配置並執行 SSL 型用戶端中所述。如果 CA 列在用戶端的信任存放區中,連線便會成功,您可以跳過下一個步驟。如果連線失敗出現憑證驗證錯誤,請執行下一個步驟。
在用戶端的信任存放區中安裝簽署 CA 的根憑證。
依預設,用戶端會搜尋金鑰庫檔案 cacerts 和 jssecacerts,因此如果憑證安裝在以上其中一個檔案中,便不需要進一步配置。下列範例會將來自 Verisign 憑證授權單位,檔名為 testrootca.cer 的測試根憑證檔案,安裝到預設系統憑證檔案 cacerts 。此範例假設 J2SE 安裝在 $JAVA_HOME/usr/j2se 目錄中:
keytool -import -keystore /usr/j2se/jre/lib/security/cacerts -alias VerisignTestCA -file testrootca.cer -noprompt -trustcacerts -storepass myStorePassword
建議使用的替代選項,是將根憑證安裝到替代系統憑證檔案 jssecacerts:
keytool -import -keystore /usr/j2se/jre/lib/security/jssecacerts -alias VerisignTestCA -file testrootca.cer -noprompt -trustcacerts -storepass myStorePassword
第三個可能方法是將根憑證安裝到其他金鑰庫檔案中,並且配置用戶端將其視為信任存放區。下列範例會安裝到 /home/smith/.keystore 檔案中:
keytool -import -keystore /home/smith/.keystore -alias VerisignTestCA -file testrootca.cer -noprompt -trustcacerts -storepass myStorePassword
由於用戶端依預設不會搜尋此金鑰庫,因此您必須明確向用戶端提供此位置作為信任存放區。若要執行這項操作,請在用戶端執行時,設定 Java 系統特性 javax.net.ssl.trustStore:
javax.net.ssl.trustStore=/home/smith/.keystore
有些類型的指令需要密碼。表 7–6 中的第一欄列出需要密碼的指令,第二欄列出需要密碼的原因。
表 7–6 使用密碼的指令
指令 |
用途 |
密碼的用途 |
---|---|---|
imqbrokerd |
啟動代理程式 |
存取 JDBC 型永久性資料存放區、SSL 憑證金鑰庫或 LDAP 使用者儲存庫 |
imqcmd |
管理代理程式 |
認證已授權使用指令之管理使用者 |
imqdbmgr |
管理 JDBC 型資料存放區 |
存取資料存放區 |
您可以在密碼檔案中指定這些密碼,並且使用 -passfile 選項來指定檔案名稱。下面是 -passfile 選項的格式:
imqbrokerd -passfile myPassfile
您可以在舊版的指令行中使用 -p、-password 、-dbpassword 和 -ldappassword 選項來指定密碼。但是這些選項已經被停用,將從未來的版本中移除。在目前的版本中,指令行中這些選項的任一值,會取代密碼檔案中相關的值。
除非別人可以看到您的監視器,否則遵照提示以互動式方法指定密碼是最安全的指定密碼方法。您也可以從指令行指定密碼檔案。但若使用非互動式指令,就必須使用密碼檔案。
密碼檔案沒有加密,您必須設定權限以防止無權限者存取此檔案。設定權限來限制哪些使用者檢視檔案,但是允許啟動代理程式的使用者讀取此檔案。
密碼檔案是純文字檔,包含一組特性和值。每一個值是指令使用的密碼。
密碼檔案可以包含表 7–7 中所示密碼:
表 7–7 密碼檔案中的密碼
Message Queue 產品提供密碼檔案範例。有關此範例檔案的位置,請參閱附錄 AMessage QueueTM 資料的特定平台位置。
當用戶端應用程式和代理程式之間被防火牆分隔時,需要採取特殊措施來建立連線。一個方法是使用 httpjms 或 httpsjms 連線服務,在防火牆中「打出通道」;如需詳細資訊,請參閱附錄 CHTTP/HTTPS 支援。不過 HTTP 連線比起其他連線服務較慢;較快速的替代方式是略過 Message Queue 連接埠對映器,並明確指定靜態連接埠位址給所需的連線服務,然後在防火牆開啟此特定的連接埠。這個方法可以使用 jms 或 ssljms 連線服務 (或在不尋常的狀況下,使用 admin 或 ssladmin),透過防火牆連線。
表 7–8 靜態連接埠位址的代理程式配置特性
連線服務 |
配置特性 |
---|---|
jms |
imq.jms.tcp.port |
ssljms |
imq.ssljms.tls.port |
admin |
imq.admin.tcp.port |
ssladmin |
imq.ssladmin.tls.port |
將靜態連接埠位址指派給要使用的連線服務。
若要略過連接埠對映器,並將靜態連接埠號直接指定給連線服務,請設定代理程式配置特性 imq.serviceName. protocolType.port,其中 serviceName 為連線服務名稱,protocolType 為協定類型 (請參閱表 7–8)。如同所有代理程式配置特性,您可以在代理程式的實例配置檔案中指定此特性,或在啟動代理程式時從指令行指定此特性。例如,若要將連接埠號 10234 指派給 jms 連線服務,請在配置檔案中併入下列指令行
imq.jms.tcp.port=10234
或使用下列指令啟動代理程式
imqbrokerd -name myBroker -Dimq.jms.tcp.port=10234
配置防火牆以允許連線至指派給連線服務的連接埠號。
您也必須允許透過防火牆連線至 Message Queue 的連接埠對映器連接埠 (通常是 7676,除非已重新指定連接埠對映器使用其他連接埠)。例如,在以上範例中,您必須針對連接埠 10234 和 7676 開啟防火牆。
Message Queue 僅在 Enterprise Edition 版本支援稽核記錄。啟用稽核記錄後,Message Queue 會記錄下列類型的事件:
啟動、關機、重新啟動及移除代理程式實例
使用者認證和授權
重設永久性存放區
建立、清除及銷毀實體目標
管理長期訂閱者銷毀
若要將稽核記錄記入 Message Queue 代理程式記錄檔,請將 imq.audit.enabled 代理程式特性設定為 true。記錄檔中的所有稽核記錄都有關鍵字 AUDIT。