Представляю уважаемому сообществу руководство по настройке доменной аутентификации при работе из Java с MSSQL.

Данное руководство создано для администраторов БД, с помощью него можно продемонстрировать возможность использования доменной аутентификации для разработчиков Java и DevOps.

Столкнувшись с одной достаточно большой инфраструктурой, в которой широко используется разработка на Java, я был удивлен, что все подключения осуществляются с SQL аутентификацией, что не только не безопасно, но и не удобно. Последней каплей стало предложение распространить на большое количество SQL серверов встроенную учетную запись и создать механизм аудита и плановой смены паролей. Я же решил посмотреть, можно ли из Java работать со встроенной windows аутентификацией. Мой опыт разработчика в основном был связан с разработкой на C# под windows и, соответственно, Java, особенно под linux, была мне в новинку. Но и это препятствие было преодолено.

Итак сразу вывод: Java c использованием MS JDBC драйвера с MSSQL работать может, настройка проста, если Windows машин находится в домене, то вообще ничего делать не нужно, если Windows не в домене или это Linux машина, то нужно настроить DNS и прописать параметры в одном файле krb5.conf/ini.

Не буду утомлять читателей рассказами о проблемах и поисках решений, а сразу приведу пример рабочего кода, комманды установки необходимых пакетов и комманды запуска с указанием пути до JDBC.

Тестовый стенд


  • Домен p4.local, два контроллера, с DNS, Win Server 2019. Никаких специальных настроек Kerberos не производилось;
  • SQLCore1 Win Server 2019, машина в домене, standalone SQL Server 2019 (работает под локальной сервисной учетной записью SPN поумолчанию);
  • Ws1-test Win10 LTSC, не доменная машина;
  • CentOSJava1 7.9.2009 (Core) Java 20;
  • CentOSJava2 7.9.2009 (Core) Java 11;
  • Доменная учетная запись p4\javaWin c паролем !Qaz123wsx .

Настройка CentOS


  • Необходимо прописать доменные dns либо при установке, либо в интерфейсе nmtui
  • Yum update
  • Yum -y install wget (нужен для скачивания архивов)
  • Yum -y install krb5-workstation (позволяет CentOS работать с Kerberos)
  • Работаем из-под пользователя root, в домашнем каталоге.

Установка Java 20 и JDBC 12 на CentOSJava1



Установка Java 11 и JDBC 7 на CentOSJava2



 

Установка Java на Windows


Для запуска нескомпилированных файлов с кодом (.java) на виндовс необходимо установить пакет JDK https://docs.oracle.com/en/java/javase/20/install/installation-jdk-microsoft-windows-platforms.html

файл /etc/krb5.conf для Linux
# Configuration snippets may be placed in this directory as well
includedir
/etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors =FILE:/etc/pki/tls/certs/ca-bundle.crt

default_realm =
P4.LOCAL
default_ccache_name =
KEYRING:persistent:%{uid}

[realms]
 P4.LOCAL = {
kdc = p4.local
admin_server =
p4.local
}

[domain_realm]
 .p4.local = P4.LOCAL
  p4.local = P4.LOCAL
 

файл C:\windows\krb5.ini для windows
[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
default_realm =P4.LOCAL
 default_ccache_name =
KEYRING:persistent:%{uid}

[realms]
 P4.LOCAL = {
kdc = p4.local
admin_server =
p4.local
}

[domain_realm]
 .p4.local = P4.LOCAL
  p4.local = P4.LOCAL
 
Сам код Java который будет проверять тип подключения к MSSQL выполняя следующий запрос:
select @@servername as srv, system_user as usr, auth_scheme from sys.dm_exec_connections where session_id=@@spid

файл KerbautApplication.java
package com.example.kerbaut;

import java.sql.*;

public class KerbautApplication {

public static void main(String[] args) {

String connectionUrl = «jdbc:sqlserver://sqlcore1.p4.local:1433;integratedSecurity=true;authenticationScheme=JavaKerberos;domain=p4.local;userName=javawin;password =!Qaz123wsx;trustServerCertificate=true»;

try (Connection con = DriverManager.getConnection(connectionUrl); Statement stmt = con.createStatement();) {
String SQL = «select @@servername as srv, system_user as usr, auth_scheme from sys.dm_exec_connections where session_id=@@spid »;
ResultSet rs = stmt.executeQuery(SQL);
System.out.println(SQL);
while (rs.next()) {
System.out.println(rs.getString(1 )+ " " +rs.getString(2 ) + " " + rs.getString(3 ));
}
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
 

Запуск для java 20 и 12 JDBC на CentOSJava1


java -cp .:/root/sqljdbc_12.2/enu/mssql-jdbc-12.2.0.jre11.jar KerbautApplication.java


 

Запуск для java 11 и 7 JDBC CentOSJava2


java -cp .:/root/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre11.jar KerbautApplication.java


 

Запуск из под windows


java.exe -cp «C:\java\sqljdbc_12.2.0.0_enu\sqljdbc_12.2\enu\mssql-jdbc-12.2.0.jre11.jar» KerbautApplication.java



Я сам не являюсь ни разработчиком Java, ни администратором linux, буду признателен за комментарии и замечания по теме.

Надеюсь данная статья будет полезна уважаемому сообществу.

Комментарии (18)