簡體   English   中英

sqlalchemy 與 db2 和 kerberos

[英]sqlalchemy with db2 and kerberos

當身份驗證使用 kerberos 時,如何使用 sqlalchemy 連接到我的 db2 數據庫?

使用 pyodbc 時,連接字符串包含 AuthenticationMethod=4,它讓 kerberos 處理身份驗證,我不需要提供用戶名和密碼。

有沒有辦法將 pyodbc.connect object 直接傳遞到 sqlalchemy 或者我可以告訴 sqlalchemy 使用 kerberos?

我的 odbc 連接字符串如下所示:

connstr = 'ApplicationUsingThreads=0;' \
  ...:               'FloatingPointParameters=0;' \
  ...:               'DoubleToStringPrecision=16;DB=NYRMPDI1;' \
  ...:               'AuthenticationMethod=4;' \
  ...:               f'IpAddress={ip_address};' \
  ...:               f'TcpPort={port};' \
  ...:               f'DRIVER={driver_location}'

我找不到任何方法將其傳遞給 sqlalchemy create_engine。

帶有 IBM ibm_db_sa驅動程序的 ibm_db_sa 支持與 pyodbc 的 kerberos 連接,DSN-LESS 和 DSN 連接字符串,它適用於所有三種類型的 IBM Db2 驅動程序(胖客戶端、運行時客戶端和 ODBC 和 CLI 驅動程序) . 胖客戶端+運行時客戶端與 ODBC 和 CLI 客戶端需要不同的配置。

默認情況下,除非您另有說明,否則安裝ibm_db_saibm_db模塊將安裝 IBM 的“ODBC 和 CLI 客戶端”。

您的odbcinst.ini需要定義一個驅動程序名稱(在我的示例中,我將其稱為 DB2CLI,但您可以給它任何您喜歡的名稱),並指定要從正確路徑加載的庫(例如 libdb2.so)。

這是一個 DSN-LESS 連接字符串的示例,您必須在傳遞給create_engine()之前對其進行 urlencode:

CONNECTION_STRING=("DRIVER={DB2CLI};HOSTNAME=192.168.1.178;PORT=60000;KRBPLUGIN=IBMkrb5;AUTHENTICATION=KERBEROS;DATABASE=SAMPLE;")

quoted_connection_string=urllib.parse.quote_plus(CONNECTION_STRING)

engine = create_engine('ibm_db_sa+pyodbc:///?odbc_connect={}'.format(quoted_connection_string))

如果您更喜歡 DSN 連接,則必須在 db2dsdriver.cfg 中定義所有詳細信息,並在活動db2dsdriver.cfg中有一個 dsn 節,該odbc.ini引用您在odbcinst.ini中配置的驅動程序,並且您必須指定 DSN在這樣的連接字符串中:

CONNECTION_STRING=("DSN=SAMPLE;")

engine = create_engine('ibm_db_sa+pyodbc:///?odbc_connect={}'.format(CONNECTION_STRING))

對於 DSN 連接,如果您首先讓 kerberos 連接與isql一起工作,然后再與 sqlalchemy 一起工作,這會有所幫助,因為故障排除似乎更容易。

我使用這些組件版本進行了測試:

  • ubuntu 16.04 LTS x64
  • 虛擬環境中的 python 3.6.8
  • ibm_db 3.0.1
  • ibm_db_sa 0.3.5
  • UnixODBC 2.3.4
  • pyodbc 4.0.30
  • IBM Db2 數據服務器驅動11.1.4.4a(可選
  • IBM Db2 ODBC 和 CLI 驅動程序(默認
  • 本地和遠程 Db2-LUW 服務器,其 Db2 實例已經過 Kerberized。

嘗試步驟:

  • 對於 DSN 連接,使用 dsn 配置活動的db2dsdriver.cfg ,使用參數 Authentication 和參數值 Kerberos 配置數據庫。
  • 對於胖客戶端和運行時客戶端,通過db2 update dbm cfg using CLNT_KRB_PLUGIN IBMkrb5將 IBM 數據服務器客戶端CLNT_KRB_PLUGIN參數配置為IBMkrb5 (使用 ODBC 和 CLI 驅動程序時不需要此步驟)。
  • Configure your active odbcinst.ini for Db2 to use the correct libdb2.so library as supplied by your Db2 client, and reference this driver-name either in your DSN-LESS python code, or in your odbc.ini for DSN-connections.
  • 僅對於 DSN 連接,將您的活動odbc.ini配置為使用odbcinst.ini中指定的 Db2 驅動程序,並在odbc.ini中的 DSN 節中提及Authentication = kerberos
  • 對於 DSN 連接,省略活動odbc.ini文件中的任何用戶 ID/密碼。 對於 DSN-LESS 連接,您不需要對odbc.inidb2dsdriver.cfg中的數據庫進行任何引用。
  • 僅對於 DSN 連接,Verify db2cli validate -dsn $YOURDSN -connect for a remote database 在沒有用戶 ID 或密碼的情況下成功完成。 這證明 CLI 層正在使用 kerberos。

  • (可選)對於 Db2 胖客戶端或運行時客戶端,驗證您可以通過 shell 命令行db2 connect to $YOUR_REMOTE_DATABASE用戶 IDOTE_DATA_BASE。 這證明了常規的 shell 腳本可以通過 kerberos 認證連接到數據庫。

  • 如果您使用的是 Db2 胖客戶端或 Db2 運行時客戶端,那么您需要在運行isql或 python 腳本之前點入/獲取正確的 db2profile。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM