Proteger e controlar o acesso aos dados do aplicativo usando visualizações seguras parametrizadas

Neste tutorial, descrevemos como usar visualizações seguras parametrizadas no AlloyDB para PostgreSQL para restringir o acesso do usuário a tabelas de banco de dados. Neste tutorial, você vai configurar visualizações seguras parametrizadas, papéis e privilégios de banco de dados para restringir o acesso a tabelas de base e verificar a segurança de dados. As visualizações parametrizadas e seguras ajudam a proteger aplicativos que usam consultas em linguagem natural geradas com a API QueryData.

Exemplos são incluídos para ilustrar as capacidades das visualizações seguras parametrizadas. Esses exemplos são apenas para fins de demonstração.

O que são visualizações seguras parametrizadas?

Como prática recomendada geral, seu aplicativo precisa ser executado usando uma conta de serviço com o acesso mínimo necessário ao seu banco de dados. Por exemplo, se o aplicativo não precisar gravar no banco de dados, use uma função com acesso somente leitura. Configure esses controles de acesso no nível do banco de dados.

No entanto, às vezes, o aplicativo precisa de controles de segurança mais granulares do que as permissões de acesso padrão no nível do banco de dados. As visualizações seguras parametrizadas oferecem segurança de dados de aplicativos e controle de acesso a linhas usando visualizações SQL. Eles ajudam a garantir que os usuários do aplicativo só possam ver os dados que estão autorizados a acessar.

As visualizações seguras parametrizadas mitigam os riscos de segurança ao processar consultas ad hoc ou de linguagem natural geradas por LLMs. Isso é feito parametrizando as visualizações com identificadores de usuários finais, garantindo que os usuários acessem apenas os dados autorizados, independentemente da fraseologia da consulta. Essa abordagem também simplifica o gerenciamento de usuários, permitindo que uma única função de banco de dados atenda a todos os usuários do aplicativo com segurança, evitando a necessidade de criar funções separadas para cada pessoa e aplicar a segurança no nível da linha.

Objetivos

  • Crie visualizações parametrizadas seguras com parâmetros de visualização nomeados.
  • Crie a função de banco de dados usada pelo aplicativo para se conectar ao banco de dados e acessar visualizações seguras parametrizadas.
  • Conceda as permissões da nova função às visualizações seguras e revogue o acesso às tabelas de base.
  • Conecte-se usando a nova função e verifique se não é possível acessar as tabelas restritas.
  • Execute consultas na visualização segura parametrizada usando a função execute_parameterized_query ou a API QueryData.

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.

Para evitar o faturamento contínuo, exclua os recursos criados ao concluir as tarefas neste documento. Para mais informações, consulte Limpeza.

Antes de começar

Conclua os pré-requisitos a seguir antes de criar um conjunto de contexto.

Ativar o faturamento e as APIs necessárias

  1. No Google Cloud console, selecione um projeto.

    Acessar o seletor de projetos

  2. Verifique se o faturamento está ativado para seu projeto do Google Cloud .

  3. Ative as APIs do Cloud necessárias para criar e se conectar ao AlloyDB para PostgreSQL.

    1. Na etapa Confirmar projeto, clique em Avançar para confirmar o nome do projeto no qual você vai fazer alterações.
    2. Na etapa Ativar APIs, clique em Ativar para ativar o seguinte:

      • API AlloyDB para PostgreSQL
      • API Knowledge Catalog

Criar e se conectar a um banco de dados

  1. Crie um cluster e a instância primária dele.
  2. Conecte-se à instância e crie um banco de dados.

Preparar o ambiente

Para se preparar para executar consultas em uma visualização parametrizada e segura, configure o banco de dados, as funções do banco de dados, a extensão parameterized_view e o esquema do aplicativo.

Ativar a extensão necessária

Ative a flag de banco de dados parameterized_views.enabled, que carrega as bibliotecas de extensão necessárias. Para mais informações, consulte Configurar flags de banco de dados de uma instância.

Configurar o banco de dados

  • Crie um banco de dados chamado database para os dados do aplicativo e visualizações parametrizadas. Para mais informações, consulte Criar um banco de dados.

