Kerberos аутентификация при подключении из Java к MSSQL

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Представляю уважаемому сообществу руководство по настройке доменной аутентификации при работе из 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


  • wget https://download.oracle.com/java/20/latest/jdk-20_linux-x64_bin.rpm
  • yum localinstall jdk-20_linux-x64_bin.rpm
  • wget https://go.microsoft.com/fwlink/?linkid=2222954
  • tar -xf sqljdbc_12.2.0.0_enu.tar


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


  • yum -y install java-11-openjdk java-11-openjdk-devel
  • wget https://download.microsoft.com/download/6/9/9/699205CA-F1F1-4DE9-9335-18546C5C8CBD/sqljdbc_7.4.1.0_enu.tar.gz
  • tar -xf sqljdbc_7.4.1.0_enu.tar.gz

 

Установка 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, буду признателен за комментарии и замечания по теме.
Надеюсь данная статья будет полезна уважаемому сообществу.
Источник: https://habr.com/ru/articles/734030/


Интересные статьи

Интересные статьи

Сравнение объектов является важной функцией объектно-ориентированных языков программирования. В этом руководстве мы рассмотрим некоторые функции языка Java, которые позволяют нам сравнивать объекты. Т...
В данной статье рассмотрены крупные нововведения Java начиная с 8 по 15 версии.
Какие навыки прокачать на старте, где найти ментора, как получить первый опыт командной работы – все эти вопросы знакомы разработчикам-джунам. Изучая Java или C# самостоя...
Казалось бы что здесь такого? подключаем к проекту fabric8-maven-plugin и вперед: сборка, запуск приложения в OpenShift. Но когда изучал хотелось большего понимания этого процесса, а затем хотело...
Сегодня (3 мая) президент Eclipse Foundation Майк Милинкович (Mike Milinkovic) написал в своем блоге об окончательных результатах закрытых переговоров между Oracle и Eclipse Foundation о товарн...