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

As visualizações seguras parametrizadas oferecem segurança de dados e controle de acesso a linhas para aplicativos. Eles filtram os resultados da consulta com base na identidade do usuário do aplicativo.

Neste tutorial, descrevemos como configurar visualizações seguras parametrizadas no Cloud SQL, configurar papéis e privilégios de banco de dados para restringir o acesso a tabelas 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, seu aplicativo deve 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. Configure 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, é possível usar visualizações seguras parametrizadas para garantir que os usuários tenham acesso de visualização apenas aos dados autorizados. As visualizações seguras parametrizadas oferecem segurança de dados dinâmica e controle de acesso a linhas adequados para aplicativos SaaS multilocatários sem exigir papéis de banco de dados separados para cada usuário final do aplicativo.

O uso de visualizações seguras parametrizadas oferece três benefícios principais:

  • Segurança de dados dinâmica e controle de acesso por linha: filtra consultas usando identificadores de usuário final para que os usuários acessem apenas os dados autorizados, independentemente da frase da consulta.
  • Gerenciamento de papéis mais fácil: 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 indivíduo.

Objetivos

  • Criar visualizações seguras parametrizadas com parâmetros de visualização nomeados.
  • Crie o papel de banco de dados usado pelo aplicativo para se conectar ao banco de dados e acessar visualizações seguras parametrizadas.
  • Conceda as permissões do novo papel às visualizações seguras parametrizadas e revogue o acesso às tabelas base.
  • Conecte-se usando o novo papel e verifique se as tabelas restritas não podem ser acessadas.
  • Execute consultas na visualização parametrizada usando o procedimento armazenado mysql.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 deste documento. Para mais informações, consulte Limpeza.

Antes de começar

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

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 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 MySQL
      • API Knowledge Catalog
      • API Data Analytics com Gemini (geminidataanalytics.googleapis.com)

Criar e se conectar a um banco de dados

  1. Criar uma instância.
  2. Conecte-se à instância e crie um banco de dados.
  3. Ative a API Cloud SQL Data na instância do Cloud SQL para MySQL para que a API QueryData possa executar consultas nela:

    gcloud sql instances patch INSTANCE_ID \
        --project=PROJECT_ID \
        --data-api-access=ALLOW_DATA_API

    Substitua:

    • INSTANCE_ID: o ID da instância do Cloud SQL para MySQL.
    • PROJECT_ID: o ID do projeto Google Cloud .

Conceder os papéis necessários e criar um usuário de banco de dados do IAM

Para autenticar com o Identity and Access Management (IAM) e executar solicitações queryData em visualizações seguras parametrizadas, configure o usuário ou a conta de serviço do IAM:

  1. Conceda os seguintes papéis do IAM a IAM_USER_EMAIL no projeto do Google Cloud :

    • roles/geminidataanalytics.queryDataUser
    • roles/serviceusage.serviceUsageConsumer
    • roles/cloudsql.instanceUser

    Para mais informações sobre como conceder papéis do IAM, consulte Adicionar vinculação de política do IAM a um projeto.

  2. Ative a autenticação do banco de dados do IAM na instância do Cloud SQL e adicione IAM_USER_EMAIL como um usuário do banco de dados do IAM na instância. É preciso criar esse usuário do banco de dados do IAM antes de conceder a ele o papel de banco de dados psv_user. Para mais informações sobre como configurar usuários de banco de dados do IAM, consulte Gerenciar usuários com a autenticação de banco de dados do IAM.

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 e o esquema do aplicativo.

Ativar a flag de banco de dados

  • Verifique se a instância do Cloud SQL para MySQL está executando o Cloud SQL para MySQL 8.0.43 ou mais recente. Se a instância do Cloud SQL para MySQL 8.0 estiver executando uma versão secundária anterior, será possível fazer um upgrade de versão secundária.
  • Ative a flag de banco de dados cloudsql_parameterized_secure_view na instância. Essa alteração de flag não exige a reinicialização do banco de dados. Para mais informações, consulte Configurar flags de banco de dados de uma instância.

Configurar o banco de dados e os papéis

  1. No console do Google Cloud , 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 uma conta de usuário administrativo.

  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 um banco de dados chamado store_db para os dados e as visualizações do aplicativo:

    CREATE DATABASE IF NOT EXISTS store_db;
    USE store_db;
    
  8. Crie um novo papel de banco de dados para executar consultas em visualizações parametrizadas. O aplicativo usa esse papel para se conectar ao banco de dados e executar consultas com acesso restrito estritamente a visualizações autorizadas:

    CREATE ROLE 'psv_user';
    

