Segurança de BDs por concessão de privilégios de acesso a usuários no Oracle

Este artigo apresenta conceitos e um tutorial sobre a concessão de privilégios a usuários autorizados de uma biblioteca, utilizando-se das melhores práticas do SQL juntamente com o Oracle.

A segurança de dados é um requisito de gerenciamento de sistemas de banco de dados que, segundo Date (2003), significa proteger os dados contra usuários não autorizados. A segurança de dados pode ser implementada por meio de mecanismos que garantem a proteção dos mesmos contra uma variedade de ameaças. É ameaça aos bancos de dados qualquer ação que resulte em perdas ou degradação de parte ou da totalidade da integridade, confiabilidade e disponibilidade dos dados.

A perda de integridade refere-se a mudanças não autorizadas nos dados por ações intencionais ou acidentais, que podem ter como consequência decisões imprecisas, fraudulentas ou errôneas. A perda de disponibilidade está relacionada com a não possibilidade de dispor dos dados quando necessários. Já a perda de confidencialidade é ocasionada pela exposição não autorizada de informações confidenciais resultando em perda de confiança pública, constrangimento ou ação legal contra a organização (ELMASRI e NAVATHE, 2011).

De modo a evitar essas perdas, medidas de controle podem ser aplicadas no gerenciamento de sistemas de banco de dados. Conforme Elmasri e Navathe (2011), as mais comuns são controle de acesso, controle de inferência, controle de fluxo e criptografia. Segundo os autores em um sistema de banco de dados que possui muitos usuários, o SGBD precisa oferecer técnicas para permitir que certos usuários acessem apenas partes selecionadas de um banco de dados. No presente artigo enfocarei o mecanismo de controle de acesso.

Segurança de dados

Conforme Ozsu e Valduriez (2001), a segurança de dados inclui dois aspectos: proteção de dados e controle de autorização. A proteção de dados é necessária para evitar que usuários não autorizados conheçam o conteúdo físico dos dados, tendo a criptografia como principal abordagem. Segundo Date (2003), a criptografia é o armazenamento e transmissão de dados confidenciais em forma criptografada. O controle de autorização por sua vez deve garantir que apenas usuários autorizados executem operações que têm permissão sobre o banco de dados.

Conforme Silberschatz, Korth e Sudarshan (1999), a proteção de um banco de dados se dá pela observância de medidas em diversos níveis, são eles: físico, humano, rede, sistema operacional e sistema de banco de dados.

Para Elmasri e Navathe (2011), a segurança de banco de dados é implementada para resolver as seguintes questões:

É comum se utilizar como referência dois tipos de mecanismos de segurança de banco de dados:

Para Date (2003) existem dois aspectos para controle de acesso discriminatório: o mecanismo de visão e o subsistema de autorização. No controle de acesso discriminatório determinado usuário terá direitos de acesso diferentes sobre objetos diferentes. O mecanismo de visões pode ser usado para ocultar dados confidenciais de usuários não autorizados, já o subsistema de autorização permite que usuários que têm privilégios específicos concedam tais privilégios a outros usuários. E posteriormente, se desejarem, revogarem esses privilégios. Entretanto, o mecanismo de visões não permite especificar as operações que usuários autorizados têm permissão para executar, assim essa tarefa é realizada por meio da instrução GRANT.

A seguir utilizaremos o mecanismo de controle de acesso por meio de exemplos onde são utilizados recursos SQL aplicadas para a implementação da segurança de sistemas de bancos de dados.

Controle de acesso

O método mais utilizado para imposição do controle de acesso discricionário baseia-se na concessão e revogação de privilégios. Conforme os autores, de maneira informal, existem dois níveis para se atribuir privilégios de utilização de sistemas de bancos de dados:

De modo a controlar a concessão e revogação de privilégios cada relação em um banco de dados recebe uma conta de proprietário. Tal proprietário recebe todos os privilégios sobre determinada relação. O responsável pela manutenção da conta de proprietário pode conceder privilégios para relações sobre as quais tem privilégio de acesso, a outros usuários. Tais privilégios podem ser:

Para Date (2003), são privilégios válidos: USAGE, UNDER, SELECT, INSERT DELETE, UPDATE, REFERENCES, TRIGGER e EXECUTE. Segundo o autor também é possível especificar ALL PRIVILEGES, porém a semântica não é direta.

Observação: Para criar uma visão (view), o usuário precisa ter o privilégio SELECT em todas as relações envolvidas na definição da mesma.

Estudo de caso – Concedendo papéis e privilégios a usuários de um Sistema de banco de dados de uma biblioteca

O tutorial apresentado neste estudo de caso utiliza como SGDB, o Oracle 11g Express Edition (vide seção Links). O banco de dados ao qual serão concedidas permissões de acesso às relações está representado no modelo Entidade-Relacionamento da Figura 1.

Figura 1. Modelo Entidade-relacionamento do banco de dados de uma biblioteca

Criação do banco de dados

Nessa versão do SGBD Oracle é definido no momento da instalação um banco de dados padrão, por isso, o mesmo dispensa a criação do banco de dados por meio do comando CREATE DATABASE. Assim serão criadas as tabelas do esquema, onde o mesmo é compreendido por relações que representam objetos mais comuns em uma biblioteca. Para criar o banco de dados execute as instruções SQL da Listagem 1.

Listagem 1. Tabelas do banco de dados de uma biblioteca

CREATE TABLE TIPO_USUARIO ( ID_TIPO_USUARIO INT PRIMARY KEY, DESCRICAO VARCHAR (30) NOT NULL, QTD_DIAS_EMPRESTIMO INT NOT NULL, QTD_PUBLICACOES INT NOT NULL ); CREATE TABLE USUARIO ( ID_USUARIO INT PRIMARY KEY, CPF VARCHAR (14) NOT NULL, MATRICULA VARCHAR (10) NOT NULL, NOME_COMPLETO VARCHAR (60) NOT NULL, NOME_USUARIO VARCHAR (20) NOT NULL, SENHA VARCHAR (6) NOT NULL, CATEGORIA_USUARIO VARCHAR (30) NOT NULL, CARGO VARCHAR (50) NOT NULL, SEXO VARCHAR (10) NOT NULL, LOGRADOURO VARCHAR (50) NOT NULL, NUMERO VACHAR (10) NOT NULL, BAIRRO VARCHAR (30) NOT NULL, CIDADE VARCHAR (30) NOT NULL, UF CHAR (2) NOT NULL, TELEFONE VARCHAR (13) NOT NULL, EMAIL VARCHAR (40) NOT NULL, TIPO_USUARIO INT NOT NULL, FOREIGN KEY (TIPO_USUARIO) REFERENCES TIPO_USUARIO (ID_TIPO_USUARIO) ); CREATE TABLE TIPO_PUBLICACAO ( ID_TIPO_PUBLICACAO INT PRIMARY KEY, DESCRICAO VARCHAR (50) NOT NULL ); CREATE TABLE PUBLICACAO ( ID_PUBLICACAO INT PRIMARY KEY, TITULO VARCHAR (50) NOT NULL, ANO_PUBLICACAO INT NOT NULL, ISBN VARCHAR (17), EDITORA VARCHAR (30), EDICAO VARCHAR (10), TIPO_PUBLICACAO INT NOT NULL, FOREIGN KEY (TIPO_PUBLICACAO) REFERENCES TIPO_PUBLICACAO (ID_TIPO_PUBLICACAO) ); CREATE TABLE AUTOR ( ID_AUTOR INT PRIMARY KEY, NOME_AUTOR VARCHAR (60) ); CREATE TABLE PUBLICACAO_AUTOR ( AUTOR INT NOT NULL, PUBLICACAO INT NOT NULL, FOREIGN KEY (AUTOR) REFERENCES AUTOR (ID_AUTOR), FOREIGN KEY (PUBLICACAO) REFERENCES PUBLICACAO (ID_PUBLICACAO) ); CREATE TABLE EXEMPLAR ( ID_EXEMPLAR VARCHAR (10) PRIMARY KEY, STATUS VARCHAR (15) NOT NULL, PUBLICACAO INT NOT NULL, FOREIGN KEY (PUBLICACAO) REFERENCES PUBLICACAO (ID_PUBLICACAO) ); CREATE TABLE OPERADOR ( ID_OPERADOR INT PRIMARY KEY, NOME_USUARIO VARCHAR (20) NOT NULL, SENHA VARCHAR (8) NOT NULL ); CREATE TABLE EMPRESTIMO ( ID_EMPRESTIMO INT PRIMARY KEY, HORADATA_EMPRESTIMO TIMESTAMP NOT NULL, DATA_PREVISTA_DEVOLUCAO DATE NOT NULL, OPERADOR INT NOT NULL, EXEMPLAR VARCHAR (10) NOT NULL, ID_USUARIO INT NOT NULL, FOREIGN KEY (OPERADOR) REFERENCES OPERADOR (ID_OPERADOR), FOREIGN KEY (EXEMPLAR) REFERENCES EXEMPLAR (ID_EXEMPLAR), FOREIGN KEY (ID_USUARIO) REFERENCES USUARIO (ID_USUARIO) ); CREATE TABLE DEVOLUCAO ( DATA_DEVOLUCAO DATE NOT NULL, HORA_DEVOLUCAO TIMESTAMP NOT NULL, ID_EMPRESTIMO INT PRIMARY KEY, OPERADOR INT NOT NULL, FOREIGN KEY (ID_EMPRESTIMO) REFERENCES EMPRESTIMO (ID_EMPRESTIMO), FOREIGN KEY (OPERADOR) REFERENCES OPERADOR (ID_OPERADOR) );

