Аутентификация GSSAPI/SSPI (gssauth)
Использование служб Windows Active Directory для аутентификации пользователей в базе данных Firebird.
Firebird уже поддерживал доверенную аутентификацию Windows на Windows. Эта возможность была реализована в плагине Win_SSPI для клиента и сервера. Он использует Windows SSPI API и поставщик безопасности NTLM и работает только на Windows.
Windows Active Directory широко поддерживается современными системами Linux, поэтому его службы также могут аутентифицировать пользователей на Linux.
Firebird реализует эту поддержку в плагине безопасности gssauth. Как следует из названия, он использует GSS API для взаимодействия с Active Directory. Он доступен как на Windows, так и на Linux, как для клиента Firebird, так и для сервера Firebird. В большинстве случаев он может заменить Win_SSPI, но это не обязательно — оба плагина могут работать на одном сервере Firebird.
Установка
Для использования Active Directory требуется некоторая подготовка. Хост Windows, на котором работает сервер Firebird, должен быть членом домена Windows. Хост Linux, на котором работает сервер Firebird, должен быть присоединён к Active Directory. Для запуска службы Firebird на Windows требуется учётная запись пользователя домена. Этой учётной записи домена должны быть назначены имена участников службы (SPN), чтобы клиент Firebird мог аутентифицировать сервер Firebird через Active Directory. Ниже приведено краткое руководство по подготовке серверов Windows и Linux со стороны Firebird.
Сервер Firebird на хосте Windows
-
Создайте учётную запись домена для запуска службы Firebird. Установите следующие свойства:
- Пользователь не может изменить пароль
- Срок действия пароля не истекает
-
Установите Firebird и запустите его под этой учётной записью домена. Используйте
instsvcс-loginили измените свойство «Вход в систему от имени» уже установленной службы. -
Добавьте два имени участников службы (SPN) для этой учётной записи. Имя службы —
FirebirdSQL. Один SPN должен использовать короткое имя хоста; другой должен использовать FQDN. Если служба Firebird была создана с помощьюinstsvc, она также регистрирует эти два SPN. В противном случае используйте утилиту Windowssetspn:
setspn -U -S FirebirdSQL/hostname account
setspn -U -S FirebirdSQL/hostname.domain account
Например, если домен — example.com, хост — winfb, а учётная запись — fbsvc:
setspn -U -S FirebirdSQL/winfb fbsvc
setspn -U -S FirebirdSQL/winfb.example.com fbsvc
- Добавьте
gssauthвfirebird.conf(AuthServer):
AuthServer = Srp256, gssauth
-
Установите (или проверьте) разрешения файловой системы для учётной записи домена:
- Доступ на чтение:
firebird.confи другие файлы.conf - Полный доступ: папки с базами данных;
security5.fdb;firebird.logи другие файлы.log
- Доступ на чтение:
-
Добавьте правило брандмауэра для Firebird.
Сервер Firebird на хосте Linux
-
Создайте учётную запись домена на хосте Windows. Установите следующие свойства:
- Пользователь не может изменить пароль
- Срок действия пароля не истекает
-
Добавьте два имени участников службы (SPN) для этой учётной записи. Имя службы —
FirebirdSQL. Один SPN должен использовать короткое имя хоста; другой должен использовать FQDN. Используйте утилиту Windowssetspn:
setspn -U -S FirebirdSQL/hostname account
setspn -U -S FirebirdSQL/hostname.domain account
Например, если домен — example.com, хост — linuxfb, а учётная запись — fbsvc:
setspn -U -S FirebirdSQL/linuxfb fbsvc
setspn -U -S FirebirdSQL/linuxfb.example.com fbsvc
- Создайте файл таблицы ключей Kerberos для сервера Linux с помощью утилиты Windows
ktpass:
ktpass
/out firebird.keytab
/princ FirebirdSQL/[email protected]
/mapuser [email protected]
/pass <password of fbsvc account>
-setpass
/ptype KRB5_NT_PRINCIPAL
/crypto all
Примечания:
- Аргумент
/princчувствителен к регистру; он должен совпадать с тем, что видит хост Linux, на котором будет работать Firebird. -setpassиспользуется, чтобы пароль учётной записи не был изменён./cryptoможно изменить, чтобы избежать устаревших алгоритмов шифрования.- Полная документация по
ktpass: Microsoft ktpass.
-
Убедитесь, что установлен
libgssapi_krb5.so. -
Установите Firebird.
-
Остановите службу Firebird.
-
Добавьте
gssauthвfirebird.conf(AuthServer):
AuthServer = Srp256, gssauth
-
Скопируйте
firebird.keytabс хоста Windows в/opt/firebird(или в папку, где находитсяfirebird.confв вашем дистрибутиве). Установите владельцаfirebird:firebirdи разрешения так, чтобы только пользователь и группа могли его читать. -
Запустите службу Firebird.
Примечание: используйте переменную среды KRB5_TRACE, чтобы задать имя файла трассировки Kerberos для устранения неполадок.
Использование
На Windows плагин gssauth встроен в fbclient.dll, поэтому специальное развёртывание клиента не требуется. На Linux gssauth — это отдельный модуль libgssauth.so, и при необходимости его нужно развёртывать вместе с другими бинарными файлами.
Сервер Firebird должен включать gssauth в список плагинов AuthServer. Клиент Firebird включает gssauth в AuthClient по умолчанию.
Инструменты Firebird, такие как isql, gbak и другие, теперь поддерживают командный ключ -trusted на Linux, как они давно поддерживают его на Windows.
Создайте сопоставление в базе данных пользователей или базе данных безопасности, чтобы сопоставить пользователей домена с пользователями Firebird. Примечание: gssauth сообщает только полные имена пользователей и групп (включая префикс домена), тогда как Win_SSPI сообщает две формы для каждой группы (с доменом и без него) — учитывайте это при создании сопоставлений. Кроме того, на Linux имена пользователей/групп домена могут отображаться в несколько иной форме, чем в Active Directory (в нижнем регистре, без префикса домена и т. д.). Проверьте точное представление с помощью команд Linux, таких как id и groups.
Примеры сопоставлений
Сопоставить каждого пользователя как есть:
CREATE GLOBAL MAPPING GSS_USERS
USING PLUGIN GSSAUTH
FROM ANY USER
TO USER;
Сопоставить администраторов домена как RDB$ADMIN на сервере Linux:
CREATE GLOBAL MAPPING GSS_ADMINS
USING PLUGIN GSSAUTH
FROM GROUP 'domain admins'
TO ROLE RDB$ADMIN;
Сопоставить администраторов домена как RDB$ADMIN на сервере Windows:
CREATE GLOBAL MAPPING GSS_ADMINS
USING PLUGIN GSSAUTH
FROM GROUP 'EXAMPLE\Domain Admins'
TO ROLE RDB$ADMIN;