Требуется ли для подключения Kerberos к серверу SQL пароль в свойствах соединения? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь подключиться к серверу sql с помощью keytab и выдает ошибку ниже

com.microsoft.sqlserver.jdbc.SQLServerException: Не удается войти в систему с основным доменом Kerberos DOMAIN \ User, проверьте свои учетные данные. Ошибка входа в Kerberos: ошибка встроенной аутентификации. ClientConnectionId: 6f436f49-b0bf-441e-bab3-e6af86ac8361 из-за javax.security.auth.login.LoginException (Невозможно получить любое из свойств: [пароль, ПАРОЛЬ] из свойств con, недоступных для получения информации аутентификации от пользователя) на com.microsoft.sqlserver.jdbc.KerbAuthentication.intAuthInit (KerbAuthentication.java:108) в com.microsoft.sqlserver.jdbc.KerbAuthentication.GenerateClientContext (KerbAuthentication.java:399) на com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon (SQLServerConnection.java:4049) на com.microsoft.sqlserver.jdbc.SQLServerConnection.logon (SQLServerConnection.java:3157) на com.microsoft.sqlserver.jdbc.SQLServerConnection.access $ 100 (SQLServerConnection.java:82) в com.microsoft.sqlserver.jdbc.SQLServerConnection $ LogonCommand.doExecute (SQLServerConnection.java:3121) на com.microsoft.sqlserver.jdbc.TDSCommand.execute (IOBuffer.java:7151) на com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand (SQLServerConnection.java:2478) на com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper (SQLServerConnection.java:2026) на com.microsoft.sqlserver.jdbc.SQLServerConnection.login (SQLServerConnection.java:1687) в com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal (SQLServerConnection.java:1528) на com.microsoft.sqlserver.jdbc.SQLServerConnection.connect (SQLServerConnection.java:866) на com.microsoft.sqlserver.jdbc.SQLServerDriver.connect (SQLServerDriver.java:569) в java.sql.DriverManager.getConnection (Неизвестный источник) в java.sql.DriverManager.getConnection (Неизвестный источник) в com.adventnet.appmanager.server.mssql.datacollection.MSSQLKerberosAuthenticationTest.main (MSSQLKerberosAuthenticationTest.java:47) Вызвано: javax.security.auth.login.LoginException: Невозможно получить любое из свойств: [пароль, ПАРОЛЬ] из свойств con, недоступных для получения информации об аутентификации от пользователя в com.sun.security.auth.module.Krb5LoginModule.promptForPass (Неизвестный источник) в com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication (Неизвестный источник) at com.sun.security.auth.module.Krb5LoginModule.login (неизвестный источник) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник) at sun.reflect.DelegatingMethodAccessorImpl.invoke (неизвестный источник) в java.lang.reflect.Method.invoke (Неизвестный источник) в javax.security.auth.login.LoginContext.invoke (Неизвестный источник) в javax.security.auth.login.LoginContext.access $ 000 (неизвестный источник) at javax.security.auth.login.LoginContext $ 4.run (неизвестный источник) at javax.security.auth.login.LoginContext $ 4.run (неизвестный источник) at java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.login.LoginContext.invokePriv (Неизвестный источник) в javax.security.auth.login.LoginContext.login (Неизвестный источник) на com.microsoft.sqlserver.jdbc.KerbAuthentication.intAuthInit (KerbAuthentication.java:87) ... еще 15

Когда я пытаюсь с паролем, он успешно подключен.

String home = System.getProperty("user.dir");
String  filePath = home + File.separator + "conf" + File.separator + "KerberosConfigurations" + File.separator + "MSSQL";// NO I18N
System.setProperty("java.security.krb5.debug", "true");
System.setProperty("java.security.auth.login.config", filePath+File.separator+"login.conf");
System.setProperty("java.security.krb5.conf", filePath+File.separator+"krb5.ini");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
String connectionUrl = "jdbc:sqlserver://"+hostName+":"+port+";databaseName=master;sendStringParametersAsUnicode=true;applicationName=test;"; //NO I18N
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Properties dbConProp = new Properties();
dbConProp.put("integratedSecurity", "true");
dbConProp.put("authenticationScheme", "JavaKerberos");
dbConProp.put("instanceName",instanceName);
dbConProp.put("user",user);
//dbConProp.put("password",pwd);
con = DriverManager.getConnection(connectionUrl,dbConProp);

Является ли пароль в свойствах подключения обязательным для подключения Kerberos? Кейтаба одного недостаточно?

1 Ответ

1 голос
/ 11 июля 2019

Клиент должен сначала пройти аутентификацию в домене. например в Linux и MacOS, используя MIT Kerberos , вы можете использовать команду kinit для получения билета Kerberos.

После предоставления вы можете пройти аутентификацию в Sql по этому билету, не предоставляя ничего другого.

[Update]

Если ваш хост и целевой объект находятся в домене Windows и , они находятся в одном домене, то вам уже пора идти.

При этом Sql только позволит вам проходить аутентификацию с использованием Kerberos , если учетная запись службы, на которой запущен механизм, имеет права на создание Имя участника службы (или пользователь с соответствующими правами создал SPN с помощью команды setSPN).

Вы можете узнать, удалось ли Sql зарегистрировать SPN , посмотрев в журнале ошибок Sql текст, подобный

The SQL Server Network Interface library successfully registered the Service Principal Name (SPN) [ MSSQLSvc/MySqlServerHostName:1433 ] for the SQL Server service

В Kerberos есть много вещей, которые можно охватить всего лишь StackOverflow Ответом.

...