Sécurité et privilèges des procédures stockées - Amazon Redshift

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Sécurité et privilèges des procédures stockées

Par défaut, tous les utilisateurs disposent des privilèges nécessaires pour créer une procédure. Pour créer une procédure, vous devez disposer du privilège USAGE sur le langage PL/pgSQL, qui est accordé par défaut à PUBLIC. Seuls les super-utilisateurs et les propriétaires disposent par défaut du privilège d’appeler une procédure. Les super-utilisateurs peuvent exécuter REVOKE USAGE sur PL/pgSQL à partir d’un utilisateur, s’ils souhaitent empêcher ce dernier de créer une procédure stockée.

Pour appeler une procédure, vous devez disposer du privilège EXECUTE sur la procédure. Par défaut, le privilège EXECUTE pour les nouvelles procédures est accordé au propriétaire de la procédure et aux super-utilisateurs. Pour plus d'informations, consultez GRANT.

L’utilisateur qui crée une procédure est le propriétaire par défaut. Par défaut, le propriétaire possède les privilèges CREATE, DROP et EXECUTE sur la procédure. Les super-utilisateurs disposent de tous les privilèges.

L’attribut SECURITY contrôle les privilèges d’une procédure relatifs à l’accès aux objets de base de données. Lorsque vous créez une procédure stockée, vous pouvez définir l’attribut SECURITY sur DEFINER ou INVOKER. Si vous spécifiez SECURITY INVOKER, la procédure utilise les privilèges de l’utilisateur invoquant la procédure. Si vous spécifiez SECURITY DEFINER, la procédure utilise les privilèges du propriétaire de la procédure. INVOKER est la valeur par défaut.

Parce qu’une procédure SECURITY DEFINER s’exécute avec les privilèges de l’utilisateur qui la possède, vous devez vous assurer que la procédure ne peut pas être utilisée à mauvais escient. Pour vous assurer que les procédures SECURITY DEFINER ne peuvent pas être utilisées à mauvais escient, procédez comme suit :

  • Accordez l’autorisation EXECUTE sur les procédures définies avec SECURITY DEFINER à des utilisateurs spécifiques, et non à PUBLIC.

  • Qualifiez tous les objets de base de données dont la procédure a besoin pour accéder à l’aide des noms de schéma. Par exemple, utilisez myschema.mytable plutôt que mytable.

  • Si vous ne pouvez pas qualifier un nom d’objet par son schéma, lors de la création de la procédure, définissez search_path à l’aide de l’option SET. Définissez search_path de façon à exclure tout schéma accessible en écriture par des utilisateurs non fiables. Cette approche empêche tout appelant de la procédure de créer des objets (tels que des tables ou des vues) qui masquent les objets destinés à être utilisés par la procédure. Pour plus d’informations sur l’option SET, consultez CREATE PROCEDURE.

L’exemple suivant définit search_path sur admin pour s’assurer que la table user_creds est accessible depuis le schéma admin et non depuis le schéma public ou autre défini dans le search_path de l’appelant.

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;