在三層應用程式模型中,中介層(如 WebSphere Application Server、Domino)負責用戶端身分驗證並管理與資料庫伺服器互動。中介層授權 ID 需擁有所有終端使用者相關權限以執行其請求操作。雖有優點,但將所有資料庫互動集中於中介層引發安全問題:

理想機制:中介層代表使用者執行的資料庫請求,僅使用該使用者特定的資料庫身分與權限。讓中介層用使用者 ID/密碼建立新連線雖簡單但有缺陷:中介層常無使用者驗證憑證,且為每位使用者建立實體連線帶來效能開銷。需更好方法:重用相同實體連線,無需在資料庫伺服器重新驗證使用者——這即受信任連線概念。
建立受信任連線需在 DB2 建立「受信任上下文」新物件,在 DB2 與外部實體(如中介軟體伺服器)間建立信任關係。受信任上下文定義特定連線需滿足的標準以被視為受信任連線。嘗試建立受信任連線時評估一系列信任屬性決定特定上下文是否受信任。首次建立連線時確立連線與受信任上下文關係,連線未中斷期間持續存在。建立受信任連線時,允許中介層指定新使用者 ID 將連線用於不同授權 ID,無需對該使用者 ID 驗證(見圖 2)。

SQLSetConnectAttr API 新連線屬性:
SQL_ATTR_USE_TRUSTED_CONTEXT:指示用戶端是否請求受信任連線,僅連線建立前或中斷後可設定SQL_ATTR_TRUSTED_CONTEXT_USERID:當前受信任連線使用的使用者 ID 字串SQL_ATTR_TRUSTED_CONTEXT_PASSWORD:應用程式為驗證可能設定的密碼,除非設定 USERID 屬性否則無效int main(int argc, char *argv[]) {
SQLHANDLE henv, hdbc;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// 啟用受信任連線
SQLSetConnectAttr(hdbc, SQL_ATTR_USE_TRUSTED_CONTEXT, SQL_TRUE, SQL_IS_INTEGER);
// 以 newton 身分建立受信任連線
SQLConnect(hdbc, "testdb", SQL_NTS, "newton", SQL_NTS, "xxxxx", SQL_NTS);
// 執行工作(以 newton 身分)
// 切換至受信任上下文定義允許的使用者 zurbIE
SQLSetConnectAttr(hdbc, SQL_ATTR_TRUSTED_CONTEXT_USERID, "zurbIE", SQL_IS_POINTER);
SQLSetConnectAttr(hdbc, SQL_ATTR_TRUSTED_CONTEXT_PASSWORD, "xxxxx", SQL_NTS);
// 執行新工作(以 zurbIE 身分)
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
應用程式可在分散式事務使用受信任連線。XA 為每個處理序啟動一個應用伺服器,每進程中用 XA API (xa_open) 建立連線。配置方法:
xa_open 字串中 TCTX=TRUE/FALSE 指示是否在受信任上下文模式運行SQLConnect() 將 TM 開啟的連線與 CLI/ODBC 連線控制代碼關聯,可在字串指定使用者 ID/密碼xa_start 傳遞事務 ID (XID) 關聯呼叫者執行緒與事務分支xa_end(TM_SUCCESS),再 SQLSetConnectAttr 指定新使用者 ID 與可選密碼# db2cli 範例:含受信任上下文的 XA 測試
sqlallocenv 1
xaopen 10 "DB=stlec1,sreg=t,SPM=domino,TCTX=TRUE,uid=zurbIE,PWD=xxxxxxxx" TMNOFLAGS
sqlallocconnect 1 1
sqlconnect 1 stlec1 -3 zurbIE -3 xxxxxxxx -3
# 切換至 newton
sqlsetconnectattr 1 SQL_ATTR_TRUSTED_CONTEXT_USERID newton
sqlsetconnectattr 1 SQL_ATTR_TRUSTED_CONTEXT_PASSWORD yyyyy
# 開始事務(切換至 newton)
xastart 10 99 gtrid bqual TMNOFLAGS
sqlgetconnectattr 1 SQL_ATTR_USE_TRUSTED_CONTEXT
sqlallocstmt 1 1
sqlexecdirect 1 "create table temp (int1 int)" -3
sqlexecdirect 1 "insert into temp values ( -99 )" -3
sqlexecdirect 1 "select * from temp" -3
fetchall 1
sqlclosecursor 1
sqlexecdirect 1 "delete from temp where int1 < 0" -3
sqlfreestmt 1 SQL_DROP
# 兩階段提交
xaend 10 99 gtrid bqual TMSUCCESS
xaprepare 10 99 gtrid bqual TMNOFLAGS
xacommit 10 99 gtrid bqual TMNOFLAGS
sqldisconnect 1
sqlfreeconnect 1
xaclose 10 TMNOFLAGS
sqlfreeenv 1
IBM DB2 Driver for JDBC/SQLJ 提供方法允許 Java 程式建立/使用受信任連線。應用伺服器使用這些方法時不應使用不受信任連線方法以避免安全漏洞。
DB2ConnectionPoolDataSource.getDB2TrustedPooledConnection 多種版本DB2XADataSource.getDB2XAConnection 多種版本Object[]:[0] 初始連線實例,[1] 唯一 cookie(JDBC 驅動程式產生,用於後續連線重用驗證)重用受信任連線:
DB2PooledConnection.getDB2Connection 多種版本DB2Connection.reuseDB2Connection 多種版本javax.sql.PooledConnection pooledCon = (javax.sql.PooledConnection)objects[0];
Properties properties = new Properties();
// 設定重用物件新屬性
byte[] cookie = (byte[])objects[1];
String newuser = "newuser";
String userRegistry = "registry"; // 對應 z/OS RACF ID 的映射服務
byte[] userSecTkn = null;
String originalUser = null;
Connection con = ((com.ibm.db2.jcc.DB2PooledConnection)pooledCon).
getDB2Connection(cookie, newuser, password, userRegistry, userSecTkn, originalUser, properties);
在電子商務領域,許多應用程式依賴 Domino、WebSphere 等中介軟體伺服器提供安全性。受信任上下文為這些應用程式提供安全環境且無過多效能損耗。透過調優受信任上下文安全屬性,確保對資料庫伺服器的無懈可擊存取。且能以極少連線資源切換使用者無需驗證,是商業應用程式的理想選擇。