通过 kerberos [jdbc 驱动程序] 在 Redhat7 和 MSSQL 数据库之间建立连接

通过 kerberos [jdbc 驱动程序] 在 Redhat7 和 MSSQL 数据库之间建立连接

我正在解决非常烦人的问题,即我们在redhat 7上创建的java应用程序是为了连接到mssql而创建的,它无法解析存储在我们公司自动机生成的keytab中的主体。主体存储在密钥表中:svcAccount/fqdn@RELM

为了进行测试,我使用以下命令生成了 cCache

kinit -f -c -p FILENAME svcAccount@REALM

这种连接配置工作正常,因为存储在 cCache 中的主体的语法对于 Microsoft 应用程序来说不稳定,但是当我尝试与使用中的 keytab 建立连接时,我收到以下错误:

**com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user 
'domain\ svcAccount/fqdn '**

我尝试将“auth_to_local”添加到 KRB5.conf 中,但似乎 kerberos 忽略了此配置。

知道如何在 Windows 服务器上映射此主体名称吗?我是否必须在我的java应用程序中修改它,或者它只是错误的kerberos配置?为了让它变得更加困难:我没有 kadmin 的权限,无法修改 keytab :/


Kerberos 配置:

Klist –kte keytab.file:

KVNO Timestamp           Principal

   3 12/31/1969 19:00:00 svcAccount/fqdn@RELM (encryption method)

   3 12/31/1969 19:00:00 svcAccount/fqdn@RELM (encryption method)

   3 12/31/1969 19:00:00 svcAccount/fqdn@RELM (encryption method)

SQLJDBCDriver.conf

SQLJDBCDriver {

com.sun.security.auth.module.Krb5LoginModule required

useKeyTab=true

keyTab="FILE:/home/filename.keytab"

principal=" svcAccount/fqdn@RELM "

storeKye=true

debug=true

credsType=both

doNotPrompt=true;

};

Java 以参数开始

JAVA_OPTS="-Dspring.jmx.enabled=false -Dkerberos.client.reference.name=SQLJDBCDriver -Djava.security.auth.login.config=/etc/path/SQLJDBCDriver.conf -Djavax.security.auth.useSubjectCredsOnly=false -Dsun.security.krb5.debug=true -Djava.security.krb5.conf=/etc/krb5.conf -Dspring.profiles.active=uat"

连接字符串:

url: jdbc:sqlserver://serverName:2431;databaseName=DB_NAME;integratedSecurity=true;authenticationScheme=JavaKerberos;serverSpn=MSSQLSvc/fqdn:2431@DOMAIN

KRB5.CONF

[libdefaults]

  default_realm = DOMAIN.COM

  default_ccache_name = KEYRING:persistent:%{uid}

  dns_lookup_realm = true

  dns_lookup_kdc = true

  noaddresses = true

  kdc_timesync = 0

  rdns = false

  kdc_timeout = X

  max_retries = X

  ticket_lifetime = XX

  renew_lifetime = XX



[realms]

    DOMAIN.COM = {

    }



[domain_realm]

   domain.com = DOMAIN.COM

[appdefaults]

       pam = {

               validate = true

               keytab = /etc/krb5.keytab

               banner = login

               minimum_uid = X

               addressless = X

               use_shmem = tX

               ignore_unknown_principals = X

       }

       kinit = {

               renewable = true

               forwardable= true

       }

答案1

**com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user
'domain\ svcAccount/fqdn '**

注意 之前和之后的空格svcAccount/fqdn

在 SQLJDBCDriver.conf 中,这些空格也存在于双引号内:

principal=" svcAccount/fqdn@RELM "

svcAccount与 不一样<space>svcAccount,并且RELM<space>与 不一样RELM。删除多余的空格SQLJDBCDriver.conf并重试。

此外,文件[domain_realm]的该部分krb5.conf可能需要也可能不需要以下一行或两行:

domain = RELM
.domain = RELM

答案2

感谢您的回复,但这些空格是我在准备帖子时错误地输入的。我不认为这是“域”行的问题,因为我可以使用连接字符串中的硬编码用户名和密码以及使用 cCache 文件来建立连接,这意味着 krb5.conf 允许建立连接,但 kerberos 不会将主体转换为可理解的用于微软服务。

我想补充一点,我终于建立了连接。

解决方案:下载带有所有工具的 krb5 服务器 [ktutil kinit kadmin 等],按照以下约定添加主体:principal@REALM,并保存为已创建的 keytab [将附加新条目]。 ..就是这样:)我知道这是解决方法,但有效。我希望它有用,因为 kerberos 是噩梦。这项技术的名称就足够了......它阻止执行快速配置:D

线程可以关闭

相关内容