Este documento descreve como usar visualizações seguras parametrizadas no AlloyDB para PostgreSQL, que permite limitar o acesso a dados com base em parâmetros nomeados específicos do aplicativo, como credenciais de usuário do aplicativo. As visualizações seguras parametrizadas melhoram a segurança e o controle de acesso estendendo a funcionalidade das visualizações do PostgreSQL. Essas visualizações também mitigam os riscos de executar consultas não confiáveis de aplicativos, impondo várias restrições automaticamente a qualquer consulta executada.
Para mais informações, consulte a visão geral das visualizações seguras parametrizadas e o tutorial de visualizações seguras parametrizadas.
Antes de começar
Neste documento, presumimos que você criou um cluster e uma instância do AlloyDB. Para mais informações, consulte Criar um banco de dados.
Antes de usar as visualizações seguras parametrizadas, faça o seguinte:
Solicite acesso às visualizações seguras parametrizadas e aguarde a confirmação de ativação antes de começar.
Aguarde a equipe do AlloyDB ativar a flag do banco de dados
parameterized_views.enabled
, que carrega as bibliotecas de extensão necessárias. Essa flag do banco de dados precisa ser ativada antes de você começar.Depois que a equipe do AlloyDB ativar a flag do banco de dados
parameterized_views.enabled
, o banco de dados será reiniciado para que essas mudanças entrem em vigor.Use o AlloyDB Studio ou o psql para criar a extensão
parameterized_views
em qualquer banco de dados em que uma visualização parametrizada seja criada:-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;
Quando a extensão é criada, um esquema chamado
parameterized_views
também é criado pelo sistema para que as APIs fiquem contidas no namespace do esquema e não entrem em conflito com as APIs existentes.
Criar uma visualização segura com parâmetros
Para criar uma visualização segura parametrizada, siga estas etapas:
Execute o comando DDL
CREATE VIEW
, conforme mostrado no exemplo a seguir:CREATE VIEW secure_checked_items WITH (security_barrier) AS SELECT bag_id, timestamp, location FROM checked_items t WHERE customer_id = $@app_end_userid;
No exemplo anterior, a visualização segura parametrizada permite o acesso a três colunas de uma tabela chamada
/users/checked_items/
. A visualização limita os resultados a linhas em que/users.id/checked_items.customer_id/
corresponde a um parâmetro obrigatório.Use os seguintes atributos:
- Crie a visualização usando a opção
security_barrier
. - Para restringir os usuários do aplicativo para que eles só possam visualizar as linhas
que têm permissão para acessar, adicione os parâmetros necessários usando a
sintaxe
$@PARAMETER_NAME
na cláusulaWHERE
. Um caso de uso comum é verificar o valor de uma coluna usandoWHERE COLUMN = $@PARAMETER_NAME
. $@PARAMETER_NAME
indica um parâmetro de visualização nomeado. O valor é fornecido quando você usa a APIexecute_parameterized_query
. Os parâmetros de visualização nomeada têm os seguintes requisitos:- Os parâmetros de visualização nomeados precisam começar com uma letra (a-z).
- É possível usar letras com acentos e não latinas, além de sublinhados (
_
). - Os caracteres seguintes podem ser letras, sublinhados ou dígitos (
0
-9
). - Os parâmetros de visualização nomeados não podem conter
$
. - Os parâmetros de visualização nomeados diferenciam maiúsculas de minúsculas. Por exemplo,
$@PARAMETER_NAME
é interpretado de maneira diferente de$@parameter_name
.
- Crie a visualização usando a opção
Conceda
SELECT
na visualização a qualquer usuário do banco de dados que tenha permissão para consultar a visualização.Conceda
USAGE
no esquema que contém as tabelas definidas na visualização a qualquer usuário do banco de dados que tenha permissão para consultar a visualização.
Para mais informações, consulte Proteger e controlar o acesso a dados do aplicativo usando visualizações seguras parametrizadas.
Configurar a segurança do aplicativo
Para configurar a segurança dos seus apps usando visualizações seguras parametrizadas, siga estas etapas:
- Crie as visualizações parametrizadas seguras como um usuário administrativo. Esse usuário é um usuário do banco de dados do AlloyDB que realiza operações administrativas para o aplicativo, incluindo a configuração do banco de dados e a administração de segurança.
Crie uma nova função de banco de dados para executar consultas em visualizações seguras parametrizadas. Essa é uma função de banco de dados do AlloyDB que o aplicativo usa para se conectar e fazer login no banco de dados e executar consultas em visualizações parametrizadas.
- Conceda as permissões da nova função às visualizações seguras, que
normalmente incluem privilégios
SELECT
para as visualizações eUSAGE
nos esquemas. - Limite os objetos que esse papel pode acessar ao conjunto mínimo de funções e objetos públicos necessários para o aplicativo. Evite fornecer acesso a esquemas e tabelas que não são públicos.
Quando você consulta as visualizações, o aplicativo fornece os valores dos parâmetros de visualização necessários, que estão vinculados à identidade do usuário do aplicativo.
Para mais informações, consulte Criar um usuário de banco de dados.
- Conceda as permissões da nova função às visualizações seguras, que
normalmente incluem privilégios
Consultar uma visualização segura parametrizada
Para consultar uma visualização segura parametrizada, use uma das seguintes opções que melhor oferece suporte ao seu caso de uso:
- Com base em JSON: use essa API para executar a consulta em uma única vez e retornar linhas JSON.
- Com base em CURSOR: use essa API quando você tiver consultas mais longas ou quando
tiver consultas grandes e quiser buscar o resultado em lotes. A
função
execute_parameterized_query
fornecida pela extensãoparameterized_views
aceita um nome de cursor. - Instrução
PREPARE EXECUTE
: use-a para instruções preparadas que podem ser executadas várias vezes com valores de parâmetros diferentes.
Para consultar visualizações seguras parametrizadas, use a função execute_parameterized_query()
fornecida pela extensão parameterized_views
.
API JSON
Essa API tem limitações porque declara um cursor para a consulta especificada. Como
resultado, a consulta precisa ser compatível com os cursores do PostgreSQL.
Por exemplo, a API CURSOR não oferece suporte a instruções DO
ou SHOW
.
Essa API também não restringe os resultados por tamanho ou pelo número de linhas retornadas.
Execute a função execute_parameterized_query()
, que tem a seguinte
sintaxe:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Substitua:
SQL_QUERY
: uma consulta SQL com uma cláusulaFROM
que se refere a uma ou mais visualizações seguras parametrizadas.PARAMETER_NAMES
: uma lista de nomes de parâmetros a serem transmitidos como strings.PARAMETER_VALUES
: uma lista de valores de parâmetro a serem transmitidos.- Essa lista precisa ter o mesmo tamanho que a lista
param_names
, em que a ordem dos valores corresponde à ordem dos nomes. - O tipo exato dos valores é inferido da consulta e da definição de visualização parametrizada. As conversões de tipo são realizadas quando necessário e quando possível para o valor do parâmetro fornecido. Em caso de incompatibilidade de tipo, um erro é gerado.
- Essa lista precisa ter o mesmo tamanho que a lista
A função retorna uma tabela de objetos JSON. Cada linha na tabela é equivalente ao valor ROW_TO_JSON()
da linha de resultado da consulta original.
Use o exemplo a seguir para consultar uma visualização segura parametrizada:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
)
O uso dessa API limita o tamanho do conjunto de resultados pelo tamanho expresso em kilobytes
(kB) dos resultados e pelo número de linhas. É possível configurar esses
limites usando parameterized_views.json_results_max_size
e
parameterized_views.json_results_max_rows
.
API CURSOR
Execute a função execute_parameterized_query()
, que cria e retorna um CURSOR no escopo da transação que você usa para recuperar os resultados da consulta:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
cursor_name => CURSOR_NAME,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Substitua:
SQL_QUERY
: uma consulta SQL com uma cláusulaFROM
que se refere a uma ou mais visualizações seguras parametrizadas.CURSOR_NAME
: nome do cursor a ser declarado.PARAMETER_NAMES
: uma lista de nomes de parâmetros a serem transmitidos como strings.PARAMETER_VALUES
: uma lista de valores de parâmetro a serem transmitidos. Essa lista precisa ter o mesmo tamanho que a listaparam_names
, em que a ordem dos valores corresponde à ordem dos nomes. O tipo exato dos valores é inferido da consulta e da definição de visualização parametrizada. As conversões de tipo são realizadas quando necessário e quando possível para o valor do parâmetro fornecido. Em caso de incompatibilidade de tipo, um erro é gerado.
Use o exemplo a seguir para consultar uma visualização segura parametrizada:
-- start a transaction as the that is the default lifetime of a CURSOR
BEGIN;
-- create a cursor called 'mycursor'
SELECT * FROM parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
cursor_name => 'mycursor'
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
);
-- then, to actually fetch the results
FETCH ALL FROM mycursor;
-- end the transaction, which will clean up the cursor
END;
O cursor retornado é um cursor WITHOUT HOLD
NO SCROLL
. Não é possível usar o cursor
para recuperar linhas de maneira não sequencial, por exemplo, em uma direção
para trás. Não é possível usar o cursor fora da transação que o criou.
Instrução PREPARE
Use o comando PREPARE .. AS RESTRICTED
para criar uma instrução preparada
que referencia visualizações parametrizadas. Essas instruções preparadas oferecem suporte a parâmetros posicionais e impõem várias restrições quando são executadas.
Para mais informações, consulte Mecanismo de segurança.
Esse recurso estende
PREPARE
e EXECUTE commands
para oferecer suporte a parâmetros de visualização nomeados. Use instruções preparadas
para evitar a sobrecarga de análise, análise e reescrita a cada
vez que a instrução é executada, o que pode resultar em ganhos de desempenho
significativos, especialmente para consultas complexas ou executadas com frequência. Uma instrução
preparada é um objeto do lado do servidor que pode otimizar o desempenho ao
pré-compilar e armazenar uma instrução SQL parametrizada para execução posterior.
Essa API tem limitações porque a instrução precisa ser permitida em uma instrução PREPARE
, o que significa que apenas as instruções SELECT
e VALUES
são compatíveis.
Essa API também não restringe os resultados por tamanho ou número de linhas retornadas.
Para criar uma instrução preparada que faz referência a visualizações parametrizadas, execute o comando 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[, ...]);
Substitua:
POSITIONAL_PARAM_TYPES
: um ou mais parâmetros posicionais usados na consultaRESTRICTED
.POSITIONAL_PARAM_VALUES
: os valores reais que são substituídos pelos parâmetros posicionais definidos na instruçãoPREPARE
.VIEW_PARAM_NAME
: o nome do parâmetro esperado pelas visualizações parametrizadas referenciadas na consultaRESTRICTED
.VIEW_PARAM_VALUE
: os valores reais que estão sendo transmitidos para os parâmetrosviewParamName
correspondentes das visualizações parametrizadas.
Para incluir parâmetros em uma instrução preparada, forneça uma lista de tipos de dados
na instrução PREPARE
. Na instrução preparada, você se refere aos parâmetros por posição usando, por exemplo, $1
e $2
.
Use o comando EXECUTE .. WITH VIEW PARAMETERS
para executar uma instrução preparada anteriormente que você criou usando o comando PREPARE .. AS RESTRICTED
.
Se a instrução PREPARE
que criou a instrução especificou parâmetros posicionais, é necessário transmitir um conjunto compatível de parâmetros para a instrução EXECUTE
. É necessário transmitir todos os parâmetros de visualização nomeados necessários por visualizações
parametrizadas na cláusula WITH VIEW PARAMETERS
.
Use o exemplo a seguir para consultar uma visualização segura parametrizada:
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);
Restrições aplicadas em consultas
Confira a seguir o conjunto de operações restritas para consultas executadas usando as opções descritas em Consultar uma visualização segura parametrizada:
- Qualquer invocação recursiva de qualquer API (
execute_parameterized_query
) ou usandoEXECUTE .. WITH VIEW PARAMETERS
é proibida. Assim, apenas os valores especificados pelo aplicativo são usados. Essa restrição também impede que a consulta seja usada para contornar o envelope de segurança do conjunto de valores de parâmetro. - Algumas extensões que iniciam uma nova sessão em segundo plano não são permitidas,
incluindo as extensões
dblink
,pg_cron
epg_background
. - Confira a seguir o conjunto de construções de consulta permitidas que são
restringidas:
- Instruções
SELECT
somente leitura são permitidas. - São permitidas instruções
SHOW
,CALL
eDO
somente leitura. - Instruções DML, como
INSERT
,UPDATE
eDELETE
, não são permitidas. - As instruções DDL, como
CREATE TABLE
eALTER TABLE
, não são permitidas. - Outros tipos de instrução, como
LOAD
,SET
,CLUSTER
,LOCK
,CHECKPOINT
eEXPLAIN
, não são permitidos.
- Instruções
- As instruções
EXPLAIN
não são permitidas para evitar a possibilidade de ataques de canal oculto usando planos de consulta. Para mais informações, consulte Canal oculto.
Listar todas as visualizações parametrizadas
Use a extensão parameterized_views
para listar todas as visualizações
parametrizadas no banco de dados usando a visualização all_parameterized_views
. A saída
dessa visualização é a mesma da visualização de catálogo
pg_views
, mas o all_parameterized_views
lista apenas visualizações com parâmetros
de visualização nomeados.
Para listar visualizações parametrizadas, use o exemplo a seguir:
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);
Para listar uma visualização parametrizada em all_parameterized_views
, verifique se a
visualização parametrizada contém pelo menos um parâmetro de visualização nomeado na definição.
A seguir
- Saiba mais sobre as visualizações seguras parametrizadas.
- Saiba como proteger e controlar o acesso aos dados do aplicativo usando visualizações seguras parametrizadas.