BANCO DE DADOS WEB AULA 9 concessão e revogação de privilégios professor Luciano Roberto Rocha www.lrocha.com O que são privilégios Quem cria o objeto no banco de dados se torna o seu dono. Por padrão, apenas o dono do objeto pode fazer qualquer coisa com o objeto. Para permitir outros usuários utilizarem o objeto, devem ser concedidos privilégios. Os usuários que possuem o atributo de superusuário sempre podem acessar qualquer objeto independentemente dos privilégios definidos para o objeto. O direito de modificar e destruir um objeto são sempre privilégios exclusivos do seu criador. 2 O que são privilégios Existem vários privilégios diferentes: SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCES, TRIGGER, CREATE, TEMPORARY, EXECUTE e USAGE. Os privilégios aplicáveis a um determinado tipo de objeto variam de acordo com o tipo do objeto (tabela, função, etc.). Para conceder privilégios a usuários e grupos, utiliza-se o comando GRANT. Qualquer privilégio concedido pelo comando GRANT é adicionado aos já concedidos, se existirem. 3 Como definir privilégios Sinopse GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nome_da_tabela [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE nome_do_banco_de_dados [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION nome_da_função ([tipo, ...]) [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_da_linguagem [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA nome_do_esquema [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE nome_do_espaço_de_tabelas [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] 4 Como definir privilégios A palavra chave PUBLIC indica que os privilégios devem ser concedido para todos os usuários, inclusive aos que vierem a ser criados posteriormente. PUBLIC pode ser considerado como um grupo definido implicitamente que sempre inclui todos os usuários. Um determinado usuário possui a soma dos privilégios concedidos diretamente para o mesmo, mais os privilégios concedidos para todos os grupos que este seja membro, mais os privilégios concedidos para PUBLIC. 5 Como definir privilégios Se for especificado WITH GRANT OPTION quem receber o privilégio poderá, por sua vez, conceder o privilégio a terceiros. Sem a opção de concessão, quem recebe não pode conceder o privilégio. As opções de concessão somente podem ser concedidas a usuários individuais, e não a grupos ou PUBLIC. Não é necessário conceder privilégios para o dono do objeto (geralmente o usuário que o criou), entretanto, o dono pode decidir revogar alguns de seus próprios privilégios por motivo de segurança. 6 Tipos de privilégios Os privilégios possíveis são: SELECT Permite consultar (SELECT) qualquer coluna da tabela, visão ou seqüência especificada. Também permite utilizar o comando COPY TO. Para as seqüências, este privilégio também permite o uso da função currval. INSERT Permite inserir (INSERT) novas linhas na tabela especificada. Também permite utilizar o comando COPY FROM. UPDATE Permite modificar (UPDATE) os dados de qualquer coluna da tabela especificada. Para as seqüências, este privilégio permite o uso das funções nextval e setval. DELETE Permite excluir (DELETE) linhas da tabela especificada. 7 Tipos de privilégios RULE Permite criar regras para a tabela ou para a visão (Consulte o comando CREATE RULE). REFERENCES Para criar uma restrição de chave estrangeira é necessário possuir este privilégio, tanto na tabela que faz referência quanto na tabela que é referenciada. TRIGGER Permite criar gatilhos na tabela especificada (Consulte o comando CREATE TRIGGER). TEMPORARY TEMP Permite a criação de tabelas temporárias ao usar o banco de dados. 8 Tipos de privilégios CREATE Para bancos de dados, permite a criação de novos esquemas no banco de dados. Para esquemas, permite a criação de novos objetos no esquema. Para mudar o nome de um objeto existente é necessário ser o dono do objeto e possuir este privilégio no esquema que o contém. Para espaços de tabelas (tablespaces), permite a criação de tabelas e índices no espaço de tabelas, e permite a criação de bancos de dados possuindo este espaço de tabelas como seu espaço de tabelas padrão. EXECUTE Permite utilizar a função especificada e qualquer operador implementado utilizando a função. Este é o único tipo de privilégio aplicável às funções (Esta sintaxe funciona para as funções de agregação também). 9 Tipos de privilégios USAGE Para as linguagens procedurais, permite o uso da linguagem especificada para criar funções nesta linguagem. Este é o único tipo de privilégio aplicável às linguagens procedurais. Para os esquemas, permite acessar os objetos contidos no esquema especificado (assumindo que os privilégios requeridos para os próprios objetos estejam atendidos). Essencialmente, concede a quem recebe o direito de “procurar” por objetos dentro do esquema. ALL PRIVILEGES Concede todos os privilégios disponíveis de uma só vez. A palavra chave PRIVILEGES é opcional no PostgreSQL, embora seja requerida pelo SQL estrito. 10 Conceder um Privilégio Exemplos Conceder, para todos os usuários, o privilégio de inserção na tabela filmes: GRANT INSERT ON filmes TO PUBLIC; Conceder ao usuário manuel todos os privilégios disponíveis na visão vis_tipos: GRANT ALL PRIVILEGES ON vis_tipos TO manuel; Conceder o privilégio de consulta na tabela contas para o grupo contabilidade: GRANT SELECT ON contas TO GROUP contabilidade; Conceder, para o usuário sergio, todos os privilégios no banco winestore e extender a ele a possibilidade de conceder privilégios a outros usuários: GRANT ALL ON DATABASE winestore TO sergio WITH GRANT OPTION 11 Listar os privilégios Pode ser usado o comando \z ou \dp do aplicativo psql para obter informações sobre os privilégios concedidos como, por exemplo: => \z minha_tabela Privilégios de acesso ao banco dados "lusitania" Esquema | Nome | Tipo | Privilégios de acesso ---------+--------------+--------+-----------------------------------------------------------public | minha_tabela | tabela | {miriam=arwdRxt/miriam,=r/miriam,"group todos=arw/miriam"} (1 linha) O exemplo mostrado acima seria visto pela usuária miriam após esta ter criado a tabela minha_tabela e executado: GRANT SELECT ON minha_tabela TO PUBLIC; GRANT SELECT, UPDATE, INSERT ON minha_tabela TO GROUP todos; 12 Listar os privilégios As entradas mostradas pelo comando \z são interpretadas da seguinte forma: =xxxx -- privilégios concedidos para PUBLIC uname=xxxx -- privilégios concedidos para o usuário group gname=xxxx -- privilégios concedidos para o grupo r w a d R x t X U C T arwdRxt * -------------- SELECT ("read") UPDATE ("write") INSERT ("append") DELETE RULE REFERENCES TRIGGER EXECUTE USAGE CREATE TEMPORARY ALL PRIVILEGES (para tabelas) opção de concessão para o privilégio precedente /yyyy -- usuário que concedeu o privilégio 13 Revogar privilégios REVOKE: revoga privilégios de acesso. Descrição O comando REVOKE revoga, de um ou mais usuários ou grupos de usuários, privilégios concedidos anteriormente. A palavra chave PUBLIC se refere ao grupo contendo todos os usuários, definido implicitamente. Sinopse REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nome_da_tabela [, ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] 14 Revogar privilégios Deve ser observado que um determinado usuário possui a soma dos privilégios concedidos diretamente para o próprio usuário, mais os privilégios concedidos para os grupos dos quais é membro no momento, mais os privilégios concedidos para PUBLIC. Daí, por exemplo, revogar o privilégio SELECT de PUBLIC não significa, necessariamente, que todos os usuários perderão o privilégio SELECT para o objeto: os usuários que receberam o privilégio diretamente, ou por meio de um grupo, ainda terão o privilégio. Se for especificado GRANT OPTION FOR somente a opção de concessão do privilégio é revogada, e não o próprio privilégio. Caso contrário, tanto o privilégio quanto a opção de concessão serão revogados. 15 Revogar um Privilégio Exemplos Revogar o privilégio de inserção na tabela filmes concedido para todos os usuários: REVOKE INSERT ON filmes FROM PUBLIC; Revogar todos os privilégios concedidos ao usuário manuel sobre a visão vis_tipos: REVOKE ALL PRIVILEGES ON vis_tipos FROM manuel; Obs.: Deve ser observado que este comando significa, na verdade, “revogue todos os privilégios que eu concedi”. 16 Casos especiais Um determinado usuário pode revogar somente os privilégios que foram concedidos diretamente por este usuário. Se, por exemplo, o usuário A concedeu um privilégio com opção de concessão para o usuário B, e o usuário B por sua vez concedeu o privilégio para o usuário C, então o usuário A não poderá revogar diretamente o privilégio de C. Em vez disso, o usuário A poderá revogar a opção de concessão do usuário B usando a opção CASCADE, para que o privilégio seja, por sua vez, revogado do usuário C. Outro exemplo é o caso em que tanto A quanto B concederam o mesmo privilégio a C: neste caso A poderá revogar sua própria concessão, mas não poderá revogar a concessão feita por B e, portanto, C continuará com o privilégio mesmo que A revogue o 17 privilégio. 18