InterBase 7.5 Embedded User Authentification (EUA)
kdv, 14.05.2005
последнее обновление: 08.05.2007
Одним из важных нововведений в InterBase 7.5 является аутентификация пользователей, встроенная в базу данных. Давайте сначала посмотрим, как было раньше:
В InterBase для хранения списка пользователей использовалась отдельная, специальная база данных под названием isc4.gdb. В InterBase 7.0 ее имя было сменено на admin.ib, и кроме того, в ibconfig появился параметр ADMIN_DB, который позволяет задать любое имя этой базы данных.

В isc4.gdb/admin.ib находится основная таблица USERS, в которой хранится имя пользователя, пароль, и другие параметры. При подсоединении клиента к базе данных в InterBase происходит следующее:
При этом, для доступа к любой базе данных на этом сервере, пользователь должен быть занесен в isc4/admin. Дальше, в конкретной базе данных, права доступа пользователя определяется выданными ему правами (grant).
Такая схема неудобна для
В InterBase 7.5 добавлена возможность либо отказаться от использования admin.ib, либо комбинировать admin.ib и контроль пользователей в базе данных. Для этого расширены атрибуты ряда системных таблиц, и добавлены новые SQL операторы для управления данной функциональностью (в gsec также добавлена опция -user_database для управления пользователями в таких базах.
Данная функциональность поддерживается только для ODS 11.2, то есть баз данных, созданных в InterBase 7.5. Причем, Предыдущие версии InterBase, например 7.1 и ниже, при попытке подсоединиться к такой базе данных будут выдавать два вида сообщений:
То есть, никаким способом, кроме как из InterBase 7.5 и указав требуемый пароль для конкретного пользователя, хранимого в базе, подсоединиться к этой базе данных нельзя (опустим вариант "взлома" такой БД, то есть ее редактирования в HEX-editor).
Включить EUA в базе можно двумя способами:
ALTER DATABASE ADD ADMIN OPTIONВ любом случае среди системных таблиц баз данных ODS 11.2 всегда присутствует таблица RDB$USERS. Это эквивалент таблицы USERS из admin.ib (добавлены столбцы RDB$DEFAULT_ROLE, RDB$USER_ACTIVE, RDB$USER_PRIVILEGE).
При включении EUA оно сразу становится активным, и в таблице RDB$USERS появляется стандартная запись пользователя SYSDBA с паролем masterkey, и с RDB$USER_PRIVILEGE = 1. После этого при подсоединении к БД сервер игнорирует наличие или отсутствие данного пользователя в admin.ib, а так же его пароль. То есть, при включенной EUA к базе можно подсоединиться только указав точную комбинацию username/password, хранимую в rdb$users.
EUA можно на время деактивировать командой
ALTER DATABASE SET ADMIN OPTION INACTIVE
и активировать
ALTER DATABASE SET ADMIN OPTION ACTIVE
При деактивации во все записи пользователей в RDB$USERS просто выставляется RDB$USER_ACTIVE = 'N', в том числе и для SYSDBA. При активации наоборот, RDB$USER_ACTIVE устанавливается в 'Y', для всех пользователей. Будьте внимательны, если перед деактивацией EUA часть пользователей была заблокирована - при активации EUA к базе данных получат доступ все пользователи (то есть, все учетные записи EUA будут включены).
Удалить EUA целиком и полностью, вместе со всеми записями пользователей, можно командой
ALTER DATABASE DROP ADMIN OPTION
Это очистит таблицу RDB$USERS, и восстановит функционирование стандартной схемы аутентификации (через admin.ib).
После того, как EUA включено, можно управлять пользователями.
{CREATE | ALTER} USER SET
option : PASSWORD
[NO] DEFAULT ROLE
[NO] SYSTEM USER NAME
[NO] GROUP NAME
[NO] UID
[NO] GID
[NO] DESCRIPTION
[NO] FIRST NAME
[NO] MIDDLE NAME
[NO] LAST NAME
ACTIVE
INACTIVE
Примеры:
CREATE USER TEST SET PASSWORD 'TEST', NO LAST NAME, DEFAULT ROLE ABC
В результате будет создан и активен пользователь TEST с паролем TEST, с столбцом LAST_NAME равным NULL, и с ролью по умолчанию ABC (и rdb$user_privilege = 0, то есть "не владелец БД"). То же самое можно выполнить набором команд
CREATE USER TEST SET PASSWORD 'TEST'; ALTER USER TEST SET NO LAST NAME, DEFAULT ROLE ABC;
Обратите внимание, что можно "включать" и "выключать" пользователей командой alter user xxx set inactive/active. В стандартной admin.ib такой возможности нет.
Стоит пояснить, как именно происходит подключение в случае активной EUA в базе данных:
То есть, при включении SYSDBA и смене пароля для SYSDBA, подключиться к данной БД от имени SYSDBA можно будет только указав этот пароль.
! Присутствие admin.ib все равно необходимо. Сервер при попытке соединения с БД требует наличия admin.ib независимо от того, включено EUA в подсоединяемой БД или нет.
Итак, в InterBase 7.5 поддерживается 2 схемы управления пользователями - стандартная и EUA. Это позволяет строить следующие схемы
На рисунке изображен пример, когда два разных пользователя подключаются к разным БД.
Пользователь 1 может подключиться к тем базам данных, где EUA не включен. Для доступа к DB1.IB необходимо создать пользователя USER1 в этой БД, и указать этот же или иной пароль (если необходимо).
Пользователь 2 может подключиться только к DB1.IB. Если его внести в ADMIN.IB, он сможет работать с базами, где EUA не включен.
В данный момент, в версии InterBase 7.5.0.174 обнаружено следующее поведение (исправлено в 7.5.1.162):
После restore столбец rdb$user_privilege таблицы rdb$users имеет значение null. Если для SYSDBA это "незаметно", то в случае, когда владельцем (owner) базы является не SYSDBA, а скажем, пользователь TEST - ни данный пользователь ни остальные пользователи не могут залогиниться к такой БД.
Исправить ситуацию можно залогинившись к этой БД пользователем SYSDBA, и изменив значение указанного столбца с null на 1 для владельца БД, и на 0 для остальных пользователей. После данной процедуры работоспособность EUA восстанавливается.
В Borland это признано багом IB 7.5.0.174. Вариант обхода проблемы: или обновиться до 7.5.1.162 и выше , или
перед backup отключаем EUA (alter database set admin option inactive), а после restore - включаем (alter database set admin option active). Однако, для избежания смены owner (если это не sysdba), в admin.ib должен быть пользователь, который является владельцем БД с EUA.
Иногда, с разными целями, базу данных создают не от имени SYSDBA - например, для того чтобы использовать владельца БД (owner) как "backup user" (при этом все объекты создаются и модифицируются от имени SYSDBA, а owner не может их изменить). В этом случае пользователь, создавший БД, является ее владельцем, и может делать backup/restore оставаясь владельцем как БД так и всех созданных им объектов. При включении EUA и использовании данной техники есть несколько особенностей.
Но, как уже было сказано выше, столбец rdb$user_privilege = NULL, и в результате подсоединиться к восстановленной БД не может ни один пользователь EUA (включая пользователя TEST с паролем test).
Подсоединяемся как TEST/tttt, меняем у записи TEST в rdb$users столбец rdb$user_privilege с null на 0, отсоединяемся, и ... EUA начинает работать опять (см. выше пример временного решения данной проблемы).
Отсюда можно сделать несколько выводов:
Обобщим плюсы и минусы данной функциональности: