Pour en savoir plus, consultez la présentation des vues sécurisées paramétrées et la section Sécuriser et contrôler l'accès aux données d'application à l'aide de vues sécurisées paramétrées.
Avant de commencer
La prise en charge des vues paramétrées AlloyDB AI est fournie par parameterized_views, qui est une extension AlloyDB pour PostgreSQL.
Avant d'utiliser des vues sécurisées paramétrées, vous devez effectuer les opérations suivantes une seule fois dans
votre environnement Linux.
Chaque paramètre peut être appliqué à l'aide de ALTER SYSTEM ou en modifiant directement postgresql.conf.
- Ajoutez
parameterized_viewsàshared_preload_libraries. - Activez la fonctionnalité en définissant
parameterized_views.enabled=on. Redémarrez le serveur PostgreSQL pour que les modifications prennent effet.
-- See the current shared_preload_libraries SHOW shared_preload_libraries; ALTER SYSTEM SET shared_preload_libraries="...,parameterized_views"; ALTER SYSTEM SET parameterized_views.enabled=on;Utilisez psql pour créer l'
parameterized_viewsextension dans n'importe quelle base de données dans laquelle vous souhaitez créer une vue paramétrée :-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;Lorsque l'extension est créée, un schéma nommé
parameterized_viewsest également créé par le système afin que les API soient contenues dans l'espace de noms de ce schéma et qu'elles n'entrent pas en conflit avec les API existantes.
Créer une vue sécurisée paramétrée
Pour créer une vue sécurisée paramétrée, procédez comme suit :
Exécutez la commande LDD
CREATE VIEWcomme illustré dans l'exemple suivant :CREATE VIEW secure_checked_items WITH (security_barrier) AS SELECT bag_id, timestamp, location FROM checked_items t WHERE customer_id = $@app_end_userid;Dans l'exemple précédent, la vue sécurisée paramétrée permet d'accéder à trois colonnes d'une table nommée
checked_items. La vue limite les résultats aux lignes oùchecked_items.customer_idcorrespond à un paramètre obligatoire. Utilisez les attributs suivants :- Créez la vue à l'aide de l'option
security_barrier. - Pour limiter les utilisateurs de l'application afin qu'ils ne puissent afficher que les lignes auxquelles ils sont autorisés à accéder, ajoutez les paramètres requis dans la définition de la vue à l'aide de la syntaxe
$@PARAMETER_NAME. Un cas d'utilisation courant consiste à vérifier la valeur d'une colonne dans laWHEREclause à l'aide deCOLUMN = $@PARAMETER_NAME. $@PARAMETER_NAMEindique un paramètre de vue nommé. Sa valeur est fournie lorsque vous utilisez l'APIexecute_parameterized_query. Les paramètres de vue nommés doivent répondre aux exigences suivantes :- Les paramètres de vue nommés doivent commencer par une lettre (a-z).
- Vous pouvez utiliser des lettres avec des signes diacritiques et des lettres non latines, ainsi qu'un trait de soulignement (
_). - Les autres caractères peuvent être des lettres, des traits de soulignement ou des chiffres (
0-9). - Les paramètres de vue nommés ne peuvent pas contenir
$. - Les paramètres de vue nommés sont sensibles à la casse. Par exemple,
$@PARAMETER_NAMEest interprété différemment de$@parameter_name.
- Créez la vue à l'aide de l'option
Accordez
SELECTsur la vue à tout utilisateur de base de données autorisé à interroger la vue.Accordez
USAGEsur le schéma contenant les tables définies dans la vue à tout utilisateur de base de données autorisé à interroger la vue.
Pour en savoir plus, consultez Sécuriser et contrôler l'accès aux données d'application à l'aide de vues sécurisées paramétrées.
Configurer la sécurité de votre application
Pour configurer la sécurité de vos applications à l'aide de vues sécurisées paramétrées, procédez comme suit :
- Créez les vues paramétrées sécurisées en tant qu'utilisateur administrateur. Cet utilisateur est un utilisateur de base de données AlloyDB Omni qui effectue des opérations administratives pour l'application, y compris la configuration de la base de données et l'administration de la sécurité.
- Créez un rôle de base de données pour exécuter des requêtes sur des vues sécurisées paramétrées. Il s'agit d'un rôle de base de données AlloyDB Omni que l'application utilise pour se connecter et se connecter à la base de données, et pour exécuter des requêtes sur des vues paramétrées.
- Accordez au nouveau rôle des autorisations sur les vues sécurisées, ce qui inclut généralement les droits
SELECTsur les vues etUSAGEsur les schémas. - Limitez les objets auxquels ce rôle peut accéder à l'ensemble minimal requis de fonctions et d'objets publics dont l'application a besoin. Évitez de fournir un accès aux schémas et aux tables qui ne sont pas publics.
- Lorsque vous interrogez les vues, l'application fournit les valeurs des paramètres de vue requis, qui sont liés à l'identité de l'utilisateur de l'application.
Interroger une vue sécurisée paramétrée
Pour interroger une vue sécurisée paramétrée, utilisez l'une des options suivantes qui correspond le mieux à votre cas d'utilisation :
- Basée sur JSON : utilisez cette API pour exécuter la requête en une seule fois et renvoyer des lignes JSON.
- Basée sur CURSOR : utilisez cette API lorsque vous avez des requêtes de longue durée ou lorsque vous avez des requêtes volumineuses et que vous souhaitez récupérer le résultat par lot. La fonction
execute_parameterized_queryfournie par l'extensionparameterized_viewsaccepte un nom de curseur. - Instruction
PREPARE EXECUTE: utilisez-la pour les instructions préparées qui peuvent être exécutées plusieurs fois avec différentes valeurs de paramètres.
Pour interroger des vues sécurisées paramétrées, vous utilisez la fonction execute_parameterized_query() fournie par l'extension parameterized_views.
API JSON
Cette API présente des limites, car elle déclare un curseur pour la requête donnée. Par conséquent, la
requête doit être compatible avec les curseurs PostgreSQL. Par exemple, l'API CURSOR n'est pas compatible avec les instructions DO ni SHOW.
Cette API ne limite pas non plus les résultats par taille ni par nombre de lignes renvoyées.
Exécutez la fonction execute_parameterized_query(), dont la syntaxe est la suivante :
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Remplacez les éléments suivants :
SQL_QUERY: requête SQL dont la clauseFROMfait référence à une ou plusieurs vues sécurisées paramétrées.PARAMETER_NAMES: liste de noms de paramètres à transmettre sous forme de chaînes.PARAMETER_VALUES: liste de valeurs de paramètres à transmettre.- Cette liste doit avoir la même taille que la liste
param_names, où l'ordre des valeurs correspond à l'ordre des noms. - Le type exact des valeurs est déduit de la requête et de la définition de la vue paramétrée. Les conversions de type sont effectuées si nécessaire et si possible pour la valeur de paramètre donnée. En cas de non-concordance des types, une erreur est générée.
- Cette liste doit avoir la même taille que la liste
La fonction renvoie une table d'objets JSON. Chaque ligne du tableau est équivalente à la valeur ROW_TO_JSON() de la ligne de résultat de la requête d'origine.
Utilisez l'exemple suivant pour interroger une vue sécurisée paramétrée :
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
)
L'utilisation de cette API limite la taille de l'ensemble de résultats par taille exprimée en kilo-octets (Ko) des résultats et par nombre de lignes. Vous pouvez configurer ces limites à l'aide de parameterized_views.json_results_max_size et parameterized_views.json_results_max_rows.
Cette API présente des limites, car elle déclare un curseur pour la requête donnée. Par conséquent, la
requête doit être compatible avec les curseurs PostgreSQL. Par exemple, l'API CURSOR n'est pas compatible avec les instructions DO ni SHOW.
Cette API ne limite pas non plus les résultats par taille ni par nombre de lignes renvoyées.
Exécutez la fonction execute_parameterized_query(), dont la syntaxe est la suivante :
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Remplacez les éléments suivants :
SQL_QUERY: requête SQL dont la clauseFROMfait référence à une ou plusieurs vues sécurisées paramétrées.PARAMETER_NAMES: liste de noms de paramètres à transmettre sous forme de chaînes.PARAMETER_VALUES: liste de valeurs de paramètres à transmettre.- Cette liste doit avoir la même taille que la liste
param_names, où l'ordre des valeurs correspond à l'ordre des noms. - Le type exact des valeurs est déduit de la requête et de la définition de la vue paramétrée. Les conversions de type sont effectuées si nécessaire et si possible pour la valeur de paramètre donnée. En cas de non-concordance des types, une erreur est générée.
La fonction renvoie une table d'objets JSON. Chaque ligne du tableau est équivalente à la valeur ROW_TO_JSON() de la ligne de résultat de la requête d'origine.
Utilisez l'exemple suivant pour interroger une vue sécurisée paramétrée :
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
)
L'utilisation de cette API limite la taille de l'ensemble de résultats par taille exprimée en kilo-octets (Ko) des résultats et par nombre de lignes. Vous pouvez configurer ces limites à l'aide de parameterized_views.json_results_max_size et parameterized_views.json_results_max_rows.
API CURSOR
Cette API présente des limites, car elle déclare un curseur pour la requête donnée. Par conséquent, la
requête doit être compatible avec les curseurs PostgreSQL. Par exemple, l'API CURSOR n'est pas compatible avec les instructions DO ni SHOW.
Cette API ne limite pas non plus les résultats par taille ni par nombre de lignes renvoyées.
Exécutez la fonction execute_parameterized_query(), dont la syntaxe est la suivante :
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Remplacez les éléments suivants :
SQL_QUERY: requête SQL dont la clauseFROMfait référence à une ou plusieurs vues sécurisées paramétrées.PARAMETER_NAMES: liste de noms de paramètres à transmettre sous forme de chaînes.PARAMETER_VALUES: liste de valeurs de paramètres à transmettre.- Cette liste doit avoir la même taille que la liste
param_names, où l'ordre des valeurs correspond à l'ordre des noms. - Le type exact des valeurs est déduit de la requête et de la définition de la vue paramétrée. Les conversions de type sont effectuées si nécessaire et si possible pour la valeur de paramètre donnée. En cas de non-concordance des types, une erreur est générée.
- Cette liste doit avoir la même taille que la liste
La fonction renvoie une table d'objets JSON. Chaque ligne du tableau est équivalente à la valeur ROW_TO_JSON() de la ligne de résultat de la requête d'origine.
Utilisez l'exemple suivant pour interroger une vue sécurisée paramétrée :
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
)
L'utilisation de cette API limite la taille de l'ensemble de résultats par taille exprimée en kilo-octets (Ko) des résultats et par nombre de lignes. Vous pouvez configurer ces limites à l'aide de parameterized_views.json_results_max_size et parameterized_views.json_results_max_rows.
Instruction PREPARE
Utilisez la commande PREPARE .. AS RESTRICTED pour créer une instruction préparée qui fait référence à des vues paramétrées. Ces instructions préparées sont compatibles avec les paramètres positionnels et appliquent diverses restrictions lorsque vous les exécutez. Pour en savoir plus, consultez Mécanisme de sécurité.
Cette fonctionnalité étend les commandes PREPARE et EXECUTE pour prendre en charge les paramètres de vue nommés. Utilisez des instructions préparées pour éviter la surcharge liée à l'analyse, à l'analyse et à la réécriture chaque fois que l'instruction est exécutée, ce qui peut entraîner des gains de performances significatifs, en particulier pour les requêtes fréquemment exécutées ou complexes. Une instruction préparée est un objet côté serveur qui peut optimiser les performances en précompilant et en stockant une instruction SQL paramétrée pour une exécution ultérieure.
Cette API présente des limites, car l'instruction doit être autorisée dans une instruction PREPARE, ce qui signifie que seules les instructions SELECT et VALUES sont compatibles.
Cette API ne limite pas non plus les résultats par taille ni par nombre de lignes renvoyées.
Pour créer une instruction préparée qui fait référence à des vues paramétrées, exécutez la commande PREPARE .. AS RESTRICTED :
PREPARE pquery (/POSITIONAL_PARAM_TYPES/)
AS RESTRICTED query % a query that may refer to parameterized views
EXECUTE pquery (/POSITIONAL_PARAM_VALUES/)
WITH VIEW PARAMETERS (VIEW_PARAM_NAME1 = VIEW_PARAM_VALUE1[, ...]);
Remplacez les éléments suivants :
POSITIONAL_PARAM_TYPES: un ou plusieurs paramètres positionnels utilisés dans la requêteRESTRICTED.POSITIONAL_PARAM_VALUES: les valeurs réelles qui sont substituées aux paramètres positionnels définis dans l'instructionPREPARE.VIEW_PARAM_NAME: nom du paramètre attendu par les vues paramétrées référencées dans la requêteRESTRICTED.VIEW_PARAM_VALUE: les valeurs réelles transmises aux paramètresviewParamNamecorrespondants des vues paramétrées.
Pour inclure des paramètres dans une instruction préparée, fournissez une liste de types de données dans l'instruction PREPARE. Dans l'instruction que vous préparez, vous faites référence aux paramètres par position à l'aide de $1 et $2, par exemple.
Utilisez la commande EXECUTE .. WITH VIEW PARAMETERS pour exécuter une instruction préparée précédemment que vous avez créée à l'aide de la commande PREPARE .. AS RESTRICTED.
Si l'instruction PREPARE qui a créé l'instruction a spécifié des paramètres positionnels, vous devez transmettre un ensemble de paramètres compatibles à l'instruction EXECUTE. Vous devez transmettre tous les paramètres de vue nommés requis par les vues paramétrées dans la clause WITH VIEW PARAMETERS.
Utilisez l'exemple suivant pour interroger une vue sécurisée paramétrée :
PREPARE pquery (timestamp) AS RESTRICTED SELECT * FROM secure_checked_items WHERE timestamp > $1;
EXECUTE pquery (current_date - 1) WITH VIEW PARAMETERS (app_end_userid = 40);
EXECUTE pquery (current_date - 30) WITH VIEW PARAMETERS (app_end_userid = 40);
Restrictions appliquées aux requêtes
La liste suivante présente l'ensemble des opérations restreintes pour les requêtes que vous exécutez à l'aide des options décrites dans Interroger une vue sécurisée paramétrée :
- Toute invocation récursive d'une API (
execute_parameterized_queryou à l'aide deEXECUTE .. WITH VIEW PARAMETERS) est interdite, de sorte que seules les valeurs spécifiées par l'application sont utilisées. Cette restriction empêche également l'utilisation de la requête pour contourner l'enveloppe de sécurité de l'ensemble de valeurs de paramètres donné. - Certaines extensions qui démarrent une nouvelle session en arrière-plan ne sont pas autorisées, y compris les extensions
dblink, pg_cronetpg_background. La liste suivante présente l'ensemble des constructions de requêtes autorisées qui sont restreintes :
- Les instructions
SELECTen lecture seule sont autorisées. - Les instructions
SHOW,CALLetDOen lecture seule sont autorisées. - Les instructions LMD telles que
INSERT, UPDATEetDELETEne sont pas autorisées. - Les instructions LDD telles que
CREATE TABLEetALTER TABLEne sont pas autorisées. - Les autres types d'instructions tels que
LOAD, SET, CLUSTER, LOCK, CHECKPOINTetEXPLAINne sont pas autorisés.
- Les instructions
Les instructions
EXPLAINne sont pas autorisées pour éviter les attaques de canaux cachés à l'aide de plans de requête. Pour en savoir plus, consultez Canal caché.Les vues sécurisées paramétrées fournissent des paramètres pour vous aider à gérer les ressources utilisées par les API pour interroger les vues paramétrées, telles que
parameterized_views.statement_timeout. Pour en savoir plus, consultez Indicateurs AlloyDB pour PostgreSQL.
Répertorier toutes les vues paramétrées
Utilisez l'extension parameterized_views pour répertorier toutes les vues paramétrées de
la base de données à l'aide de la vue all_parameterized_views. La sortie de cette
vue est identique à celle de la
pg_views vue de catalogue, mais all_parameterized_views ne répertorie que les vues avec des paramètres de vue nommés.
Pour répertorier les vues paramétrées, utilisez l'exemple suivant :
postgres=# select * from parameterized_views.all_parameterized_views ;
schemaname | viewname | viewowner | definition
-----------+--------------------+-----------+---------------------------------------------------------
public | checked_items_view | postgres | SELECT checked_items.bag_id, +
| | | checked_items."timestamp", +
| | | checked_items.location +
| | | FROM checked_items +
| | | WHERE (checked_items.customer_id = $@app_end_userid);
Pour répertorier une vue paramétrée dans all_parameterized_views, assurez-vous qu'elle contient au moins un paramètre de vue nommé dans sa définition.
Étape suivante
En savoir plus sur les vues sécurisées paramétrées.
Découvrez comment sécuriser et contrôler l'accès aux données d'application à l'aide de vues sécurisées paramétrées.