使用Python客户端和Kerberos连接到数据库

时间:2019-06-18 08:13:58

标签: python python-3.x database oracle kerberos

我有一个Python脚本,该脚本基本上使用x_Oracle oracle客户端连接到我的数据库服务器,并且在连接后,我可以运行SQL查询。

现在,由于我的数据库凭据已过期,我被迫使用我不知道的kerberos auth。以前只需执行以下代码即可:

conn_str = u'username/password@dbx1.ct.com:1521/dbx1.ct.com'
    conn = cx_Oracle.connect(conn_str)
    c = conn.cursor()
    c.execute(
        "select DISTINCT ITEM_ID,  UOM,  from SMCFS93 where item = '" + item + "'")
    for row in c:
        print(row)

但是现在我需要使用kinit来生成票证,并且我有一个C:\kerberos\krb5.conf文件和一个C:\krb5cc_User文件,这些文件已经在SQL Developer中提供了路径位置,然后就可以连接到我的数据库服务器了。

如果要使用SQL开发人员连接到数据库,则该方法效果很好,但是我无法获得如何在Python中实现此功能的方法。

我尝试创建一个子进程来每次输入kinit并生成票证,并尝试了一些关于stackoverflow的答案,但是我无法连接到我的数据库。关于如何使用kerberos连接数据库服务器的任何建议将大有帮助。

2 个答案:

答案 0 :(得分:0)

该文档包含有关如何配置客户端以使用Kerberos向Oracle服务器进行身份验证的信息。

Oracle Configuring Kerberos Authentication

答案 1 :(得分:0)

使用以下命令从Python连接到Oracle:

  • OCI版本的Oracle Instant Client
  • 通过Windows密钥库的
  • Kerberos
  • jaydebeapi和jpype Python库

好处:

  • 无需手动输入用户名/密码即可生成Kerberos 票。
  • 使用凭据对活动Windows会话的身份进行身份验证 Windows密钥库。
  • 没有Kerberos密钥文件可以跟踪和保护
  • 其他应用程序(SQL * Plus,SQL Developer等)可以重复使用 Kerberos配置
  • krbcontext Python库完全是 不必要。因此,在Windows计算机上不需要Docker。

步骤:

  1. 从您的IT人员那里获取Windows域的krb5.conf(或创建一个)
  2. 通过在Instant Client的\ network \ admin子目录中创建sqlnet.ora文本文件,将Oracle Instant Client配置为使用Kerberos身份验证。文件内容:

    SQLNET.KERBEROS5_CONF={Path to your Krb5.conf file}
    SQLNET.KERBEROS5_CONF_MIT=TRUE
    SQLNET.AUTHENTICATION_SERVICES=(KERBEROS5PRE)
    SQLNET.KERBEROS5_CC_NAME=OSMSFT:
    
  3. 验证是否为Kerberos正确配置了Instant Client。以下命令将连接到服务器并进行身份验证,而不会提示您输入用户名和密码。 (请勿将“ /”替换为您的用户名和密码。)

    sqlplus.exe /@server:port/SID

  4. 确保Oracle Instant Client根目录在您的环境路径中。否则,jaydebeapi.connect命令将引发以下错误:java.lang.UnsatisfiedLinkError: no ocijdbc19 in java.library.path

  5. 使用JDBC在Python中连接

    args = "-Djava.class.path=" + {jdbc_jar_file_path}
    jpype.startJVM(args, convertStrings = False)
    
    connection_string = 'jdbc:oracle:oci:/@server:port:sid'
    jaydebeapi.connect(
      {jdbc_java_class_name}
    , connection_string
    , jars = {jdbc_jar_file_path}
    )
    
相关问题