Не давать юзеру создавать объекты (таблицы, вьюхи, генераторы етц). Как ?

Таблоид
Дата: 21.08.2012 20:27:07
hi all

Наверное, баян, сильно не пинайте: как запретить юзеру создавать новые объекты в БД ?
C:\MIX\firebird\fb25>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 't2.fdb'; commit;
SQL> create role norights_role;
SQL> create user norights_user password '123';
SQL> commit;
SQL> grant norights_role to norights_user;
SQL> commit;
SQL> connect 't2.fdb' user norights_user role norights_role password '123';
Database: 't2.fdb', User: norights_user, Role: NORIGHTS_ROLE

SQL> set list on; -- проверим еще раз, что мы вошли как "бесправный юзер":
SQL> select current_user,current_role from rdb$database;

USER NORIGHTS_USER
ROLE NORIGHTS_ROLE


SQL> set list off;
SQL> create table t(id int); -- как ему запретить это делать ?
SQL> commit;
SQL> insert into t values(1);
SQL> commit;
SQL> select * from t;

ID
============
1

SQL> create view v_t as select * from t; commit;
SQL> create sequents gen_t; commit;
SQL> create sequence gen_t; commit;

SQL> show version;
ISQL Version: WI-V2.5.2.26520 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.2.26520 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.2.26520 Firebird 2.5/XNet (CSPROG)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.2.26520 Firebird 2.5/XNet (CSPROG)/P12"
on disk structure version 11.2
Dimitry Sibiryakov
Дата: 21.08.2012 20:36:07

Таблоид
Наверное, баян

RTFM

Posted via ActualForum NNTP Server 1.5

Таблоид
Дата: 21.08.2012 20:51:57
Dimitry Sibiryakov,

не пропёрло!
пересоздал базу с нуля, дальше выполнил в ней скрипт, на который ты указал.
Дальше делаю:
SQL> commit;
SQL> create role norights_role; -- её надо снова создать, т.к. роли хранятся в базе, а не в sec2.fdb
SQL> grant norights_role to norights_user;
SQL> commit;
SQL> connect 't2.fdb' user norights_user role norights_role password '123';
Database: 't2.fdb', User: norights_user, Role: NORIGHTS_ROLE
SQL> set list on;
SQL> select current_user,current_role from rdb$database;

USER NORIGHTS_USER
ROLE NORIGHTS_ROLE


SQL> set list off;
SQL> create table t(id int); -- прокатило! why ??
SQL> commit;
Basil A. Sidorov
Дата: 21.08.2012 21:29:01
Таблоид
Наверное, баян, сильно не пинайте: как запретить юзеру создавать новые объекты в БД ?
Наиболее прямолинейный вариант - n плюс один пользователь. Один пользователь - служебный, от его имени и создаются базы. Остальные - "рабочие" - именно их логины известны приложению.
Cobalt747
Дата: 22.08.2012 10:07:29
Таблоид,

А у Public ты отозвал права?
Таблоид
Дата: 22.08.2012 12:12:00
Cobalt747,

да, пробовал также с предварительным отзывом прав.
Не взлетело:
C:\MIX\firebird\fb25>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 't2.fdb'; commit;
-- далее подсовываю ему скрипт:
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;
commit;
--------------------------------------------
set warnings off;
-- revokes all from PUBLIC role:
revoke all on rdb$character_sets from public;
revoke all on rdb$check_constraints from public;
revoke all on rdb$collations from public;
revoke all on rdb$database from public;
revoke all on rdb$dependencies from public;
revoke all on rdb$exceptions from public;
revoke all on rdb$field_dimensions from public;
revoke all on rdb$fields from public;
revoke all on rdb$files from public;
revoke all on rdb$filters from public;
revoke all on rdb$formats from public;
revoke all on rdb$function_arguments from public;
revoke all on rdb$functions from public;
revoke all on rdb$generators from public;
revoke all on rdb$index_segments from public;
revoke all on rdb$indices from public;
revoke all on rdb$log_files from public;
revoke all on rdb$pages from public;
revoke all on rdb$procedure_parameters from public;
revoke all on rdb$procedures from public;
revoke all on rdb$ref_constraints from public;
revoke all on rdb$relation_constraints from public;
revoke all on rdb$relation_fields from public;
revoke all on rdb$relations from public;
revoke all on rdb$security_classes from public;
revoke all on rdb$transactions from public;
revoke all on rdb$trigger_messages from public;
revoke all on rdb$triggers from public;
revoke all on rdb$types from public;
revoke all on rdb$user_privileges from public;
revoke all on rdb$view_relations from public;
set warnings on;
commit;
-----------------------
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;
commit;

