Seguridad y privilegios para procedimientos almacenados
En este tema se describen las credenciales de base de datos necesarias para crear y ejecutar procedimientos almacenados.
De forma predeterminada, todos los usuarios tienen privilegios para crear un procedimiento. Para crear un procedimiento, debe tener el privilegio USAGE en el lenguaje PL/pgSQL, que se concede a PUBLIC de forma predeterminada. Solo los superusuarios y propietarios tienen el privilegio para llamar a un procedimiento de forma predeterminada. Los superusuarios pueden ejecutar REVOKE USAGE en PL/pgSQL de un usuario si quieren impedir que el usuario cree procedimientos almacenados.
Para llamar a un procedimiento, se le debe haber concedido el privilegio EXECUTE para el procedimiento. De forma predeterminada, al propietario del procedimiento y a los superusuarios se les concede el privilegio EXECUTE para nuevos procedimientos. Para obtener más información, consulte GRANT.
El usuario que crea el procedimiento es el propietario de forma predeterminada. El propietario tiene privilegios CREATE, DROP y EXECUTE sobre el procedimiento de forma predeterminada. Los superusuarios tienen todos los privilegios.
El atributo SECURITY controla los privilegios de un procedimiento para acceder a objetos de la base de datos. Al crear un procedimiento almacenado, puede establecer el atributo SECURITY en DEFINER o INVOKER. Si especifica SECURITY INVOKER, el procedimiento usa los privilegios del usuario que invoca el procedimiento. Si especifica SECURITY DEFINER, el procedimiento usa los privilegios del propietario del procedimiento. INVOKER es el valor predeterminado.
Como un procedimiento SECURITY DEFINER se ejecuta con los privilegios del usuario que es su propietario, debe asegurarse de que el procedimiento no se pueda usar indebidamente. Para asegurarse que los procedimientos SECURITY DEFINER no puedan usarse indebidamente, haga lo siguiente:
Otorgue EXECUTE sobre procedimientos SECURITY DEFINER a usuarios concretos y no a PUBLIC.
Cualifique todos los objetos de base de datos a los que el procedimiento debe acceder con los nombres de esquema. Por ejemplo, utilice
myschema.mytable
en lugar demytable
.Si no puede cualificar un nombre de objeto por su esquema, establezca
search_path
al crear el procedimiento mediante la opción SET. Establezcasearch_path
para excluir los esquemas en los que pueden escribir los usuarios que no son de confianza. Esta estrategia impide que los intermediarios de este procedimiento creen objetos (como tablas o vistas) que enmascaren objetos destinados a ser usados por el procedimiento. Para obtener más información acerca de la opción SET, consulte CREATE PROCEDURE.
Los siguientes ejemplos establecen search_path
en admin
para asegurar que la tabla user_creds
sea accesible desde el esquema admin
y no desde el esquema público ni ningún otro esquema en la search_path
del intermediario.
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;