Использование встроенной проверки подлинности Kerberos для подключения к SQL Server

Скачать драйвер JDBC

Начиная с Microsoft JDBC Driver 4.0 для SQL Server, приложение может использовать свойство подключения authenticationScheme , чтобы указать, что он хочет подключиться к базе данных с помощью встроенной проверки подлинности Kerberos типа 4. Дополнительные сведения о свойствах подключения см. в разделе "Настройка свойств подключения". Дополнительные сведения см. в статье Microsoft Kerberos.

При использовании встроенной проверки подлинности в модуле Java Krb5LoginModule его можно настроить с помощью класса Krb5LoginModule.

Драйвер Microsoft JDBC для SQL Server задает следующие свойства для виртуальных машин IBM Java:

  • useDefaultCcache = true
  • moduleBanner = false

Драйвер Microsoft JDBC для SQL Server задает следующие свойства для всех остальных виртуальных машин Java:

  • useTicketCache = true
  • doNotPrompt = true

Замечания

В версиях до Microsoft JDBC Driver 4.0 for SQL Server приложение должно было указывать встроенную проверку подлинности (по протоколу Kerberos или NTLM, в зависимости от доступности этих протоколов) с помощью свойства подключения integratedSecurity и посредством указания библиотеки mssql-jdbc_auth-<версия>-<архитектура>.dll, как описано в статье Формирование URL-адреса подключения.

Начиная с Microsoft JDBC Driver 4.0 для SQL Server приложение может использовать свойство подключения authenticationScheme , чтобы указать, что он хочет подключиться к базе данных с помощью интегрированной проверки подлинности Kerberos с помощью чистой реализации Java Kerberos:

  • Если необходимо выполнить встроенную проверку подлинности с помощью модуля Krb5LoginModule, все еще необходимо указывать свойство подключения integratedSecurity=true. Следует также указать и свойство подключения authenticationScheme=JavaKerberos.

  • Чтобы продолжить использование встроенной проверки подлинности с библиотекой mssql-jdbc_auth-<версия>-<архитектура>.dll, просто укажите свойство подключения integratedSecurity=true (можно также указать authenticationScheme=NativeAuthentication).

  • Если вы указываете authenticationScheme=JavaKerberos, но не указывайте integratedSecurity=true, драйвер будет игнорировать свойство подключения authenticationScheme, и он ожидает найти имя пользователя и учетные данные пароля в строка подключения.

Если создание соединения выполняется из источника данных, то можно программно задать схему проверки подлинности с помощью метода setAuthenticationScheme и (при необходимости) имя субъекта-службы для подключений Kerberos с помощью метода setServerSpn.

Для поддержки проверки подлинности по протоколу Kerberos добавлено новое средство ведения журнала — com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Дополнительные сведения см. в статье о трассировке операций драйвера.

Следующие рекомендации помогут настроить протокол Kerberos.

  1. Установите для параметра AllowTgtSessionKey значение 1 в реестре Windows. Дополнительные сведения см. в статье Разделы реестра протокола Kerberos и параметры конфигурации KDC в Windows Server 2003.
  2. Убедитесь, что конфигурация Kerberos (файл krb5.conf в среде UNIX) содержит верные указания на область (realm) и KDC в вашей среде.
  3. Инициализируйте кэш TGT с помощью kinit или войдя в домен.
  4. Когда приложение, использующее свойство authenticationScheme=JavaKerberos, запускается в операционной системе Windows Vista или Windows 7, следует использовать стандартную учетную запись пользователя. Но если приложение запускается от имени учетной записи администратора, то оно должно запускаться с правами доступа администратора.

Примечание.

Атрибут соединения serverSpn поддерживается только драйвером Microsoft JDBC Driver версии 4.2 или более поздней.

Имена субъектов-служб

Имя участника-службы (service primary name, SPN) — это имя, по которому клиент единственным образом распознает экземпляр службы.

Вы можете самостоятельно указать имя субъекта-службы с помощью свойства подключения serverSpn или разрешить драйверу создать его (вариант по умолчанию). Это свойство находится в виде "MSSQLSvc/fqdn:port@REALM", где полное доменное имя является полным доменным именем, портом является номер порта, и ОБЛАСТЬ KERberos sql Server в верхних буквах. Часть области этого свойства является необязательной, если область по умолчанию конфигурации Kerberos совпадает с областью сервера и не включена по умолчанию. Если вы хотите поддерживать сценарий проверки подлинности между областью, в которой область по умолчанию в конфигурации Kerberos отличается от области сервера, необходимо задать имя субъекта-службы с помощью свойства serverSpn.

Например, имя субъекта-службы может выглядеть следующим образом: MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM

Дополнительные сведения об именах субъектов-служб (SPN) см. в разделах:

Примечание.

