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

Внимание! В 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

Подпишитесь на новости Firebird в России

Подписаться