首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 受信任上下文實戰:三層架構應用程式的安全連線重用技術

     編輯:DB2 教學

三層架構安全挑戰

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

  • 使用者身分遺失:企業需知曉存取資料庫的所有使用者身分以實施存取控制
  • 使用者可說明性減弱:資料庫應區分中介層自身事務與代表使用者執行的事務
  • 權限過度授予:中介層擁有所有使用者請求所需權限,導致不需存取特定資訊的使用者獲得存取權
  • 安全性降低:中介層連線授權 ID 若洩漏,所有資源將暴露

三層應用程式模型

理想機制:中介層代表使用者執行的資料庫請求,僅使用該使用者特定的資料庫身分與權限。讓中介層用使用者 ID/密碼建立新連線雖簡單但有缺陷:中介層常無使用者驗證憑證,且為每位使用者建立實體連線帶來效能開銷。需更好方法:重用相同實體連線,無需在資料庫伺服器重新驗證使用者——這即受信任連線概念。

受信任連線與受信任上下文

建立受信任連線需在 DB2 建立「受信任上下文」新物件,在 DB2 與外部實體(如中介軟體伺服器)間建立信任關係。受信任上下文定義特定連線需滿足的標準以被視為受信任連線。嘗試建立受信任連線時評估一系列信任屬性決定特定上下文是否受信任。首次建立連線時確立連線與受信任上下文關係,連線未中斷期間持續存在。建立受信任連線時,允許中介層指定新使用者 ID 將連線用於不同授權 ID,無需對該使用者 ID 驗證(見圖 2)。

含受信任上下文的三層模型

受信任上下文定義元素

  • 系統授權 ID:首要信任屬性,連線使用的授權 ID。給定系統授權 ID 與特定受信任上下文間有明確對應。
  • 連線信任屬性:定義一組特徵,連線憑藉受信任上下文成為受信任連線必須滿足。僅當一組屬性所有條件滿足,使用該組屬性的連線才視為受信任連線。

CLI 應用程式中的受信任連線

SQLSetConnectAttr API 新連線屬性:

  • SQL_ATTR_USE_TRUSTED_CONTEXT:指示用戶端是否請求受信任連線,僅連線建立前或中斷後可設定
  • SQL_ATTR_TRUSTED_CONTEXT_USERID:當前受信任連線使用的使用者 ID 字串
  • SQL_ATTR_TRUSTED_CONTEXT_PASSWORD:應用程式為驗證可能設定的密碼,除非設定 USERID 屬性否則無效

範例:CLI 程式建立受信任連線並切換使用者

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 為每個處理序啟動一個應用伺服器,每進程中用 XA API (xa_open) 建立連線。配置方法:

  • xa_open 字串中 TCTX=TRUE/FALSE 指示是否在受信任上下文模式運行
  • 調用 SQLConnect() 將 TM 開啟的連線與 CLI/ODBC 連線控制代碼關聯,可在字串指定使用者 ID/密碼
  • 調用 xa_start 傳遞事務 ID (XID) 關聯呼叫者執行緒與事務分支
  • 切換受信任連線使用者:先 xa_end(TM_SUCCESS),再 SQLSetConnectAttr 指定新使用者 ID 與可選密碼

XA 環境受信任連線完整範例

# 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

JDBC 應用程式中的受信任連線

IBM DB2 Driver for JDBC/SQLJ 提供方法允許 Java 程式建立/使用受信任連線。應用伺服器使用這些方法時不應使用不受信任連線方法以避免安全漏洞。

  • DB2ConnectionPoolDataSource.getDB2TrustedPooledConnection 多種版本
  • DB2XADataSource.getDB2XAConnection 多種版本
  • 回傳 Object[]:[0] 初始連線實例,[1] 唯一 cookie(JDBC 驅動程式產生,用於後續連線重用驗證)

重用受信任連線:

  • DB2PooledConnection.getDB2Connection 多種版本
  • DB2Connection.reuseDB2Connection 多種版本
  • 傳遞:初始連線 cookie、新使用者連線屬性
  • JDBC 驅動程式驗證 cookie 是否匹配底層受信任實體連線,確保請求來自建立受信任連線的應用伺服器

JDBC 受信任連線範例

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 等中介軟體伺服器提供安全性。受信任上下文為這些應用程式提供安全環境且無過多效能損耗。透過調優受信任上下文安全屬性,確保對資料庫伺服器的無懈可擊存取。且能以極少連線資源切換使用者無需驗證,是商業應用程式的理想選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved