Controlar y proteger el acceso a los datos de la aplicación

Las vistas seguras parametrizadas proporcionan seguridad de los datos y control de acceso a nivel de las filas, ya que filtran los resultados de las consultas según la identidad del usuario de la aplicación.

En este instructivo, se describe cómo configurar vistas seguras con parámetros en Cloud SQL, configurar roles y privilegios de bases de datos para restringir el acceso a tablas base y verificar la seguridad de los datos. Los ejemplos que se proporcionan en este documento son solo para fines de demostración.

¿Qué son las vistas seguras parametrizadas?

Como práctica recomendada general, tu aplicación debe ejecutarse con una cuenta de servicio que tenga el acceso mínimo requerido a tu base de datos. Por ejemplo, si tu aplicación no debería escribir en tu base de datos, debería usar un rol con acceso de solo lectura. Debes configurar estos controles de acceso a nivel de la base de datos.

Cuando tu aplicación necesita una seguridad más detallada que la que permite el acceso estándar a nivel de la base de datos, puedes usar vistas seguras parametrizadas para asegurarte de que los usuarios solo vean los datos autorizados.

El uso de vistas seguras con parámetros proporciona dos beneficios principales:

  • Seguridad dinámica a nivel de la fila: Filtra las consultas con identificadores de usuarios finales para que los usuarios accedan solo a sus datos autorizados, independientemente de la redacción de la consulta.
  • Administración de roles simplificada: Usa un solo rol de base de datos compartido para todos los usuarios de la aplicación en lugar de administrar roles de base de datos separados para cada usuario individual.

Objetivos

  • Crea vistas seguras con parámetros con nombre.
  • Crea el rol de base de datos que usa la aplicación para conectarse a la base de datos y acceder a vistas seguras con parámetros.
  • Otorga los permisos del nuevo rol a las vistas seguras parametrizadas y revoca el acceso a las tablas básicas.
  • Conéctate con el nuevo rol y verifica que no se pueda acceder a las tablas restringidas.
  • Ejecuta consultas en las vistas seguras parametrizadas con la función execute_parameterized_query() o la API de QueryData.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios nuevos de Google Cloud cumplan con los requisitos para acceder a una prueba gratuita.

Para evitar la facturación continua, borra los recursos que creaste cuando termines las tareas de este documento. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

Antes de crear vistas seguras con parámetros, completa los siguientes requisitos previos.

Habilita la facturación y las APIs obligatorias

  1. En la consola de Google Cloud , selecciona un proyecto.

    Ir al selector de proyectos

  2. Asegúrate de tener habilitada la facturación para tu proyecto de Google Cloud .

  3. Habilita las API de Cloud necesarias para crear y conectarte a Cloud SQL.

    1. Habilitar la API

    2. En el paso Confirm project, haz clic en Next para confirmar el nombre del proyecto en el que realizarás cambios.

    3. En el paso Habilitar APIs, haz clic en Habilitar para habilitar lo siguiente:

      • API de Cloud SQL para PostgreSQL
      • API de Knowledge Catalog

Crea una base de datos y conéctate a ella

  1. Crea una instancia.
  2. Conéctate a tu instancia y crea una base de datos.

Prepara el entorno

Para prepararte para ejecutar consultas en una vista segura parametrizada, configura la base de datos, los roles de la base de datos, la extensión parameterized_views y el esquema de la aplicación.

Habilita la marca de la base de datos

Habilita la marca de base de datos cloudsql.enable_parameterized_views, que carga las bibliotecas de extensión requeridas. Para obtener más información, consulta Configura las marcas de base de datos de una instancia.

Configura la base de datos

  • Crea una base de datos llamada database para los datos de la aplicación y las vistas seguras parametrizadas. Para obtener más información, consulta Crea una base de datos.