Criar a tabela e inserir dados

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

    Acessar o Cloud SQL

  2. Selecione uma instância do Cloud SQL para MySQL na lista.

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

  4. Faça login no Studio usando a autenticação do banco de dados.

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

  6. Crie as tabelas e insira os dados:

    CREATE TABLE store_db.checked_items (
    bag_id INT,
    timestamp TIMESTAMP,
    loc_code CHAR(3),
    scan_type CHAR(1),
    location TEXT,
    customer_id INT
    );
    
    INSERT INTO store_db.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, siga estas etapas:

  1. No console do Google Cloud , 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 banco de dados store_db como a conta de usuário administrativo, como root ou ADMIN_USER, que você usou na seção anterior.

  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_db.secure_checked_items AS
    SELECT bag_id, timestamp, location
    FROM store_db.checked_items t
    WHERE customer_id = @app_end_userid;
    
  8. Conceda acesso SELECT na visualização parametrizada ao papel psv_user:

    GRANT SELECT ON store_db.secure_checked_items TO 'psv_user';
    
  9. Conceda permissão de execução no procedimento armazenado do sistema integrado usado para executar consultas parametrizadas com segurança:

    GRANT EXECUTE ON PROCEDURE mysql.execute_parameterized_query TO 'psv_user';
    
  10. Opcional. Revogue explicitamente todos os privilégios diretos na tabela base de psv_user para garantir que os usuários não possam ignorar a visualização segura:

    REVOKE ALL PRIVILEGES ON store_db.checked_items FROM 'psv_user';
    
  11. Verifique se IAM_USER_EMAIL foi adicionado à instância como um usuário de banco de dados do IAM e conceda o papel psv_user ao usuário de banco de dados autenticado pelo IAM ou à conta de login do aplicativo:

    GRANT 'psv_user' TO 'IAM_USERNAME'@'%';
    
    SET DEFAULT ROLE 'psv_user' TO 'IAM_USERNAME'@'%';
    

    Substitua IAM_USERNAME pelo nome de usuário do banco de dados do IAM ou pela conta de login do aplicativo. Para uma conta de usuário do IAM, o Cloud SQL para MySQL remove @ e o nome de domínio do endereço de e-mail. Portanto, especifique o prefixo de e-mail antes de @, como user para user@example.com.

Verificar a segurança de dados

Para verificar se é possível consultar as visualizações seguras parametrizadas, siga estas etapas:

  1. Faça login no Cloud SQL Studio usando o endereço de e-mail restrito do IAM ou o login do aplicativo.

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

  3. Consulte a tabela base e verifique se o acesso foi negado.

    SELECT * FROM store_db.checked_items;
    

    O banco de dados retorna o erro ERROR 1142 (42000): SELECT command denied to user 'IAM_USERNAME'@'%' for table 'checked_items'.

  4. Consulte a visualização segura parametrizada usando o procedimento armazenado mysql.execute_parameterized_query integrado.

    CALL mysql.execute_parameterized_query(
      'SELECT * FROM store_db.secure_checked_items',
      'app_end_userid=303'
    );
    
  5. Faça login na Google Cloud CLI como IAM_USER_EMAIL executando gcloud auth application-default login para que gcloud auth application-default print-access-token gere um token para o usuário restrito do banco de dados do IAM. Em seguida, consulte as visualizações seguras parametrizadas usando o método queryData com parâmetros de PSV:

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

    Use o campo table_ids em database_reference para garantir que o QueryData gere SQL apenas na visualização segura parametrizada secure_checked_items. Se você omitir table_ids e o papel do banco de dados tiver acesso SELECT na tabela base checked_items, QueryData poderá consultar a tabela base diretamente, ignorando a visualização segura.

    Substitua:

    • PROJECT_ID: o ID do projeto Google Cloud .
    • REGION: a região em que a instância do Cloud SQL para MySQL está localizada.
    • INSTANCE_ID: o ID da instância do Cloud SQL para MySQL.
    • DATABASE_ID: o ID do banco de dados do Cloud SQL para MySQL, que é store_db neste tutorial.

Limpar

Excluir a instância

Quando você exclui a instância criada na seção Antes de começar, todos os objetos criados também são excluídos.

  1. No console do Google Cloud , 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 inserindo o nome dela e clicando em Excluir.

A seguir

  • Saiba mais sobre as visualizações seguras parametrizadas.

  • Saiba como usar visualizações seguras parametrizadas.