Segurança e privilégios para procedimentos armazenados
Este tópico descreve as credenciais de banco de dados necessárias para criar e executar procedimentos armazenados.
Por padrão, todos os usuários têm privilégios para criar um procedimento. Para criar um procedimento, é necessário ter o privilégio USAGE na linguagem PL/pgSQL, que é concedida para PUBLIC, por padrão. Por padrão, somente superusuários e proprietários têm privilégio para chamar um procedimento. Usuários avançados podem executar REVOKE USAGE em PL/pgSQL de um usuário se quiserem impedir que o usuário crie um procedimento armazenado.
Para chamar um procedimento, é necessário receber privilégio para realizar EXECUTE no procedimento. Por padrão, o privilégio para realizar EXECUTE em novos procedimentos é concedido ao proprietário do procedimento e a superusuários. Para ter mais informações, consulte GRANT.
O usuário que cria um procedimento é o proprietário, por padrão. O proprietário possui os privilégios CREATE, DROP e EXECUTE sobre o procedimento, por padrão. Os usuários avançados têm todos os privilégios.
O atributo SECURITY controla os privilégios de um procedimento para acessar objetos do banco de dados. Ao criar um procedimento armazenado, é possível definir o atributo SECURITY como DEFINER ou INVOKER. Se você especificar SECURITY INVOKER, o procedimento usará os privilégios do usuário que invoca o procedimento. Se você especificar SECURITY DEFINER, o procedimento usará os privilégios do proprietário do procedimento. INVOKER é o padrão.
Como um procedimento SECURITY DEFINER é executado com os privilégios do usuário que é proprietário dele, você deve garantir que o procedimento não seja mal utilizado. Para garantir que procedimentos SECURITY DEFINER não sejam mal utilizados, faça o seguinte:
Conceda EXECUTE em procedimentos SECURITY DEFINER para usuários específicos em vez de PUBLIC.
Qualifique todos os objetos do banco de dados que o procedimento precisa acessar com os nomes de esquema. Por exemplo, use
myschema.mytable
, em vez de apenasmytable
.Se não for possível qualificar um nome de objeto pelo seu esquema, defina
search_path
ao criar o procedimento usando a opção SET. Definasearch_path
para excluir quaisquer esquemas que sejam graváveis por usuários não confiáveis. Essa abordagem impede que qualquer chamador desse procedimento crie objetos (por exemplo, tabelas ou visualizações) que mascaram objetos destinados ao uso pelo procedimento. Para obter mais informações sobre a opção SET, consulte CREATE PROCEDURE.
O exemplo a seguir define search_path
como admin
para garantir que a tabela user_creds
seja acessada a partir do esquema admin
e não publicamente ou de qualquer outro esquema no search_path
do chamador.
CREATE OR REPLACE PROCEDURE sp_get_credentials(userid int, o_creds OUT varchar) AS $$ BEGIN SELECT creds INTO o_creds FROM user_creds WHERE user_id = $1; END; $$ LANGUAGE plpgsql SECURITY DEFINER -- Set a secure search_path SET search_path = admin;