Criando usuários

Consideraremos para este exemplo três usuários principais do Sistema de banco de dados de uma biblioteca: o bibliotecário, o operador do sistema e o estagiário, aos quais serão concedidas as seguintes permissões:

Na Listagem 2 pode ser observada a sintaxe de criação dos três usuários que receberão os privilégios quando a eles forem concedidos os papéis que detêm as permissões explicitadas anteriormente.

Listagem 2. Definindo usuários para a biblioteca

CREATE USER LYSMARIA IDENTIFIED BY "administrator"; CREATE USER LUZIA IDENTIFIED BY "123"; CREATE USER MARILIA IDENTIFIED BY "111";

Repare que o comando CREATE USER permite a definição de um nome para um novo usuário, enquanto que o comando IDENTIFIED BY define a senha para acesso do usuário criado ao banco de dados.

Criando visões

A determinados usuários é concedido o privilégio SELECT, porém apenas dados não confidenciais podem ser recuperados por estes usuários. Assim, as colunas como CPF e SENHA do usuário, pode exemplo, não podem ser visualizadas pelo OPERADOR. Dessa forma há a necessidade de criar visões para controle de recuperação dos dados por usuários autorizados. A Listagem 3 contém a sintaxe de criação da visão que permite recuperar os usuários do banco de dados.

Listagem 3. Criação de visões para controle de recuperação de dados dos usuários

CREATE VIEW LISTARUSUARIOS AS SELECT NOME_COMPLETO, CARGO, TELEFONE, EMAIL FROM USUARIO;

O comando CREATE VIEW define o nome da visão que está sendo criada e o comando AS antecede a consulta que será implementada através da visão, neste caso apenas dados não confidenciais podem ser recuperados.

A Listagem 4 apresenta a sintaxe de criação da visão para controle de recuperação de informações referentes às publicações.

Listagem 4. Criação de visões para controle de recuperação de informações das publicações

CREATE VIEW LISTARPUBLICACOES AS SELECT P.TITULO, A.NOME_AUTOR, P.ANO_PUBLICACAO FROM PUBLICACAO as P, PUBLICACAO_AUTOR as PA, AUTOR as A WHERE P.ID_PUBLICACAO = PA.PUBLICACAO AND PA.AUTOR = A.ID_AUTOR;

O comando CREATE VIEW define o nome da visão que está sendo criada e o comando AS é seguida pela consulta que será implementada pela VIEW, ou seja, neste caso apenas o título, o autor e o ano da publicação poderá ser recuperado.

Criando procedures

Os principais processos realizados em uma biblioteca são empréstimo e devolução, assim serão criados dois procedimentos referentes a esses dois processos.

A Listagem 5 apresenta o procedimento para realização de empréstimos.

Listagem 5. Procedimento para realização de empréstimos

CREATE OR REPLACE PROCEDURE EMPRESTIMOPROCEDURE ( DATA_DEVOLUCAO EMPRESTIMO.DATA_PREVISTA_DEVOLUCAO%TYPE, USUARIO_ID EMPRESTIMO.ID_USUARIO%TYPE, OPERADOR_ID EMPRESTIMO.ID_OPERADOR%TYPE, EXEMPLAR_ID EMPRESTIMO.ID_EXEMPLAR%TYPE ) AS u EMPRESTIMO.ID_USUARIO%TYPE; ex EMPRESTIMO.ID_EXEMPLAR%TYPE; op EMPRESTIMO.ID_OPERADOR%TYPE; BEGIN SELECT ID_USUARIO INTO u FROM SYSTEM.USUARIO WHERE ID_USUARIO = USUARIO_ID; SELECT ID_OPERADOR INTO op FROM SYSTEM.OPERADOR WHERE ID_OPERADOR = OPERADOR_ID; SELECT ID_EXEMPLAR INTO ex FROM SYSTEM.EXEMPLAR WHERE ID_EXEMPLAR = EXEMPLAR_ID; INSERT INTO EMPRESTIMO VALUES (DEFAULT, CURRENT_DATE, CURRENT_TIMESTAMP, DATA_DEVOLUCAO, op, ex, u); UPDATE EXEMPLAR SET STATUS = 'EMPRESTADO' WHERE ID_EXEMPLAR = ex; END EMPRESTIMOPROCEDURE;

Repare que o comando CREATE OR REPLACE PROCEDURE define o nome dado ao procedure e %TYPE atribui aos parâmetros do procedure o mesmo tipo do atributo presente na tabela em questão. Assim o parâmetro USUARIO_ID tem o mesmo tipo do atributo ID_USUARIO da tabela EMPRESTIMO.

AS define ALIAS (ou de maneira informal, apelido), aos atributos da tabela EMPRESTIMO e INTO adiciona o conteúdo ao ALIAS criado.

No procedure, após a instrução BEGIN, os dados são selecionados e adicionados aos ALIAS. Posteriormente os mesmos são inseridos na tabela EMPRESTIMO, logo depois o status do exemplar emprestado, que até então encontrava-se com o valor padrão “LIVRE”, sofre uma modificação de UPDATE e tem seu valor atualizado para “EMPRESTADO”.

O procedure pode ser executado através do seguinte comando:

EXECUTE SYSTEM.EMPRESTIMOPROCEDURE(parâmetros definidos);

Na Listagem 6pode ser observado o código SQL de criação do procedure para a realização de devoluções.

Listagem 6. Sintaxe de criação do procedure DEVOLUCAOPROCEDURE

CREATE OR REPLACE PROCEDURE DEVOLUCAOPROCEDURE ( EXEMPLAR1 EXEMPLAR.ID_EXEMPLAR%TYPE ) AS ex EXEMPLAR.ID_EXEMPLAR%TYPE; BEGIN SELECT ID_EXEMPLAR INTO ex FROM SYSTEM.EMPRESTIMO WHERE ID_EXEMPLAR = EXEMPLAR1; DELETE FROM EMPRESTIMO WHERE ID_EXEMPLAR = ex; UPDATE EXEMPLAR SET STATUS = 'LIVRE' WHERE ID_EXEMPLAR = ex; END DEVOLUCAOPROCEDURE;

