使用 MFT 使用者沙盤推演
您可以根據要求傳送的 MQMD 使用者名稱,限制可來回傳送檔案的檔案系統區域。
當代理程式是通訊協定橋接器代理程式或 Connect:Direct® 橋接器代理程式時,不支援使用者沙盤推演。
userSandboxes=true有了這項內容並設為 true 時,代理程式就會使用 MQ_DATA_PATH/mqft/config/coordination_qmgr_name/agents/agent_name/UserSandboxes.xml 檔案中的資訊,來決定要求傳送的使用者可以存取檔案系統的哪些部分。UserSandboxes.xml XML 包含的 <agent> 元素含有零個以上 <sandbox> 元素。 這些元素說明哪些規則適用於哪些使用者。 <sandbox> 元素的 user 屬性是一種型樣,用來比對提交要求的 MQMD 使用者。
代理程式會定期重新載入 UserSandboxes.xml 檔案,因此對該檔案所做的任何有效變更,都會影響代理程式的行為。 預設重新載入間隔是 30 秒。 透過指定 agent.properties 檔案中的代理程式內容 xmlConfigReloadInterval,即可變更此間隔。
如果您指定 userPattern= 屬性或值,則 regex
user 屬性會解譯為 Java 正規表示式。 如需相關資訊,請參閱 MFT 使用的正規表示式。
userPattern=regex
屬性或值,則 user 屬性會解譯為具有下列萬用字元的型樣:- 星號 (*),代表零個以上字元
- 問號 (?) ,正好代表一個字元
會依照該檔案中列出 <sandbox> 元素的順序來執行比對。 只會使用第一個相符項,而忽略該檔案中所有後續可能的相符項。 如果該檔案中指定的 <sandbox> 元素沒有一個符合與傳送要求訊息相關聯的 MQMD 使用者,則傳送時將無法存取檔案系統。 在 MQMD 使用者名稱與 user 屬性之間找到相符項之後,此相符項將識別 <sandbox> 元素內套用至傳送的一組規則。 這組規則用來決定傳送過程中可以讀取或寫入的檔案或資料集。
<read> 元素來識別可讀取的檔案,及指定 <write> 元素來識別可寫入的檔案。 如果您在一組規則中省略了 <read> 或 <write> 元素,即假設與該組規則相關聯的使用者不得執行任何讀取或寫入。<read> 元素必須在 <write> 元素之前, <include> 元素必須在 <exclude> 元素之前。<read> 或 <write> 元素包含一個以上型樣,用來決定沙盤推演中是否存在檔案以及是否可以進行傳送。 請使用 <include> 及 <exclude> 元素來指定這些型樣。 <include> 或 <exclude> 元素的 name 屬性指定比對的型樣。 選用的 type 屬性指定名稱值是檔案或佇列型樣。 如果未指定 type 屬性,代理程式會將此型樣視為檔案或目錄路徑型樣。 例如:
<tns:read>
<tns:include name="/home/user/**"/>
<tns:include name="USER.**" type="queue"/>
<tns:exclude name="/home/user/private/**"/>
</tns:read>代理程式使用 <include> 及 <exclude> name 型樣,決定是否可以讀取或寫入檔案、資料集或佇列。 如果標準檔案路徑、資料集或佇列名稱符合至少其中一個包括的型樣,而排除的型樣一個都不符合,則容許作業。 使用 <include> 及 <exclude> 元素的 name 屬性指定的型樣,使用適用於代理程式執行所在平台的路徑分隔字元及使用慣例。 如果您指定相對檔案路徑,則解析的路徑將相對於代理程式的 transferRoot 內容。- 如果項目中遺漏 at 字元 (@),則將該型樣視為可以在任何佇列管理程式上存取的佇列名稱。 比方說,例如型樣是
name,則將它視為與name@**相同。 - 如果 at 字元 (@) 是項目中的第一個字元,則將該型樣視為佇列管理程式名稱,並可存取該佇列管理程式上的所有佇列。 比方說,例如型樣是
@name,則將它視為與**@name相同。
<include> 及 <exclude> 元素的 name 屬性的一部分時,它們具有特殊意義:- *
- 在目錄名稱中,或在 資料集名稱或 佇列名稱的限定元中,單一星號符合零或多個字元。
- ?
- 問號符合目錄名稱中的正好一個字元,或符合 資料集名稱或 佇列名稱的限定元。
- **
- 兩個星號字元符合零或多個目錄名稱,或 資料集名稱或 佇列名稱中零或多個限定元。 同時,結尾是路徑分隔字元的路徑有隱含的
**
新增至路徑結尾。 因此,/home/user/ 與 /home/user/** 相同。
- /**/test/** 符合其路徑中有 test 目錄的任何檔案
- /test/file? 符合 /test 目錄內以字串 file 開頭且後面接著任何單一字元的任何檔案
- c:\test\*.txt 符合 c:\test 目錄內具有 .txt 副檔名的任何檔案
- c:\test\**\*.txt 符合 'c:\test 目錄內任何檔案,或其中一個子目錄具有 .txt 副檔名
//'TEST.*.DATA' 符合第一個限定元為 TEST、第二個限定元為 DATA且第三個限定元為的任何資料集。- *@QM1 符合佇列管理程式 QM1 中具有單一限定元的任何佇列。
- TEST.*.QUEUE@QM1 符合佇列管理程式 QM1 上其第一個限定元為 TEST、有任何第二個限定元,且第三個限定元為 QUEUE 的任何佇列。
- **@QM1 符合佇列管理程式 QM1上的任何佇列。
符號鏈結
您必須完整解析 UserSandboxes.xml 檔案中之檔案路徑所使用的符號鏈結,方法是在<include> 及 <exclude> 元素中指定固定鏈結。 例如,如果您具有 /var 對映至 /SYSTEM/var的符號鏈結,則必須將此路徑指定為 <tns:include
name="/SYSTEM/var"/>,否則預期的傳送會因使用者沙盤推演安全錯誤而失敗。範例
此範例說明如何透過將下列 <sandbox> 元素新增至代理程式 AGENT_JUPITER 配置目錄中的 UserSandboxes.xml 檔案,來容許具有 MQMD 使用者名稱 guest 的使用者,在 AGENT_JUPITER 執行所在系統上傳送 /home/user/public 目錄或其任何子目錄中的任何檔案:
<?xml version="1.0" encoding="UTF-8"?>
<tns:userSandboxes
xmlns:tns="http://wmqfte.ibm.com/UserSandboxes"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://wmqfte.ibm.com/UserSandboxes UserSandboxes.xsd">
<tns:agent>
<tns:sandbox user="guest">
<tns:read>
<tns:include name="/home/user/public/**"/>
</tns:read>
</tns:sandbox>
</tns:agent>
</tns:userSandboxes>
範例
account 且後面跟著單一數字的任何使用者(例如 account4)完成下列動作:- 傳送來自 /home/account 目錄或其任何子目錄的任何檔案(不包括代理程式 AGENT_SATURN 執行所在系統上的 /home/account/private 目錄)
- 將任何檔案傳送至代理程式 AGENT_SATURN 執行所在系統上的 /home/account/output 目錄或其任何子目錄
- 從本端佇列管理程式上以字首 ACCOUNT. 開頭的佇列中讀取訊息,除非它以 ACCOUNT.PRIVATE. 開頭 (即在第二層次具有 PRIVATE )。
- 將資料傳送至任何佇列管理程式上開頭為字首 ACCOUNT.OUTPUT. 的佇列上。
account 的使用者完成下列動作,請將下列 <sandbox> 元素新增至 AGENT_SATURN 配置目錄中的 UserSandboxes.xml 檔案:
<?xml version="1.0" encoding="UTF-8"?>
<tns:userSandboxes
xmlns:tns="http://wmqfte.ibm.com/UserSandboxes"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://wmqfte.ibm.com/UserSandboxes UserSandboxes.xsd">
<tns:agent>
<tns:sandbox user="account[0-9]" userPattern="regex">
<tns:read>
<tns:include name="/home/account/**"/>
<tns:include name="ACCOUNT.**" type="queue"/>
<tns:exclude name="ACCOUNT.PRIVATE.**" type="queue"/>
<tns:exclude name="/home/account/private/**"/>
</tns:read>
<tns:write>
<tns:include name="/home/account/output/**"/>
<tns:include name="ACCOUNT.OUTPUT.**" type="queue"/>
</tns:write>
</tns:sandbox>
</tns:agent>
</tns:userSandboxes>