До версии драйвера JDBC 6.2 для правильного использования протокола проверки подлинности Kerberos между областями необходимо явно задать параметр serverSpn.

Начиная с версии 6.2, драйвер по умолчанию сможет создать параметр serverSpn даже при использовании протокола проверки подлинности Kerberos между областями. Хотя параметр serverSpn также можно использовать явно.

Создание файла конфигурации модуля входа

Можно также указать файл конфигурации Kerberos. Если файл конфигурации не указан, в силу применяются следующие параметры:

Sun JVM
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;

IBM JVM
com.ibm.security.auth.module.Krb5LoginModule required useDefaultCcache = true;

Если будет использоваться файл конфигурации модуля входа, то файл должен иметь следующий формат:

<name> {  
    <LoginModule> <flag> <LoginModule options>;  
    <optional_additional_LoginModules, flags_and_options>;  
};  

Файл конфигурации входа состоит из одной или нескольких записей, каждая из которых описывает, какая из базовых технологий проверки подлинности должна использоваться для конкретного приложения или приложений. Например,

SQLJDBCDriver {  
   com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;  
};  

Каждая запись файла конфигурации модуля входа состоит из имени, за которым следует одна или несколько записей loginModule. Каждая запись LoginModule завершается точкой с запятой, а в скобках заключена вся группа записей LoginModule. Каждая запись файла конфигурации завершается точкой с запятой.

Помимо возможности получения драйвером учетных данных Kerberos согласно настройкам, заданным в файле конфигурации модуля входа, драйвер может использовать существующие учетные данные. Этот метод может быть полезным, если приложению необходимо создать подключения с использованием нескольких учетных данных пользователя.

Драйвер попытается использовать существующие учетные данные, если они доступны, прежде чем пытаться войти в систему с помощью указанного модуля входа. Поэтому при использовании метода Subject.doAs для выполнения кода в определенном контексте будет создано соединение с учетными данными, переданными при вызове Subject.doAs.

Дополнительные сведения см. в разделе Файл конфигурации входа JAAS и Класс Krb5LoginModule.

Начиная с Microsoft JDBC Driver 6.2, имя записи конфигурации модуля входа можно передать с помощью свойства jaasConfigurationNameподключения. Этот метод позволяет каждому подключению иметь собственную конфигурацию входа или использовать имя, отличное от SQLJDBCDriverимени.

Создание файла конфигурации Kerberos

Дополнительные сведения о файлах конфигурации Kerberos см. в разделе Требования Kerberos.

Этот пример представляет собой файл конфигурации домена, где YYYY и ZZZZ являются доменными именами.

[libdefaults]  
default_realm = YYYY.CORP.CONTOSO.COM  
dns_lookup_realm = false  
dns_lookup_kdc = true  
ticket_lifetime = 24h  
forwardable = yes  

[domain_realm]  
.yyyy.corp.contoso.com = YYYY.CORP.CONTOSO.COM  
.zzzz.corp.contoso.com = ZZZZ.CORP.CONTOSO.COM  

[realms]  
        YYYY.CORP.CONTOSO.COM = {  
  kdc = krbtgt/YYYY.CORP. CONTOSO.COM @ YYYY.CORP. CONTOSO.COM  
  default_domain = YYYY.CORP. CONTOSO.COM  
}  

        ZZZZ.CORP. CONTOSO.COM = {  
  kdc = krbtgt/ZZZZ.CORP. CONTOSO.COM @ ZZZZ.CORP. CONTOSO.COM  
  default_domain = ZZZZ.CORP. CONTOSO.COM  
}  

Включение файла конфигурации домена и файла конфигурации модуля входа

Файл конфигурации домена можно включить с помощью параметра -Djava.security.krb5.conf. Файл конфигурации модуля входа можно включить с помощью параметра -Djava.security.auth.login.config.

Например, для запуска приложения можно использовать следующую команду:

Java.exe -Djava.security.auth.login.config=SQLJDBCDriver.conf -Djava.security.krb5.conf=krb5.ini <APPLICATION_NAME>  

Проверка доступности SQL Server по протоколу Kerberos

Выполните следующий запрос в среде SQL Server Management Studio:

select auth_scheme from sys.dm_exec_connections where session_id=\@\@spid

Убедитесь, что имеются достаточные разрешения для выполнения этого запроса.

Ограниченное делегирование

Начиная с версии 6.2, драйвер Microsoft JDBC поддерживает ограниченное делегирование Kerberos. Делегированные учетные данные можно передать в качестве объекта org.ietf.jgss.GSSCredential. Эти учетные данные используются драйвером для установки подключения.

Properties driverProperties = new Properties();
GSSCredential impersonatedUserCredential = [userCredential]
driverProperties.setProperty("integratedSecurity", "true");
driverProperties.setProperty("authenticationScheme", "JavaKerberos");
driverProperties.put("gsscredential", impersonatedUserCredential);
Connection conn = DriverManager.getConnection(CONNECTION_URI, driverProperties);

