Как закрыть доступ к системным таблицам

! В InterBase 6.5 и выше введена новая система безопасности системных таблиц. См. документацию и скрипты в каталоге examples\security. Все нижеизложенное при выполнении на InterBase 6.5 или 7.x может привести к непредсказуемым результатам.

При создании БД InterBase системная таблица "RDB$USER_PRIVILEGES" не содержит записей, следовательно для не-SYSDBA пользователей нет никаких ограничений на доступ к системным таблицам.
Это означает, что любой пользователь может не только создавать и модифицировать объекты базы данных, но и "в прямую" модифицировать системные таблицы вплоть до удаления записей. Это справедливо и для "ISC4.GDB" ! (При создании обычных таблиц RDB$USER_PRIVILEGES заполняется, и изначально правами обладает создатель таблицы.)

Однако ситуацию легко исправить, выполнив следующую последовательность DSQL команд:

"GRANT ALL ON RDB$CHARACTER_SETS TO SYSDBA"
/* ...
... и т.д. для всех системных таблиц. После этого все пользователи кроме SYSDBA теряют какой-либо доступ к системным таблицам и, как следствие возможность работы с базой данных ...
далее: */

"GRANT SELECT ON RDB$CHARACTER_SETS TO PUBLIC"
/* ...
... и т.д. для всех системных таблиц */

Теперь пользователи могут работать с обычными (несистемными) таблицами и другими объектами базы данных, но не могут изменять структуру базы данных т.к. мета-данные доступны только "на чтение". Для большинства приложений этого уже достаточно. Если возникнет необходимость, можно настроить доступ более "тонко" и избирательно позволить модифицировать те или иные мета-данные.

В случае с базой данных "ISC4.GDB" можно не давать пользователям доступа к системным таблицам, а допустить их лишь к таблицам "HOST_INFO" и "USERS".
При этом пользователи будут иметь возможность подключаться к серверу, работать с обычными базами данных, но не смогут даже просматривать мета-данные "ISC4.GDB".

примечание: в InterBase 4.5 будет введен синтаксис GRANT ROLE, поэтому необходимость в подобных действиях отпадет.



Пример скрипта (перечислены все системные таблицы):

CONNECT "MYSERVER:C:/MYDIR/TEST.GDB" USER "SYSDBA" PASSWORD "masterkey";

GRANT ALL ON RDB$CHARACTER_SETS TO SYSDBA;
GRANT ALL ON RDB$CHECK_CONSTRAINTS TO SYSDBA;
GRANT ALL ON RDB$COLLATIONS TO SYSDBA;
GRANT ALL ON RDB$DATABASE TO SYSDBA;
GRANT ALL ON RDB$DEPENDENCIES TO SYSDBA;
GRANT ALL ON RDB$EXCEPTIONS TO SYSDBA;
GRANT ALL ON RDB$FIELD_DIMENSIONS TO SYSDBA;
GRANT ALL ON RDB$FIELDS TO SYSDBA;
GRANT ALL ON RDB$FILES TO SYSDBA;
GRANT ALL ON RDB$FILTERS TO SYSDBA;
GRANT ALL ON RDB$FORMATS TO SYSDBA;
GRANT ALL ON RDB$FUNCTION_ARGUMENTS TO SYSDBA;
GRANT ALL ON RDB$FUNCTIONS TO SYSDBA;
GRANT ALL ON RDB$GENERATORS TO SYSDBA;
GRANT ALL ON RDB$INDEX_SEGMENTS TO SYSDBA;
GRANT ALL ON RDB$INDICES TO SYSDBA;
GRANT ALL ON RDB$LOG_FILES TO SYSDBA;
GRANT ALL ON RDB$PAGES TO SYSDBA;
GRANT ALL ON RDB$PROCEDURE_PARAMETERS TO SYSDBA;
GRANT ALL ON RDB$PROCEDURES TO SYSDBA;
GRANT ALL ON RDB$REF_CONSTRAINTS TO SYSDBA;
GRANT ALL ON RDB$RELATION_CONSTRAINTS TO SYSDBA;
GRANT ALL ON RDB$RELATION_FIELDS TO SYSDBA;
GRANT ALL ON RDB$RELATIONS TO SYSDBA;
GRANT ALL ON RDB$SECURITY_CLASSES TO SYSDBA;
GRANT ALL ON RDB$TRANSACTIONS TO SYSDBA;
GRANT ALL ON RDB$TRIGGER_MESSAGES TO SYSDBA;
GRANT ALL ON RDB$TRIGGERS TO SYSDBA;
GRANT ALL ON RDB$TYPES TO SYSDBA;
GRANT ALL ON RDB$USER_PRIVILEGES TO SYSDBA;
GRANT ALL ON RDB$VIEW_RELATIONS TO SYSDBA;

/* эти четыре строки нужно выполнять только для ISC4.GDB */
/* GRANT ALL ON USERS TO SYSDBA; */
/* GRANT ALL ON HOST_INFO TO SYSDBA; */
/* GRANT SELECT ON USERS TO PUBLIC; */
/* GRANT SELECT ON HOST_INFO TO PUBLIC; */

/* эту часть скрипта нужно выполнять для обычных БД, и необязательно - для ISC4.GDB*/

GRANT SELECT ON RDB$CHARACTER_SETS TO PUBLIC;
GRANT SELECT ON RDB$CHECK_CONSTRAINTS TO PUBLIC;
GRANT SELECT ON RDB$COLLATIONS TO PUBLIC;
GRANT SELECT ON RDB$DATABASE TO PUBLIC;
GRANT SELECT ON RDB$DEPENDENCIES TO PUBLIC;
GRANT SELECT ON RDB$EXCEPTIONS TO PUBLIC;
GRANT SELECT ON RDB$FIELD_DIMENSIONS TO PUBLIC;
GRANT SELECT ON RDB$FIELDS TO PUBLIC;
GRANT SELECT ON RDB$FILES TO PUBLIC;
GRANT SELECT ON RDB$FILTERS TO PUBLIC;
GRANT SELECT ON RDB$FORMATS TO PUBLIC;
GRANT SELECT ON RDB$FUNCTION_ARGUMENTS TO PUBLIC;
GRANT SELECT ON RDB$FUNCTIONS TO PUBLIC;
GRANT SELECT ON RDB$GENERATORS TO PUBLIC;
GRANT SELECT ON RDB$INDEX_SEGMENTS TO PUBLIC;
GRANT SELECT ON RDB$INDICES TO PUBLIC;
GRANT SELECT ON RDB$LOG_FILES TO PUBLIC;
GRANT SELECT ON RDB$PAGES TO PUBLIC;
GRANT SELECT ON RDB$PROCEDURE_PARAMETERS TO PUBLIC;
GRANT SELECT ON RDB$PROCEDURES TO PUBLIC;
GRANT SELECT ON RDB$REF_CONSTRAINTS TO PUBLIC;
GRANT SELECT ON RDB$RELATION_CONSTRAINTS TO PUBLIC;
GRANT SELECT ON RDB$RELATION_FIELDS TO PUBLIC;
GRANT SELECT ON RDB$RELATIONS TO PUBLIC;
GRANT SELECT ON RDB$SECURITY_CLASSES TO PUBLIC;
GRANT SELECT ON RDB$TRANSACTIONS TO PUBLIC;
GRANT SELECT ON RDB$TRIGGER_MESSAGES TO PUBLIC;
GRANT SELECT ON RDB$TRIGGERS TO PUBLIC;
GRANT SELECT ON RDB$TYPES TO PUBLIC;
GRANT SELECT ON RDB$USER_PRIVILEGES TO PUBLIC;
GRANT SELECT ON RDB$VIEW_RELATIONS TO PUBLIC;


благодарим Михаила Подстречного за идею и ее описание

(с) 1997 Epsylon Technologies