O comando CREATE OR REPLACE PROCEDURE define o nome dado ao procedure e %TYPE atribui aos parâmetros do procedure o mesmo tipo do atributo presente na tabela em questão. Assim o parâmetro EXEMPLAR_ID tem o mesmo tipo do atributo ID_EXEMPLAR da tabela EXEMPLAR.

Já o comando AS define ALIAS (ou de maneira informal, apelido), aos atributos da tabela EXEMPLAR. O comando INTO adiciona o conteúdo ao ALIAS criado.

O comando DELETE vai deletar o empréstimo correspondente ao exemplar da publicação devolvida e o comando UPDATE atualiza o status do exemplar devolvido para “LIVRE”.

O procedure pode ser executado através do comando:

EXECUTE SYSTEM.DEVOLUCAOPROCEDURE(parâmetro definido);

Criando papéis

Os papéis que serão criados compreendem basicamente os tipos de usuários bibliotecário, operador e estagiário. A Listagem 7apresenta a sintaxe das instruções para a criação de papéis.

Listagem 7. Definindo papéis para o banco de dados da biblioteca

CREATE ROLE BIBLIOTECARIO; CREATE ROLE OPERADOR; CREATE ROLE ESTAGIARIO;

CREATE ROLE vai permitir a criação de um novo papel que será concedido a determinado usuário. Após a instrução é definido o nome dado ao papel.

Concedendo privilégios aos papéis

Lembre-se que apenas o usuário com papel de bibliotecário terá direito a todos os privilégios. Através da execução da instrução da Listagem 8usuário que deter papel de bibliotecário terá todos os privilégios de relação sobre o esquema em questão, ou seja, considerando que as tabelas do banco dados foram criadas por um usuário com este papel, ele poderá conceder permissões aos demais usuários ou papéis do banco de dados.

Listagem 8. Concessão de privilégios ao BIBLIOTECARIO

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO BIBLIOTECARIO WITH ADMIN OPTION; GRANT SELECT, INSERT, UPDATE, DELETE ON USUARIO TO BIBLIOTECARIO; GRANT EXECUTE ON EMPRESTIMOPROCEDURE TO BIBLIOTECARIO; GRANT EXECUTE ON DEVOLUCAOPROCEDURE TO BIBLIOTECARIO;

O comando GRANT define os privilégios de modificação e SELECT concedidos ao papel BIBLIOTECARIO, são eles: INSERT, UPDATE e DELETE.

O comando CREATE concede ao BIBLIOTECARIO o privilégio de criar novas sessões, relações e visões.

ON define a relação na qual será aplicada os privilégios concedidos e TO deve ser seguido do nome do objeto ao qual estão sendo concedidas as permissões. Nesse caso, as mesmas estão sendo concedidas ao papel BIBLIOTECARIO. O comando EXECUTE permite ao papel BIBLIOTECARIO executar os procedimentos EMPRESTIMOPROCEDURE e DEVOLUCAOPROCEDURE.

O papel OPERADOR detém privilégios de SELECT e modificação, deste último apenas os privilégios INSERT e EXECUTE. Observe na Listagem 9a sintaxe para a concessão desses privilégios ao OPERADOR.

Listagem 9. Concessão de privilégios ao OPERADOR

GRANT CREATE SESSION TO OPERADOR; GRANT SELECT ON LISTARUSUARIOS TO OPERADOR; GRANT INSERT ON USUARIO TO OPERADOR; GRANT EXECUTE ON EMPRESTIMOPROCEDURE TO OPERADOR; GRANT EXECUTE ON DEVOLUCAOPROCEDURE TO OPERADOR;

Vamos entender melhor o código apresentado:

