Kerberos authentication with java

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.

Читайте также:  What is statement in java 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

# 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:%

[realms]
P4.LOCAL = kdc = p4.local
admin_server =
p4.local
> [domain_realm]
.p4.local = P4.LOCAL
p4.local = P4.LOCAL [libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
default_realm =P4.LOCAL
default_ccache_name =
KEYRING:persistent:% [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

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, буду признателен за комментарии и замечания по теме.

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

Источник

Оцените статью