Criar papéis de banco de dados, a extensão e o esquema do aplicativo

  1. No console Google Cloud , acesse a página do AlloyDB.

    Acessar o AlloyDB

  2. Selecione um cluster na lista.

  3. No menu de navegação, clique em AlloyDB Studio.

  4. Faça login no Studio usando a autenticação do Postgres.

  5. Clique em Autenticar. O painel "Explorer" mostra uma lista dos objetos no seu banco de dados.

  6. Clique em Nova guia do editor de SQL ou Nova guia para abrir uma nova guia.

  7. Crie a extensão parameterized_views no banco de dados.

    -- Requires parameterized_views.enabled set to true
    CREATE EXTENSION parameterized_views;
    

    Quando a extensão é criada, o sistema também cria um esquema chamado parameterized_views para que as APIs sejam contidas no namespace desse esquema e não entrem em conflito com as APIs atuais.

  8. Faça login como um usuário com privilégios de superusuário, como o usuário postgres integrado. Se você quiser criar um novo superusuário, por exemplo, admin_user, execute os seguintes comandos:

    CREATE ROLE admin_user WITH LOGIN PASSWORD '...';
    GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;
    

    Para obter mais informações, consulte CREATE USER.

  9. Crie uma nova função de banco de dados para executar consultas em visualizações seguras parametrizadas. É uma função do AlloyDB que o aplicativo usa para se conectar e fazer login no banco de dados para executar consultas com acesso limitado a funções ou objetos públicos ao conjunto mínimo necessário.

    CREATE ROLE psv_user WITH LOGIN PASSWORD '...';
    

    Para ver mais informações, consulte CREATE USER.

  10. Conecte-se como usuário administrativo.

    SET role TO admin_user;
    
  11. Crie o esquema que contém as tabelas.

    CREATE SCHEMA schema;
    
  12. Crie as tabelas e insira os dados.

    CREATE TABLE store.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT);
    
    INSERT INTO store.checked_items (bag_id, timestamp, loc_code, scan_type, location, customer_id) VALUES
    (101, '2023-10-26 10:00:00', 'ABC', 'I', 'Warehouse A', 123),
    (102, '2023-10-26 10:15:30', 'DEF', 'O', 'Loading Dock B', 456),
    (103, '2023-10-26 10:30:45', 'GHI', 'I', 'Conveyor Belt 1', 789),
    (104, '2023-10-26 11:00:00', 'JKL', 'O', 'Shipping Area C', 101),
    (105, '2023-10-26 11:45:15', 'MNO', 'I', 'Sorting Station D', 202),
    (106, '2023-10-26 12:00:00', 'PQR', 'O', 'Truck Bay E', 303);
    

Criar visualizações parametrizadas seguras e configurar privilégios de acesso

Para criar visualizações parametrizadas seguras e configurar privilégios de acesso adequados para a tabela e as visualizações de base, siga estas etapas:

  1. No console Google Cloud , acesse a página do AlloyDB.

    Acessar o AlloyDB

  2. Selecione um cluster na lista.

  3. No menu de navegação, clique em AlloyDB Studio.

  4. Faça login no Studio e conecte-se ao database como admin_user.

  5. Clique em Autenticar. O painel "Explorer" mostra uma lista dos objetos no seu banco de dados.

  6. Clique em Nova guia do editor de SQL ou Nova guia para abrir uma nova guia.

  7. Para fornecer acesso limitado à visualização, crie uma visualização segura parametrizada:

    CREATE VIEW store.secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM store.checked_items t
    WHERE customer_id = $@app_end_userid;
    
  8. Conceda acesso à visualização.

    GRANT SELECT ON store.secure_checked_items TO psv_user;
    
  9. Para acessar a visualização, conceda acesso ao esquema.

    GRANT USAGE ON SCHEMA store TO psv_user;
    
  10. Revogue o acesso direto à tabela de base.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    
  11. Faça login como administrador do admin_user e conceda a função psv_user a um usuário autenticado pelo IAM.

    GRANT psv_user TO "IAM_USER_EMAIL";
    

    Substitua IAM_USER_EMAIL pelo endereço de e-mail do seu usuário do IAM.

Verificar a segurança de dados

Para verificar se as visualizações seguras parametrizadas estão restringindo o acesso às visualizações designadas, faça login no banco de dados como o usuário autenticado pelo IAM. No AlloyDB, os usuários do IAM herdam as permissões das funções de banco de dados atribuídas a eles.

  1. Faça login no banco de dados como o usuário autenticado pelo IAM.

  2. Verifique se não é possível acessar a tabela de base.

    SELECT * FROM store.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. Acesse a visualização segura parametrizada usando a função execute_parameterized_query:

    SELECT * FROM parameterized_views.execute_parameterized_query(
      query => 'SELECT * from store.secure_checked_items',
      param_names => ARRAY ['app_end_userid'],
      param_values => ARRAY ['303']
    );
    
  4. Consulte a visualização segura parametrizada usando a sintaxe SQL e a solicitação QueryData com parâmetros PSV.

    curl -X POST \
      "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d '{
        "prompt": "Show me the checked items.",
        "context": {
          "datasource_references": {
            "alloydb": {
              "database_reference": {
                "project_id": "PROJECT_ID",
                "region": "REGION",
                "cluster_id": "CLUSTER_ID",
                "instance_id": "INSTANCE_ID",
                "database_id": "DATABASE_ID"
              }
            }
          },
          "parameterized_secure_view_parameters": {
            "parameters": {
              "app_end_userid": "303"
            }
          }
        },
        "generation_options": {
          "generate_query_result": true,
          "generate_natural_language_answer": true,
          "generate_explanation": true
        }
      }'

Substitua os seguintes valores:

  • PROJECT_ID: o ID do projeto do Google Cloud .
  • REGION: a região em que sua instância do AlloyDB para PostgreSQL está localizada.
  • CLUSTER_ID: o ID do seu cluster do AlloyDB para PostgreSQL.
  • INSTANCE_ID: o ID da sua instância do AlloyDB para PostgreSQL.
  • DATABASE_ID: o ID do seu banco de dados do AlloyDB para PostgreSQL.

Limpar

excluir o cluster

Quando você exclui o cluster criado na seção Antes de começar, todos os objetos criados também são excluídos.

  1. No console Google Cloud , acesse a página do AlloyDB.

    Acessar o AlloyDB

  2. Selecione um cluster na lista.

  3. Clique em Excluir cluster.

  4. Em Excluir cluster, insira o nome do cluster para confirmar que você quer excluir o cluster.

A seguir