Django подключает SQL Server, используя пользователя активного каталога

Я использую Django и mssql-django backend для подключения к SQL Server. Нет проблем с подключением к SQL Server при использовании sql login. Но когда я пытаюсь подключиться, используя пользователя AD, я получаю исключение:

django.db.utils.InterfaceError: 
('28000', "[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]
Login failed for user 'DOMAIN\\myuser'. (18456) (SQLDriverConnect); 
[28000] [Microsoft][ODBC Driver 17 for SQL Server]Invalid connection string attribute (0); 
[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user 'DOMAIN\\myuser'. (18456); 
[28000] [Microsoft][ODBC Driver 17 for SQL Server]Invalid connection string attribute (0)")

Мои настройки базы данных в settings.py следующие:

DATABASES = {
    'default': {
        'ENGINE': 'mssql',
        'NAME': os.environ.get('DB_NAME', 'djangodb'),
        'USER': os.environ.get('USER', 'DOMAIN\myuser'),
        'PASSWORD': os.environ.get('USER_PASS', 'mypass'),        
        'HOST': os.environ.get('HOST', 'server.blabla.net'),      
        'PORT': '',  

        'OPTIONS': {           
            'driver': 'ODBC Driver 17 for SQL Server',              
        },
    },
}

Что я делаю неправильно?

Пользователи Active Directory (AD) не могут быть указаны в качестве USER в строке подключения при попытке аутентификации с помощью Windows Authentication (Trusted Connection/Integrated Security [SSPI])

Можно аутентифицироваться с помощью этого метода, но необходимо использовать Kerberos для аутентификации в AD, чтобы получить соответствующие учетные данные, которые драйвер может использовать для аутентификации.

В опциях Django DATABASES укажите, пожалуйста, опцию Encrypt=yes, возможно, она не нужна для вашего экземпляра, но при использовании 18 Driver я считаю ее необходимой, особенно при использовании незашифрованного соединения.

    "OPTIONS": {
        "driver": "ODBC Driver 18 for SQL Server",
        "extra_params": "Encrypt=yes;Trusted_Connection=yes",
    },

Развертывание приложения драйвера ODBC для Linux или macOS, разработанного для запуска в качестве службы

Развертывание приложения драйвера ODBC для Linux или macOS, предназначенного для запуска в качестве службы Системный администратор может развернуть приложение для запуска в качестве службы, которое использует аутентификацию Kerberos для подключения к SQL Server.

Сначала необходимо настроить Kerberos на клиенте, а затем убедиться, что приложение может использовать учетные данные Kerberos принципала по умолчанию.

Убедитесь, что вы используете kinit или PAM (Pluggable Authentication Module) для получения и кэширования TGT для принципала, который использует соединение, одним из следующих методов:

Запустите kinit, передав имя и пароль принципала.

Запустить kinit, передав имя принципала и расположение файла keytab, содержащего ключ принципала, созданный ktutil.

Убедитесь, что вход в систему был осуществлен с помощью Kerberos PAM (Pluggable Authentication Module).

Когда приложение работает как служба, поскольку мандаты Kerberos истекают по умолчанию, обновите мандаты, чтобы обеспечить постоянную доступность службы. Драйвер ODBC не обновляет учетные данные самостоятельно; убедитесь, что есть задание cron или сценарий, который периодически запускается для обновления учетных данных до истечения срока их действия. Чтобы не требовать пароль при каждом обновлении, можно использовать файл keytab.

.

Также интересно посмотреть исходный код в mssql-django, который даст больше информации о том, какие опции выбираются при подключении к экземпляру SQL Server. mssql-django: base.py

Проверьте этот связанный вопрос SO: Строка подключения с использованием аутентификации Windows

Вернуться на верх