Crea roles de bases de datos, la extensión y el esquema de la aplicación

  1. En la consola de Google Cloud , ve a la página de Cloud SQL.

    Ir a Cloud SQL

  2. Elige una instancia de la lista.

  3. En el menú de navegación, haz clic en Cloud SQL Studio.

  4. Accede a Studio con la autenticación de Postgres.

  5. Haz clic en Autenticar. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.

  6. Haz clic en Nueva pestaña del editor de SQL o Nueva pestaña para abrir una pestaña nueva.

  7. Para usar vistas con parámetros, crea la extensión parameterized_views en tu base de datos:

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

    Cuando se crea la extensión, la base de datos también crea un esquema llamado parameterized_views para que las APIs se incluyan en el espacio de nombres de ese esquema y no entren en conflicto con las APIs existentes.

  8. Accede como un usuario con privilegios de superusuario, como el usuario postgres integrado.

  9. Crea un rol de base de datos nuevo para ejecutar consultas en vistas seguras parametrizadas. Este es un rol de Cloud SQL que la aplicación usa para conectarse y acceder a la base de datos para ejecutar consultas con acceso limitado a funciones u objetos públicos al conjunto mínimo requerido.

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

    Para obtener más información, consulta CREATE USER

  10. Conéctate como usuario administrador.

    SET role TO postgres;
    
  11. Crea el esquema que contiene las tablas.

    CREATE SCHEMA store;
    
  12. Crea las tablas e inserta datos.

    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);
    

Crea vistas seguras con parámetros y configura privilegios de acceso

Para crear vistas seguras con parámetros y configurar privilegios de acceso adecuados para la tabla y las vistas básicas, sigue estos pasos:

  1. En la consola de Google Cloud , ve a la página de Cloud SQL.

    Ir a Cloud SQL

  2. Elige una instancia de la lista.

  3. En el menú de navegación, haz clic en Cloud SQL Studio.

  4. Accede a Studio y conéctate a database como postgres.

  5. Haz clic en Autenticar. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.

  6. Haz clic en Nueva pestaña del editor de SQL o Nueva pestaña para abrir una pestaña nueva.

  7. Para proporcionar acceso limitado a la vista, crea una vista con parámetros:

    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. Otorga acceso a la vista.

    GRANT SELECT ON store.secure_checked_items TO psv_user;
    
  9. Para acceder a la vista, otorga acceso al esquema.

    GRANT USAGE ON SCHEMA store TO psv_user;
    
  10. Revoca el acceso directo a la tabla base.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    

    Nota: El propietario de la vista parametrizada debe tener privilegios de SELECT en las tablas base. Además, el usuario de la vista parametrizada debe tener USAGE en el esquema de la vista y SELECT en la vista. Por ejemplo, el usuario postgres es propietario de la vista parametrizada, por lo que tiene privilegios de SELECT en las tablas base, mientras que el usuario psv_user debe tener USAGE en el esquema store y SELECT en la vista.

  11. Accede como administrador de postgres y otorga el rol de psv_user a un usuario autenticado por IAM:

    GRANT psv_user TO "IAM_USER_EMAIL";
    

    Reemplaza IAM_USER_EMAIL por la dirección de correo electrónico de tu usuario de IAM.

Verifica la seguridad de los datos

Para verificar que las vistas seguras parametrizadas restringen el acceso a las vistas designadas, accede a la base de datos como el usuario autenticado por IAM. En Cloud SQL, los usuarios de IAM heredan los permisos de los roles de la base de datos que se les asignaron.

  1. Accede a la base de datos como el usuario autenticado por IAM.

  2. Verifica que no se pueda acceder a la tabla base.

    SELECT * FROM store.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. Accede a las vistas seguras con parámetros a través de la función 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. Consulta las vistas seguras parametrizadas con la sintaxis de SQL y la solicitud QueryData con parámetros de 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
            }
          }'

      Reemplaza los siguientes valores:

      • PROJECT_ID: Es el ID del proyecto de Google Cloud .
      • REGION: Es la región en la que se encuentra tu instancia de Cloud SQL para PostgreSQL.
      • INSTANCE_ID: Es el ID de tu instancia de Cloud SQL para PostgreSQL.
      • DATABASE_ID: Es el ID de tu base de datos de Cloud SQL para PostgreSQL.

    Realiza una limpieza

    Borra el clúster

    Cuando borras el clúster que creaste en la sección Antes de comenzar, también borras todos los objetos que creaste.

    1. En la consola de Google Cloud , ve a la página de Cloud SQL.

      Ir a Cloud SQL

    2. Elige una instancia de la lista.

    3. Haz clic en Borrar.

    4. Ingresa el nombre de la instancia y haz clic en Borrar para confirmar que quieres borrarla.