Seguridad y privilegios para procedimientos almacenados - Amazon Redshift

Seguridad y privilegios para 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 de mytable.

  • Si no puede cualificar un nombre de objeto por su esquema, establezca search_path al crear el procedimiento mediante la opción SET. Establezca search_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;