繁体   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