[firebase-br] banco + seguro mais com falha de atualização

Juvencio Leite juvenciolsilva em gmail.com
Seg Abr 2 22:08:11 -03 2007


Presados amigos da Lista:

Sempre tive uma curiosidade em como tornar meu banco de dados firebird mais
seguro e encontrei depoid de muita pesquisa, um topico para mudar o usuario
padrao para outro personalizado. O problema que enfrento e referente não a
proteção, mas o efeito que ela causou ao banco, agora ele não permite mais
criar novos registros, não sei dizer se é por não ter um conhecimento maior
do uso do Banco ou se porque há falhas neste metodo. Posto o metodo e desde
ja agradeço se alguem puder me ajudar.

eis o Metodo:

{Quando fazemos o banco de dados para nossas aplicações, ela fica sujeita
apenas ao usuário SYSDBA. Logo, basta que alguém copie o arquivo .gdb e terá
acesso a todas as tabelas, procedimentos, triggers, etc.
Para evitar isso, aplicamos um conjunto de comandos no próprio bd para
aumentar um pouco a segurança:

1 - Cria-se normalmente o banco de dados com o usuario SYSDBA.

2 - Cria-se um usuário para ser utilizado pelo sistema, como por exemplo,
USERPROTECT

3 - Forneça as permissões para acesso as tabelas:
GRANT ALL ON table TO USERPROTECT WITH GRANT OPTION;
e para acesso às procedures:
GRANT EXECUTE ON PROCEDURE nome_procedimento to USERPROTECT;
esses comandos devem ser aplicados a todas as tabelas e procedures que foram
criadas

4- Remova as permissões do usuario PUBLIC
REVOKE ALL ON table FROM PUBLIC;
esses comandos devem ser aplicados a todas as tabelas e procedures que foram
criadas

5- Forneça as permissões para acesso às tabelas de sistema

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

6- Remova as permissões do usuário PUBLIC
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$FIELDS FROM PUBLIC;
REVOKE ALL ON RDB$FIELD_DIMENSIONS 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$FUNCTIONS FROM PUBLIC;
REVOKE ALL ON RDB$FUNCTION_ARGUMENTS 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$PROCEDURES FROM PUBLIC;
REVOKE ALL ON RDB$PROCEDURE_PARAMETERS FROM PUBLIC;
REVOKE ALL ON RDB$REF_CONSTRAINTS FROM PUBLIC;
REVOKE ALL ON RDB$RELATIONS FROM PUBLIC;
REVOKE ALL ON RDB$RELATION_CONSTRAINTS FROM PUBLIC;
REVOKE ALL ON RDB$RELATION_FIELDS FROM PUBLIC;
REVOKE ALL ON RDB$ROLES FROM PUBLIC;
REVOKE ALL ON RDB$SECURITY_CLASSES FROM PUBLIC;
REVOKE ALL ON RDB$TRANSACTIONS FROM PUBLIC;
REVOKE ALL ON RDB$TRIGGERS FROM PUBLIC;
REVOKE ALL ON RDB$TRIGGER_MESSAGES 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;

Nenhum usuário acessa o banco de dados exceto o usuário USERPROTECT e o
usuario SYSDBA(que é o proprietário do bd).
E somente você sabe da existência do usuario USERPROTECT.
Logo se conseguirmos fazer com que o SYSDBA tenha acesso, somente você terá
acesso, já que sabe da existência do USERPROTECT.
Para isso é preciso criar uma role, porém se for criado a seguinte
role:CREATE ROLE SYSDBA; ocorrerá um erro, pois
o gerenciador não permite que o proprietário do banco crie uma
role que impeça seu acesso.
Para resolver esse problema seguimos os seguintes passos:

- Dê permissão para USERPROTECT à tabela de sistema RDB$ROLES:(ISSO TEM QUE
SER FEITO COM SYSDBA COMO USUARIO)
GRANT ALL ON RDB$ROLES TO USERPROTECT WITH GRANT OPTION;

- Insira a informação:
INSERT INTO RDB$ROLES VALUES ('SYSDBA','SYSDBA');

Com isso, você não terá como acessar o bd com o usuario SYSDBA,pois ele será
bloqueado pela role.
}


-- 
====================================
Desenvolvimento para aplicativos comerciais com
eficiência e segurança.
===================================



Mais detalhes sobre a lista de discussão lista