Учебник. Настройка проверки подлинности Active Directory в SQL Server на основе контейнеров Linux
Область применения: SQL Server — Linux
В этом руководстве объясняется, как настроить контейнеры SQL Server на Linux для поддержки проверки подлинности Active Directory, также известной как встроенная проверка подлинности. Общие сведения см. в статье Проверка подлинности Active Directory для SQL Server на Linux.
Примечание.
Текущие рекомендации по настройке сети см. в документации по операционной системе (ОС).
В этом руководстве рассматриваются следующие задачи:
- Установка adutil
- Присоединение узла Linux к домену Active Directory
- Создайте пользователя Active Directory для SQL Server и задайте имя субъекта-службы (SPN) с помощью средства adutil
- Создание файла keytab службы SQL Server
mssql.conf
Создание иkrb5.conf
использование файлов контейнером SQL Server- Подключение файлов конфигурации и развертывание контейнера SQL Server
- Создание имен входа SQL Server на основе Active Directory с помощью Transact-SQL
- Подключение к SQL Server с помощью проверки подлинности Active Directory
Необходимые компоненты
Перед настройкой проверки подлинности Active Directory необходимо выполнить следующие действия.
- В сети есть контроллер домен Active Directory (Windows).
- Установите adutil на хост-компьютере Linux, присоединенном к домену. Дополнительные сведения см. в разделе "Установка adutil ".
Развертывание и подготовка контейнера
Чтобы настроить контейнер, необходимо заранее знать порт, который будет использоваться контейнером на узле. Порт 1433
по умолчанию может быть сопоставлен по-разному на узле контейнера. В этом руководстве порт 5433
на узле будет сопоставлен с портом 1433
контейнера. Дополнительные сведения см. в кратком руководстве по запуску образов контейнеров SQL Server Linux с помощью Docker.
При регистрации имен субъектов-служб (SPN) можно использовать имя узла компьютера или имя контейнера. Однако при подключении к контейнеру необходимо настроить его в соответствии с тем, что вы хотите увидеть.
Убедитесь, что в Active Directory добавлена запись узла пересылки (A
) для IP-адреса узла Linux, сопоставленная с именем контейнера SQL Server. В этом учебнике IP-адрес хост-компьютера sql1
— 10.0.0.10
, а имя контейнера SQL Server — sql1
. Добавьте запись узла пересылки в Active Directory, как показано на снимке экрана. Эта запись гарантирует, что при подключении пользователей к sql1.contoso.com
они будут обращаться к нужному узлу.
В этом руководстве используется среда Azure с тремя виртуальными машинами (ВМ). Первая виртуальная машина выступает в роли контроллера домена Windows с доменным именем contoso.com
. Контроллер домена имеет имя adVM.contoso.com
. Вторая машина — это компьютер Windows с именем winbox
. На нем установлена ОС Windows 10 Desktop, и он используется в качестве клиента со средой SQL Server Management Studio (SSMS). Третья машина — это компьютер с Ubuntu 18.04 LTS. Он имеет имя sql1
, и в нем размещаются контейнеры SQL Server. Все компьютеры присоединены к домену contoso.com
. Дополнительные сведения см. в статье Присоединение SQL Server на узле Linux к домену Active Directory.
Примечание.
Присоединение компьютера контейнера узла к домену не является обязательным, как показано далее в этой статье.
Установка adutil
Чтобы установить adutil, выполните действия, описанные в разделе "Введение в adutil — служебная программа Active Directory" на хост-компьютере, присоединенном к домену.
Создание ключа ключа службы Active Directory, имени субъекта-службы и SQL Server
Если вы не хотите, чтобы узел контейнера был частью домена, и не выполнил действия по присоединению компьютера к домену, выполните следующие действия на другом компьютере Linux, который уже входит в домен Active Directory:
Создайте пользователя Active Directory для SQL Server и задайте имя субъекта-службы с помощью adutil.
Создайте и настройте файл keytab службы SQL Server.
mssql.keytab
Скопируйте файл, созданный на главный компьютер, который будет запускать контейнер SQL Server, и настроить контейнер для использования скопированного mssql.keytab
файла. Кроме того, вы можете присоединить узел Linux, который будет запускать контейнер SQL Server в домен Active Directory и выполнять следующие действия на том же компьютере.
Создание пользователя Active Directory для SQL Server и задание имени субъекта-службы с помощью adutil
Включение проверки подлинности Active Directory в контейнерах SQL Server на Linux требует выполнения на компьютере Linux, который является частью домена Active Directory.
Получите или продлите билет предоставления билета (TGT) Kerberos с помощью команды
kinit
. Для выполнения командыkinit
используйте привилегированную учетную запись. Учетная запись должна иметь разрешение на подключение к домену, а также возможность создавать учетные записи и имена субъектов-служб в домене.В этом примере скрипта в контроллере домена уже был создан привилегированный пользователь
privilegeduser@CONTOSO.COM
.kinit privilegeduser@CONTOSO.COM
С помощью adutil создайте нового пользователя, который будет использоваться в качестве привилегированной учетной записи Active Directory sql Server.
adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
Пароли могут быть указаны любым из трех способов:
- Флаг пароля:
--password <password>
- переменные среды:
ADUTIL_ACCOUNT_PWD
; - интерактивный ввод.
Эти способы перечислены в порядке их приоритета. Рекомендуется указывать пароли с помощью переменных среды или интерактивного ввода, так как эти способы более безопасны по сравнению с флагом пароля.
В качестве имени учетной записи можно указать различающееся имя (
-distname
), как показано выше, или имя подразделения. Если указаны оба имени, имя подразделения (--ou
) имеет приоритет над различающимся именем. Чтобы получить дополнительные сведения, можно выполнить следующую команду:adutil user create --help
- Флаг пароля:
Зарегистрируйте имена субъектов-служб для созданного ранее пользователя. При необходимости можно использовать имя хост-компьютера вместо имени контейнера. Это зависит от того, как подключение должно представляться извне. В этом руководстве порт
5433
используется вместо1433
. Это сопоставление портов для контейнера. В вашем случае номер порта может быть другим.adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
addauto
автоматически создаст имена субъектов-служб, если для учетной записи kinit присутствуют достаточные привилегии.-n
: имя учетной записи, к которому будут назначены имена субъектов-служб.-s
: имя службы, используемое для создания имен субъектов-служб. В этом случае это служба SQL Server, поэтому имя службы — MSSQLSvc.-H
: имя узла, используемое для создания имен субъектов-служб. Если не указать, будет использоваться полное доменное имя локального узла. Укажите полное доменное имя для имени контейнера. В этом случае имя контейнера —sql1
, а полное доменное имя —sql1.contoso.com
.-p
: порт, используемый для создания имен субъектов-служб. Если это не указано, имена субъектов-служб создаются без порта. Подключения будут работать только в этом случае, если SQL Server прослушивает порт1433
по умолчанию.
Создание файла keytab службы SQL Server
Создайте файл keytab, содержащий записи для каждого из четырех созданных ранее имен субъектов-служб и одну запись для пользователя. Файл keytab будет подключен к контейнеру, поэтому его можно создать в любом месте на узле. Путь можно спокойно изменять при условии, что итоговый файл keytab будет правильно подключен при использовании docker/podman для развертывания контейнера.
Чтобы создать файл keytab для всех имен субъектов-служб, можно использовать параметр createauto
:
adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
-k
: Путьmssql.keytab
к созданию файла. В предыдущем примере каталог/container/sql1/secrets
уже должен существовать на узле.-p
: порт, используемый для создания имен субъектов-служб. Если это не указано, имена субъектов-служб создаются без порта.-H
: имя узла, используемое для создания имен субъектов-служб. Если это не указано, используется полное доменное имя локального узла. Укажите полное доменное имя для имени контейнера. В этом случае имя контейнера —sql1
, а полное доменное имя —sql1.contoso.com
.-s
: имя службы, используемое для создания имен субъектов-служб. В этом случае это служба SQL Server, поэтому имя службы — MSSQLSvc.--password
: это пароль привилегированной учетной записи пользователя Active Directory, созданной ранее.-e
или--enctype
: типы шифрования для записи keytab. Используйте разделенный запятыми список значений. Если это не указано, будет представлен интерактивный запрос.
Если есть возможность выбрать типы шифрования, то можно выбрать несколько. В этом примере выбраны aes256-cts-hmac-sha1-96
и arcfour-hmac
. Убедитесь, что выбран тип шифрования, поддерживаемый узлом и доменом.
Если вы хотите неинтерактивно выбрать тип шифрования, можно указать тип шифрования с аргументом -e в приведенной выше команде. Для получения дополнительной справки по командам adutil выполните следующую команду.
adutil keytab createauto --help
Внимание
arcfour-hmac
является слабым шифрованием, а не рекомендуемым типом шифрования, используемым в рабочей среде.
Чтобы создать запись keytab для пользователя, выполните следующую команду:
adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
-k
: Путьmssql.keytab
к созданию файла. В предыдущем примере каталог/container/sql1/secrets
уже должен существовать на узле.-p
: субъект, добавляемый в keytab.
Adutil keytab create/autocreate не перезаписывает предыдущие файлы. Он добавляется в файл, если он уже присутствует.
У создаваемого файла keytab должны быть соответствующие разрешения при развертывании контейнера.
chmod 440 /container/sql1/secrets/mssql.keytab
На этом этапе вы можете скопировать mssql.keytab
из текущего узла Linux на узел Linux, где будет развернут контейнер SQL Server, и следуйте остальным инструкциям на узле Linux, который будет запускать контейнер SQL Server. Если описанные выше действия были выполнены на том же узле Linux, где будут развернуты контейнеры SQL Server, выполните следующие действия, а также на том же узле.
Создание файлов конфигурации для использования контейнером SQL Server
mssql.conf
Создайте файл с параметрами Для Active Directory. Его можно создать в любом месте на узле, но нужно правильно подключить при выполнении команды docker run. В этом примере файлmssql.conf
был помещен в каталог/container/sql1
, то есть каталог контейнера. Содержимое показаноmssql.conf
следующим образом:[network] privilegedadaccount = sqluser kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
privilegedadaccount
: привилегированный пользователь Active Directory, используемый для проверки подлинности Active Directory.kerberoskeytabfile
: путь в контейнере, в которомmssql.keytab
будет находиться файл.
krb5.conf
Создайте файл, как показано в следующем примере. Регистр имеет значение в этих файлах.[libdefaults] default_realm = CONTOSO.COM default_keytab_name = /var/opt/mssql/secrets/mssql.keytab default_ccache_name = "" [realms] CONTOSO.COM = { kdc = adVM.contoso.com admin_server = adVM.contoso.com default_domain = CONTOSO.COM } [domain_realm] .contoso.com = CONTOSO.COM contoso.com = CONTOSO.COM
Скопируйте все файлы,
mssql.conf
,krb5.conf
,mssql.keytab
в расположение, которое будет подключено к контейнеру SQL Server. В этом примере такие файлы размещаются на узле в следующих расположениях:mssql.conf
иkrb5.conf
в/container/sql1/
.mssql.keytab
размещается в расположении/container/sql1/secrets/
.Убедитесь, что пользователь, выполняющий команду docker или podman, имеет достаточные права для этих папок. При запуске контейнера пользователю потребуется доступ к созданному пути к папке. В этом примере мы предоставили следующие права к пути к папке:
sudo chmod 755 /container/sql1/
Подключение файлов конфигурации и развертывание контейнера SQL Server
Запустите контейнер SQL Server и подключите правильные файлы конфигурации Active Directory, созданные ранее:
Внимание
Переменная среды SA_PASSWORD
является нерекомендуемой. Вместо этого используйте MSSQL_SA_PASSWORD
.
sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
-p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
-d mcr.microsoft.com/mssql/server:2019-latest
Внимание
Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.
При запуске контейнера в LSM (модуль безопасности Linux), например на узлах с системой SELinux, необходимо подключить тома с использованием параметра Z
, который предписывает docker применить к содержимому метку закрытых данных без общего доступа. Дополнительные сведения см. в разделе о настройке метки selinux.
Наш пример включает следующие команды:
sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/ \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
--dns-search contoso.com \
--dns 10.0.0.4 \
--add-host adVM.contoso.com:10.0.0.4 \
--add-host contoso.com:10.0.0.4 \
--add-host contoso:10.0.0.4 \
-d mcr.microsoft.com/mssql/server:2019-latest
- Файлы
mssql.conf
иkrb5.conf
находятся на узле по пути/container/sql1
. - Созданный файл
mssql.keytab
находится на узле по пути/container/sql1/secrets
. - Так как наш хост-компьютер находится в Azure, сведения о Active Directory необходимо добавить в
docker run
команду в том же порядке. В нашем примере контроллер доменаadVM
находится в доменеcontoso.com
с IP-адресом10.0.0.4
. В контроллере домена выполняются службы DNS и KDC.
Создание имен входа SQL Server на основе Active Directory с помощью Transact-SQL
Подключитесь к контейнеру SQL Server. Используя следующие команды, создайте имя входа и убедитесь, что она существует. Эту команду можно выполнить с клиентского компьютера (Windows или Linux) под управлением SSMS, Azure Data Studio или любого другого средства командной строки (CLI).
CREATE LOGIN [contoso\amvin]
FROM WINDOWS;
SELECT name
FROM sys.server_principals;
Подключение к SQL Server с проверкой подлинности Active Directory
Чтобы подключиться с помощью SQL Server Management Studio (SSMS) или Azure Data Studio, войдите в SQL Server с учетными данными Windows с использованием имени SQL Server и номера порта (имя может быть именем контейнера или именем узла). В нашем примере имя сервера — sql1.contoso.com,5433
.
Для подключения к SQL Server в контейнере можно также использовать такое средство, как sqlcmd.
sqlcmd -E -S 'sql1.contoso.com,5433'
Ресурсы
- Общие сведения о проверке подлинности Active Directory для SQL Server на Linux и контейнеров
- Устранение неполадок проверки подлинности Active Directory для SQL Server на Linux и контейнеров