create role norights_role;
commit;
grant norights_role to norights_user;
commit;
connect 't2.fdb' user norights_user role norights_role password '123';
set list on;
select current_user,current_role from rdb$database;
set list off;
show roles;
commit;

Вывод скрипта:
Database:  't2.fdb', User: norights_user, Role: NORIGHTS_ROLE

USER NORIGHTS_USER
ROLE NORIGHTS_ROLE


NORIGHTS_ROLE

Теперь создаю таблицу, дропаю её, снова создаю - всё работает.
В том числе и право заталкивать в неё столько строк, сколько захочу:
SQL> create table t(id int);
SQL> commit;
SQL> drop table t;
SQL> commit;
SQL> create table t(b blob); commit;
SQL> insert into t select list(gen_uuid()) from rdb$fields,rdb$fields,rdb$fields; commit;
Таблоид
Дата: 22.08.2012 12:36:21
PS. А вообще, весело получается. Любой юзер, имеющий возможность всего лишь право коннекта к базе, запросто может увеличить её размер до любых значений. Таблицы создавать при этом не надо - всё само получится: главное знать, что временные блобы всегда пишутся в базу :-)
+
C:\MIX\firebird\fb25>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 't0.fdb'; commit;
SQL> create user tmp120822 password '123'; commit;
SQL> connect t0.fdb user tmp120822 password '123';
Database: t0.fdb, User: tmp120822
SQL> commit;
SQL> set transaction read only read committed;
SQL> set list on;
SQL> select current_user,current_role from rdb$database;

USER TMP120822
ROLE NONE


SQL> set list off;
SQL> shell dir t0.fdb|findstr /i t0.fdb;
22.08.2012 12:10 802 816 T0.FDB
SQL> out nul; select list(gen_uuid()) from rdb$fields,rdb$fields,rdb$fields; out;
SQL> shell dir t0.fdb|findstr /i t0.fdb;
22.08.2012 12:11 37 965 824 T0.FDB
SQL> out nul; select list(gen_uuid()) from rdb$fields,rdb$fields,rdb$fields; out;
SQL> shell dir t0.fdb|findstr /i t0.fdb;
22.08.2012 12:13 78 553 088 T0.FDB
SQL> out nul; select list(gen_uuid()) from rdb$fields,rdb$fields,rdb$fields; out;
SQL> shell dir t0.fdb|findstr /i t0.fdb;
22.08.2012 12:16 113 000 448 T0.FDB
Ранее я приводил аналогичный пример, но не подумал проверить его от имени "бесправного юзера" - там всё от SYSDBA делалось.

Инструмент dbInfo покажет после такого теста, что в базе 97% страниц занято блобами и всего лишь 2% страниц свободно. До тех пор, пока моя невинная read_only-транзакция не соизволит завершиться.
Грустно как-то...
PagesCount%mb
Summary, Total pages27588100107,77
Header100
Write Ahead Log100
Generator Pages100
Unused (free)63322,47
Bad Pages000
Page Inventory Pages100
Transaction Inventory Pages100
Pointer Pages3300,13
Record Pages4200,16
Index Root Pages3300,13
Index Pages5200,2
Blob Pages2679097104,65
SQL Bigot
Дата: 22.08.2012 13:28:12
Таблоид
Дата: 22.08.2012 13:59:59
SQL Bigot,

да, я вспомнил этот топик, спасибо за тынц.
Но там все ведут речь о вставке в какую-то существующую таблицу (с наличием права insert'a в неё).
На самом же деле всё проще: ни таблиц, никаких прав ни на что не нужно. Вообще.
SQL Bigot
Дата: 22.08.2012 14:25:58
Таблоид
SQL Bigot,
Но там все ведут речь о вставке в какую-то существующую таблицу (с наличием права insert'a в неё).


Нет, там artemana показал решение - триггер на системную таблицу, после которого бесправные юзеры не могут создавать объекты БД.
Как там дела у этого триггера с временными блобами - не скажу, надо тестить, но от создания, например, обычных таблиц - он защищает.