Ao ESTAGIARIO é permitido além da criação de novas sessões, apenas a recuperação de dados referentes a usuários e publicações, portanto a ele é dado o privilégio SELECT sobre as visões LISTARUSUARIOS e LISTARPUBLICACOES. Observe a sintaxe de concessão dessa permissão na Listagem 10;

Listagem 10. Concessão de privilégios ao ESTAGIARIO

GRANT CREATE SESSION TO ESTAGIARIO; GRANT SELECT ON LISTARUSUARIOS TO ESTAGIARIO; GRANT SELECT ON LISTARPUBLICACOES TO ESTAGIARIO;

Os comandos GRANT CREATE define o privilégio a ser concedido, que é o de criar novas sessões. O comando ON é seguido pela VIEW a qual poderá ser visualizada pelo ESTAGIARIO.

Revogando privilégios

Considerando que foram necessárias mudanças nos privilégios concedidos aos usuários do banco de dados e que os operadores não poderão realizar empréstimos nem devoluções, o usuário com privilégios totais deverá revogar os privilégios correspondentes a esses processos, concedidos ao operador. A sintaxe para a revogação desses privilégios pode ser observada na Listagem 11.

Listagem 11. Revogando privilégios concedidos ao papel OPERADOR

REVOKE EXECUTE ON EMPRESTIMOPROCEDURE FROM OPERADOR; REVOKE EXECUTE ON DEVOLUCAOPROCEDURE FROM OPERADOR;

O REVOKE retira do OPERADOR o privilégio de EXECUTE anteriormente concedido, enquanto FROM é seguido pelo objeto do qual revoga-se o privilégio em questão. Neste caso o privilégio de EXECUTE é revogado do papel OPERADOR.

Concedendo papéis aos usuários

A concessão de papéis aos usuários criados pode ser observada na Listagem 12.

Listagem 12. Concedendo papéis a usuários do banco de dados

GRANT BIBLIOTECARIO TO LISMARIA; GRANT OPERADOR TO LUZIA; GRANT ESTAGIARIO TO MARILIA;

A esses papéis foram concedidos privilégios de acordo com a atribuição de cada um em uma biblioteca, assim os usuários aos quais foram concedidos tais papéis consequentemente recebem os mesmos privilégios.

Os mecanismos para a implementação da segurança de sistemas de banco de dados sejam no nível físico, de sistema operacional ou de SGBD são extremamente necessários, tendo em vista que a manutenção dos requisitos integridade, disponibilidade e confidencialidade são imprescindíveis para o bom funcionamento de uma base de dados. O mecanismo de controle de acesso explanado neste artigo por meio de exemplos que se utilizaram de recursos SQL, pertence ao nível de SGBD e se constitui forma eficaz de controle de acesso por usuários autorizados. O mecanismo de controle de acesso permite ainda que outros processos de implementação da segurança de banco de dados, como auditoria, sejam otimizados. Dessa forma conclui-se que o controle de acesso de usuários autorizados a determinado sistema de banco de dados pela concessão ou revogação de privilégios tem eficiência comprovada quando aplicado à implementação da segurança de sistemas de banco de dados.

REFERÊNCIAS

DATE, C. J. INTRODUÇÃO A SISTEMAS DE BANCO DE DADOS. 4. reimpressão. Rio de Janeiro: Elsevier, 2003.

ELMASRI, Ramez e NAVATHE, Shamkant B. SISTEMAS DE BANCO DE DADOS. 6. Ed. São Paulo: Pearson Addison Wesley, 2011.

OZSU, M. Tamer; VALDURIEZ, Patrick. PRINCÍPIOS DE SISTEMAS DE BANCO DE DADOS DISTRIBUÍDOS; tradução [da 2. ed. americana] Vandenberg D. de Souza. – Rio de Janeiro: Campus, 2001.

SILBERCHATZ, Abraham; KORTH, Henry F. e SUDARSCHAN, S. SISTEMA DE BANCO DE DADOS. 3. ed. São Paulo: Pearson Makron Books, 1999.

Download do Oracle
http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html.

Artigos relacionados