Я использую веб-сервер (в данном случае воздушный поток) на машине Ubuntu 18.04, которой требуется доступ к базе данных SQL Server, которая находится в домене / AD.
В: Как я могу использовать аутентификацию Kerberos в службе systemd для доступа к базе данных MSSQL в домене?
Подвопрос: Как автоматизировать продление билетов? Я трудился с k5start какое-то время безуспешно, есть ли стандартизированный способ сделать это?
Запуск из оболочки:
airflow@airflow:~$ kinit airflow@EXAMPLE.COM
Password for airflow@EXAMPLE.COM:
airflow@airflow:~$ klist -A
Ticket cache: KEYRING:persistent:478604841:478604841
Default principal: airflow@EXAMPLE.COM
Valid starting Expires Service principal
11/08/2019 22:34:41 11/09/2019 08:34:41 krbtgt/EXAMPLE.COM@EXAMPLE.COM
renew until 11/09/2019 08:34:41
airflow@airflow:~$ airflow webserver
Результат: веб-сервер успешно подключается к SQL Server через Kerberos.
Боковое примечание: после запуска веб-сервера, как указано выше, klist
показывает SPN SQL Server:
airflow@airflow:~$ klist
Ticket cache: KEYRING:persistent:478604841:478604841
Default principal: airflow@EXAMPLE.COM
Valid starting Expires Service principal
11/08/2019 23:00:22 11/09/2019 09:00:18 MSSQLSvc/dbserver.example.com:1433@EXAMPLE.COM
renew until 11/15/2019 23:00:14
11/08/2019 23:00:18 11/09/2019 09:00:18 krbtgt/EXAMPLE.COM@EXAMPLE.COM
renew until 11/15/2019 23:00:14
Kinit затем запустить службу
airflow@airflow:~$ kinit airflow@EXAMPLE.COM
airflow@airflow:~$ sudo service airflow-webserver start
airflow@airflow:~$ journalctl -u airflow-webserver.service -xe
Вывод
Nov 08 18:12:11 airflow airflow[54723]: File "/home/EXAMPLE.COM/airflow/.pyenv/versions/3.7.4/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 481, in connect
Nov 08 18:12:11 airflow airflow[54723]: return self.dbapi.connect(*cargs, **cparams)
Nov 08 18:12:11 airflow airflow[54723]: sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY000', '[HY000] [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_478604841) (851968) (SQLDriverConnect)')
Nov 08 18:12:11 airflow airflow[54723]: (Background on this error at: http://sqlalche.me/e/dbapi)
/etc/krb5.conf
[libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
ccache_type = 5
default_ccache_name = KEYRING:persistent:%{uid}
default_client_keytab_name = /home/%d/%u.keytab
[realms]
EXAMPLE.COM = {
kdc = exampledc1.example.com
kdc = exampledc2.example.com
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
/etc/systemd/system/airflow-webserver.service
[Unit]
Description=Airflow web server daemon
After=network.target
[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart = /home/EXAMPLE.COM/airflow/.pyenv/versions/3.7.4/bin/airflow webserver
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Обычный способ сделать это - иметь отдельный сервис, который обновляет ваш билет Kerberos, а в сервисе MS SQL установите KRB5CCNAME
переменную среды на путь к кешу учетных данных, который другая служба поддерживает в обновленном состоянии.
В сервисе MS SQL:
# systemd service file
...
[Service]
Environment="KRB5CCNAME=FILE:/tmp/cache.tkt"
...
Вот услуга «освежения»:
[Unit]
Description=My Kerberos Ticket Service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/k5start -U -f /path/to/keytab \
-k /tmp/cache.tkt -l 10h -K 30 \
-m 600 -o root -g root
# Restart on any failure after 5 seconds
Restart=on-failure
RestartSec=5s
Возможно, вам потребуется настроить права доступа к файлу кэша учетных данных, чтобы убедиться, что служба MS SQL может читать файл. Вам, конечно, понадобится файл keytab с соответствующими учетными данными.
В последних версиях MIT Kerberos были введены клиентские вкладки ключей. Они используются GSS-API
для получения кеша учетных данных, если он отсутствует. Вам просто нужно найти местоположение по умолчанию:
krb5-config --defcktname
и создайте keytab, используя kadmin
:
ktadd -k <location> airflow@EXAMPLE.COM