Proteger e controlar o acesso aos dados de aplicativos

As visualizações seguras parametrizadas oferecem segurança de dados no nível da linha e controle de acesso, filtrando os resultados da consulta com base na identidade do usuário do aplicativo.

Este tutorial descreve como configurar visualizações seguras parametrizadas no Cloud SQL, configurar papéis e privilégios do banco de dados para restringir o acesso a tabelas de base e verificar segurança de dados. Os exemplos fornecidos neste documento são apenas para fins de demonstração.

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

Como prática recomendada geral, o aplicativo precisa ser executado usando uma conta de serviço com o acesso mínimo necessário ao banco de dados. Por exemplo, se o aplicativo não precisar gravar no banco de dados, ele deverá usar um papel com acesso somente leitura. É necessário configurar esses controles de acesso no nível do banco de dados.

Quando o aplicativo precisa de uma segurança mais granular do que o acesso padrão no nível do banco de dados permite, é possível usar visualizações seguras parametrizadas para garantir que os usuários tenham acesso de visualização apenas aos dados autorizados.

O uso de visualizações seguras parametrizadas oferece dois benefícios principais:

  • Segurança dinâmica no nível da linha: filtra consultas usando identificadores de usuários finais para que os usuários acessem apenas os dados autorizados, independentemente da frase da consulta.
  • Gerenciamento de papéis simplificado: usa um único papel de banco de dados compartilhado para todos os usuários do aplicativo, em vez de gerenciar papéis de banco de dados separados para cada pessoa.

Objetivos

  • Criar visualizações seguras parametrizadas com parâmetros de visualização nomeados.
  • Criar o papel de banco de dados usado pelo aplicativo para se conectar ao banco de dados e acessar visualizações seguras parametrizadas.
  • Conceder permissões de novo papel às visualizações seguras parametrizadas e revogar o acesso às tabelas de base.
  • Conectar usando o novo papel e verificar se as tabelas restritas não podem ser acessadas.
  • Executar consultas nas visualizações seguras parametrizadas 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, use a calculadora de preços.

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

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

Antes de começar

Antes de criar visualizações seguras parametrizadas, conclua os seguintes pré-requisitos.

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 Google Cloud projeto.

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

    1. Ativar a API

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

    3. Na etapa Ativar APIs, clique em Ativar para ativar o seguinte:

      • API Cloud SQL para PostgreSQL
      • API Knowledge Catalog

Criar e se conectar a um banco de dados

  1. Crie uma instância.
  2. Conecte-se à instância e crie um banco de dados.

Preparar o ambiente

Para se preparar para executar consultas em uma visualização segura parametrizada, configure o banco de dados, os papéis do banco de dados, a extensão parameterized_views e o esquema do aplicativo.

Ativar a flag do banco de dados

Ative a flag do banco de dados cloudsql.enable_parameterized_views, que carrega as bibliotecas de extensão necessárias. Para mais informações, consulte Configurar flags do 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 seguras 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 Google Cloud console, acesse a página do Cloud SQL.

    Acessar o Cloud SQL

  2. Selecione uma instância na lista.

  3. No menu de navegação, clique em Cloud SQL 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. Para usar visualizações parametrizadas, 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 banco de dados também cria um esquema chamado parameterized_views para que as APIs estejam contidas no namespace desse esquema e para que essas APIs 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.

  9. Crie um novo papel de banco de dados para executar consultas em visualizações seguras parametrizadas. Esse é um papel do Cloud SQL 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 mais informações, consulte CREATE USER.

  10. Conecte-se como usuário administrativo.

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

    CREATE SCHEMA store;
    
  12. Crie as tabelas e insira 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 seguras parametrizadas e configurar privilégios de acesso

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

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

    Acessar o Cloud SQL

  2. Selecione uma instância na lista.

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

  4. Faça login no Studio e conecte-se ao database como 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. Para fornecer acesso limitado à visualização, crie uma visualização 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;
    

    Observação:o proprietário da visualização parametrizada precisa ter privilégios SELECT nas tabelas de base. Além disso, o usuário da visualização parametrizada precisa ter USAGE no esquema da visualização e SELECT na visualização. Por exemplo, o usuário postgres é o proprietário da visualização parametrizada, então ele tem privilégios SELECT nas tabelas de base, enquanto o psv_user precisa ter USAGE no esquema store e SELECT na visualização.

  11. Faça login como administrador postgres e conceda o papel 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 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 Cloud SQL, os usuários do IAM herdam as permissões dos papéis de banco de dados atribuídos a eles.

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

  2. Verifique se a tabela de base não pode ser acessada.

    SELECT * FROM store.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. Acesse as visualizações seguras parametrizadas 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']
    );
    
    1. Consulte as visualizações seguras parametrizadas 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": {
                "cloud_sql_reference": {
                  "database_reference": {
                    "engine": "POSTGRESQL",
                    "project_id": "PROJECT_ID",
                    "region": "REGION",
                    "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 a instância do Cloud SQL para PostgreSQL está localizada.
      • INSTANCE_ID: o ID da instância do Cloud SQL para PostgreSQL.
      • DATABASE_ID: o ID do banco de dados do Cloud SQL 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 Google Cloud console, acesse a página do Cloud SQL.

      Acessar o Cloud SQL

    2. Selecione uma instância na lista.

    3. Clique em Excluir.

    4. Confirme que você quer excluir a instância digitando o nome dela e clicando em Excluir.