Ошибка подключения к MSSQL при запуске приложения .net5 как сервиса Linux

Всем привет.

Разработано web-приложение на C#, кроссплатформенный фреймворк .NET 5.0, публиковано под платформу linux. Web-сервер Nginx с настроенными прокси (*:80->*:5000) и GSS аутентификацией (SPNEGO). Astra Linux сервер введен в домен Windows AD.

Если запускать просто как приложение, то оно запускается и корректно взаимодействует с СУБД MSSQL от имени УЗ запускающего (в строке подключения к СУБД параметр Integrated Security=True). Но данный вариант не подходит т.к. по окончанию сеанса приложение останавливается.

Если же мы запускаем приложение как сервис systemd, то возникают проблемы с аутентификацией. Ругается на Kerberos.

Nginx конфиг прокси:

// Proxy AppNet5
location ^~/appnet/ {
  auth_gss on;
  auth_gss_realm DOMAIN.RU;
  auth_gss_keytab /etc/nginx/keytab/krb5_http.keytab;
  auth_gss_service_name HTTP/servername.domain.ru;
  auth_gss_allow_basic_fallback off;

  proxy_pass http://appnet-http;
  proxy_pass_request_body off;
  proxy_pass_request_headers on;

  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection $http_connection;

  proxy_set_header X-Origin-URI $request_uri;
  proxy_set_header X-Forwarded-Proto $scheme;
}

Файл app.service:

[Unit]
Description=App(http) .NET Web Application running on Linux

[Service]
Type=simple
WorkingDirectory=/var/www/html/net5.http.app
ExecStart=/usr/bin/dotnet /var/www/html/net5.http.app/app.dll
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-App_http
User=*Пользователь из AD*
Group=www-data
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_NOLOGO=true

[Install]
WantedBy=multi-user.target

Строка подключения .net:

"ConnectionStrings": {
"DbCon": "Data Source=serverdb.domain.ru;Initial Catalog=Test_Apps;Integrated Security=True;MultipleActiveResultSets=true;Connect Timeout=120;"
}


    Ошибка получения данных Cannot authenticate using Kerberos.
    Ensure Kerberos has been initialized on the client with 'kinit' and a Service Principal Name has been registered for the SQL Server to allow Kerberos authentication.
    ErrorCode=InternalError, Exception=Interop+NetSecurityNative+GssApiException: GSSAPI operation failed with error - Unspecified GSS failure.
    Minor code may provide more information (SPNEGO cannot find mechanisms to negotiate). at System.Net.Security.NegotiateStreamPal.GssInitSecurityContext(SafeGssContextHandle& context, SafeGssCredHandle credential, Boolean isNtlm, SafeGssNameHandle targetName, GssFlags inFlags, Byte[] buffer, Byte[]& outputBuffer, UInt32& outFlags, Int32& isNtlmUsed) at System.Net.Security.NegotiateStreamPal.EstablishSecurityContext(SafeFreeNegoCredentials credential, SafeDeleteContext& context, String targetName, ContextFlagsPal inFlags, SecurityBuffer inputBuffer, SecurityBuffer outputBuffer, ContextFlagsPal& outFlags) at Microsoft.Data.SqlClient.SNI.SNIProxy.GenSspiClientContext(SspiClientContextStatus sspiClientContextStatus, Byte[] receivedBuff, Byte[]& sendBuff, Byte[] serverName) at Microsoft.Data.SqlClient.SNI.TdsParserStateObjectManaged.GenerateSspiClientContext(Byte[] receivedBuff, UInt32 receivedLength, Byte[]& sendBuff, UInt32& sendLength, Byte[] _sniSpnBuffer) at Microsoft.Data.SqlClient.TdsParser.SNISSPIData(Byte[] receivedBuff, UInt32 receivedLength, Byte[]& sendBuff, UInt32& sendLength)
    Ошибка получения данных в модуле авторизации Cannot authenticate using Kerberos.
    Ensure Kerberos has been initialized on the client with 'kinit' and a Service Principal Name has been registered for the SQL Server to allow Kerberos authentication.
    ErrorCode=InternalError, Exception=Interop+NetSecurityNative+GssApiException: GSSAPI operation failed with error - Unspecified GSS failure.
    Minor code may provide more information (SPNEGO cannot find mechanisms to negotiate). at System.Net.Security.NegotiateStreamPal.GssInitSecurityContext(SafeGssContextHandle& context, SafeGssCredHandle credential, Boolean isNtlm, SafeGssNameHandle targetName, GssFlags inFlags, Byte[] buffer, Byte[]& outputBuffer, UInt32& outFlags, Int32& isNtlmUsed) at System.Net.Security.NegotiateStreamPal.EstablishSecurityContext(SafeFreeNegoCredentials credential, SafeDeleteContext& context, String targetName, ContextFlagsPal inFlags, SecurityBuffer inputBuffer, SecurityBuffer outputBuffer, ContextFlagsPal& outFlags) at Microsoft.Data.SqlClient.SNI.SNIProxy.GenSspiClientContext(SspiClientContextStatus sspiClientContextStatus, Byte[] receivedBuff, Byte[]& sendBuff, Byte[] serverName) at Microsoft.Data.SqlClient.SNI.TdsParserStateObjectManaged.GenerateSspiClientContext(Byte[] receivedBuff, UInt32 receivedLength, Byte[]& sendBuff, UInt32& sendLength, Byte[] _sniSpnBuffer) at Microsoft.Data.SqlClient.TdsParser.SNISSPIData(Byte[] receivedBuff, UInt32 receivedLength, Byte[]& sendBuff, UInt32& sendLength)

Создавали SPN-ы, пересоздавали keytab - не помогает.

Если же в строке подключения вместо Integrated Security=True указываем конкретные учетные данные, то MSSQL отказывает по причине некорректного логина, хотя в логах логин идентичный, что в случае использования Integrated Security=True, что при непосредственном указании УЗ.

Причем отказывает в обоих случаях если запущено как приложение и если запущено как сервис. Ошибка выглядит так:


    Login failed for user 'domain\login'. Reason: Could not find a login matching the name provided.. 
    Logon,Unknown,Error: 18456<c/> Severity: 14<c/> State: 5.

Хотя такой логин 100% есть в списке логинов MSSQL.

Так же пробовали следующее:

  • Создавали expect скрипт для начала сессии (login) и запуска команды kinit. Предполагалось, что аутентификация и авторизация не проходит из-за отсутствия сессии/переменных окружения.
  • Создавали expect скрипт для запуска приложения от имени пользователя.
  • Прописывали Environment в systemd сервисе. Переменные брали через команду env и прописывали как есть.

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


Ответы (0 шт):