Двойное делегирование Kerberos от IIS к серверу SQL (с использованием django) - PullRequest
0 голосов
/ 31 августа 2018

Мне нужно передать учетные данные (встроенную аутентификацию Windows) с веб-сайта django в IIS на внутренний сервер SQL, чтобы он работал в надлежащем пользовательском контексте.

Так выглядит моя установка :

  1. Запуск SQL Server на sql_sever.domain.com под учетной записью службы domain\svc_sqlserver
  2. Запуск веб-сайта Django на app_server.domain.com с использованием IIS под учетной записью службы domain\svc_appserver с аутентификацией Windows и олицетворением ASP.Net (для провайдеров установлено значение Negotiate:Kerberos -> Negotiate -> NTLM) с useAppPoolCredentials=True
  3. Подключение к серверу SQL из django с использованием аутентификации Windows путем установки Trusted_Connection=yes в соединении
  4. Сконфигурированные имена SPN для аутентификации Kerberos как для domain\svc_sqlserver, так и domain\svc_appserver:

    setspn -a HTTP/app_server                          domain\svc_appserver
    setspn -a HTTP/app_server.domain.com               domain\svc_appserver
    setspn -a MSSQLSvc/sql_server.domain.com:PORT      domain\svc_sqlserver
    setspn -a MSSQLSvc/sql_server.domain.com:INSTANCE  domain\svc_sqlserver
    setspn -a MSSQLSvc/sql_server.domain.com           domain\svc_sqlserver
    
  5. Доверенные как svc_sqlserver и svc_appserver для делегирования MSSQLSvc службам и дополнительно для domain\svc_appserver Я также добавил HTTP служб (из приведенного выше списка)

Результат

  1. Проверка подлинности Kerberos работает на SQL Server. Подтверждено просмотром схемы авторизации подключенных пользователей
  2. Проверка подлинности Kerberos работает на веб-сайте Django. Подтверждено проверкой WWW-Authenticate заголовка ответа и Authorization заголовка запроса (Negotiate используется правильно)
  3. Сервер Sql работает только в контексте domain\svc_appserver, когда он должен работать под domain\remote_user

Я работаю над этим уже больше недели, но я не могу понять, как передать контекст аутентифицированного пользователя из IIS в SQL Server. Я просмотрел сотни ссылок, которые нашел в Интернете, и я не уверен, что делать на этом этапе.

Есть что-то еще, что я пропускаю? Есть ли способ в Django установить контекст пользователя перед установлением соединения с базой данных? Если кто-то может помочь, я был бы очень признателен. Спасибо!

Я использую :

1 Ответ

0 голосов
/ 31 августа 2018

Я не верю, что олицетворение было реализовано для всего, что работает в рабочих процессах FastCGI или Kestrel. Смотрите, например, для ядра ASP.NET:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-2.1&tabs=aspnetcore2x#impersonation

Если вы используете базовую аутентификацию HTTP, которая требует от пользователя ввода пароля, вы можете выполнить Вход с использованием Win32 и выполнить олицетворение самостоятельно. Но для NTLM и Kerberos не существует простого способа выдать себя за вызывающего пользователя изнутри вашего процесса python.

Или, если это пользовательское приложение, вы можете использовать Олицетворение SQL или передать идентификатор конечного пользователя в SESSION_CONTEXT , где это может быть видно с помощью серверного кода. Для этого также возможно улучшить django-pyodbc-azure.

Единственное, что я могу подумать, это развернуть свой собственный хостинг Django, реализовав ASP.NET HttpHandler , который олицетворяет пользователя и управляет процессами python , работающими под идентификацией конечного пользователя .

...