Подключение Kerberos с использованием имени субъекта, пароля и области

Начиная с версии 6.2 драйвер Microsoft JDBC может установить подключение Kerberos, используя имя субъекта и пароль, переданные в строке подключения.

jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user@REALM;password=****

Для свойства имени пользователя не требуется ОБЛАСТЬ, если пользователь принадлежит default_realm набору в файле krb5.conf. Если userName и password заданы вместе со свойством integratedSecurity=true; и authenticationScheme=JavaKerberos;, то для установки подключения используется значение userName в качестве субъекта Kerberos, а также указанный пароль.

Начиная с Microsoft JDBC Driver 9.4 пользователь может указать область проверки подлинности Kerberos в строке подключения.

jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user;password=****;realm=REALM

Использование проверки подлинности Kerberos на компьютерах UNIX в том же домене

В этом учебнике предполагается, что уже существует работающая настройка Kerberos. Выполните следующий код на компьютере Windows с работающей проверкой подлинности Kerberos, чтобы убедиться, что упомянутые выше значения верны. В случае успешного выполнения код будет выводить "Схема проверки подлинности: KERBEROS" в консоль. Другие флаги времени выполнения, зависимости или параметры драйвера не требуются за пределами указанных. Один и тот же блок кода можно запустить в Linux, чтобы проверить успешные подключения.

SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("<server>");
ds.setPortNumber(1433); // change if necessary
ds.setIntegratedSecurity(true);
ds.setAuthenticationScheme("JavaKerberos");
ds.setDatabaseName("<database>");

try (Connection c = ds.getConnection(); Statement s = c.createStatement();
        ResultSet rs = s.executeQuery("select auth_scheme from sys.dm_exec_connections where session_id=@@spid")) {
    while (rs.next()) {
        System.out.println("Authentication Scheme: " + rs.getString(1));
    }
}
  1. Присоединение к домену клиентского компьютера к тому же домену, что и сервер.
  2. (Необязательно.) Укажите местоположение билета Kerberos по умолчанию. Этот шаг удобнее всего сделать, задав KRB5CCNAME переменную среды.
  3. Получите билет Kerberos, создав новый или поместив имеющийся в расположение билета Kerberos по умолчанию. Чтобы создать билет, используйте терминал и инициализировать билет с помощью kinit USER@DOMAIN.AD пользователя и домена. AD — это субъект и домен соответственно. Например: kinit SQL_SERVER_USER03@EXAMPLE.COM. Билет будет создан в расположении билета по умолчанию или в пути KRB5CCNAME, если он указан.
  4. Терминал запросит пароль, который нужно будет ввести.
  5. Проверьте учетные данные в билете с помощью klist и убедитесь, что учетные данные соответствуют данным, которые вы планируете использовать для проверки подлинности.
  6. Запустите приведенный выше пример кода и убедитесь, что проверка подлинности Kerberos прошла успешно.

Интеграция GSS собственной платформы

Интеграция GSS собственной платформы позволяет приложениям Java использовать собственный GSS-API, а не механизмы шифрования реализации JDK GSS-API. Например, в следующем примере кода показано, как включить использование собственного GSS-API в драйвере:

GSSCredential credential = GSSManager.getInstance().createCredential(null, GSSCredential.DEFAULT_LIFETIME, new Oid("1.2.840.113554.1.2.2"), GSSCredential.INITIATE_ONLY);

SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL("jdbc:sqlserver://<server>;databaseName=<database>;integratedSecurity=true;authenticationScheme=JavaKerberos;");
ds.setGSSCredentials(credential);
ds.getConnection();

try (Connection conn = ds.getConnection()) {
    ResultSet rs = conn.executeQuery("select auth_scheme from sys.dm_exec_connections where session_id=@@spid")) {
    while (rs.next()) {
        System.out.println("Authentication Scheme: " + rs.getString(1));
    }
}

Кроме того, требуются следующие аргументы JVM:

-Dsun.security.jgss.native=true
-Djavax.security.auth.useSubjectCredsOnly=false

Кроме того, можно указать путь к собственной библиотеке GSS.

-Dsun.security.jgss.lib=path/to/native/gss/library // This is optional

Дополнительные сведения о аргументах JVM см. в официальной документации по Java.

Расширенная защита с помощью Kerberos

Вы также можете включить расширенную защиту для Kerberos при использовании драйвера JDBC. Одним из ограничений является то, что для драйвера JDBC при использовании расширенной защиты принудительное шифрование не должно быть включено.

Дополнительные сведения о включении расширенной защиты см. в следующем разделе:

Дополнительные сведения о подключении с шифрованием см. здесь:

См. также

Подключение к SQL Server с помощью JDBC Driver