Las vistas seguras parametrizadas proporcionan seguridad de los datos y control de acceso a las filas para las aplicaciones. Filtran los resultados de la consulta según la identidad del usuario de la aplicación.
En este instructivo, se describe cómo configurar vistas seguras parametrizadas en AlloyDB para PostgreSQL, configurar roles y privilegios de la base de datos para restringir el acceso a las 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 debe escribir en tu base de datos, debe 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 permiten los accesos 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. Las vistas seguras parametrizadas proporcionan seguridad de los datos dinámica y control de acceso a las filas adecuado para aplicaciones de SaaS multiusuario sin necesidad de roles de base de datos independientes para cada usuario final de la aplicación.
El uso de vistas seguras parametrizadas proporciona dos beneficios principales:
- Seguridad de los datos dinámica y control de acceso a las filas: Filtra las consultas con identificadores de usuario final para que los usuarios accedan solo a sus datos autorizados, independientemente de la frase de la consulta.
- Administración de roles más sencilla: 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 independientes para cada persona.
Objetivos
- Crear vistas seguras parametrizadas con parámetros de vista con nombre
- Crea el rol de base de datos que usa la aplicación para conectarse a la base de datos y acceder a las vistas seguras parametrizadas.
- Otorga los permisos del rol nuevo a las vistas seguras parametrizadas y revoca el acceso a las tablas base.
- Conéctate con el rol nuevo 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 que se te siga facturando, 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 parametrizadas, completa los siguientes requisitos previos.
Habilita la facturación y las APIs obligatorias
En la consola de Google Cloud , selecciona un proyecto.
Asegúrate de tener habilitada la facturación para tu proyecto de Google Cloud .
Habilita las API de Cloud necesarias para crear AlloyDB para PostgreSQL y conectarte a él.
En el paso Confirmar proyecto, haz clic en Siguiente para confirmar el nombre del proyecto en el que realizarás cambios.
En el paso Habilitar APIs, haz clic en Habilitar para habilitar lo siguiente:
- API de AlloyDB para PostgreSQL
- API de Knowledge Catalog
- API de Data Analytics with Gemini (
geminidataanalytics.googleapis.com)
Crea una base de datos y conéctate a ella
Otorga los roles necesarios y crea un usuario de la base de datos de IAM
Para autenticarte con Identity and Access Management (IAM) y ejecutar solicitudes de queryData en vistas seguras parametrizadas, configura el usuario o la cuenta de servicio de IAM:
Otorga los siguientes roles de IAM a
IAM_USER_EMAILen tu proyecto de Google Cloud :roles/geminidataanalytics.queryDataUserroles/serviceusage.serviceUsageConsumerroles/alloydb.databaseUser
Para obtener más información sobre cómo otorgar roles de IAM, consulta Agrega una vinculación de política de IAM para un proyecto.
Habilita la autenticación de IAM en tu instancia de AlloyDB y agrega
IAM_USER_EMAILcomo usuario de la base de datos basada en IAM en tu clúster. Debes crear este usuario de base de datos de IAM antes de otorgarle el rol de base de datospsv_user. Para obtener más información sobre cómo configurar usuarios de la base de datos de IAM, consulta Administra la autenticación de IAM.
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 base de datos
Habilita la marca de base de datosparameterized_views.enabled, que carga las
bibliotecas de extensiones 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
databasepara 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 base de datos, la extensión y el esquema de la aplicación
En la consola de Google Cloud , ve a la página de AlloyDB.
Selecciona un clúster de la lista.
En el menú de navegación, haz clic en AlloyDB Studio.
Accede a Studio con la autenticación de la cuenta de administrador.
Haz clic en Autenticar. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.
Haz clic en Nueva pestaña del editor de SQL o Nueva pestaña para abrir una pestaña nueva.
Para usar vistas parametrizadas, crea la extensión
parameterized_viewsen 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_viewspara que las APIs estén contenidas en el espacio de nombres de ese esquema y para que esas APIs no entren en conflicto con las APIs existentes.Accede como un usuario con privilegios de superusuario, como el usuario
postgresintegrado. Si quieres crear un superusuario nuevo, por ejemplo,admin_user, ejecuta los siguientes comandos:CREATE ROLE admin_user WITH LOGIN PASSWORD '...'; GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;Para obtener más información, consulta
CREATE USERCrea un nuevo rol de base de datos para ejecutar consultas en vistas seguras parametrizadas y otorga a
admin_userla capacidad de administrar este rol. Este es un rol de AlloyDB 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 '...'; GRANT psv_user TO admin_user WITH ADMIN OPTION;Para obtener más información, consulta
CREATE USERConéctate como usuario administrador.
SET role TO admin_user;Crea el esquema que contiene las tablas.
CREATE SCHEMA store;Crea las tablas y, luego, inserta los 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);
Crear vistas seguras parametrizadas y configurar privilegios de acceso
Para crear vistas seguras parametrizadas y configurar los privilegios de acceso adecuados para la tabla base y las vistas, sigue estos pasos:
En la consola de Google Cloud , ve a la página de AlloyDB.
Selecciona un clúster de la lista.
En el menú de navegación, haz clic en AlloyDB Studio.
Accede a Studio y conéctate a la base de datos llamada
databasecomo el usuarioadmin_user.Haz clic en Autenticar. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.
Haz clic en Nueva pestaña del editor de SQL o Nueva pestaña para abrir una pestaña nueva.
Para proporcionar acceso limitado a la vista, crea una vista 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;Otorga acceso a la vista.
GRANT SELECT ON store.secure_checked_items TO psv_user;Para acceder a la vista, otorga acceso al esquema.
GRANT USAGE ON SCHEMA store TO psv_user;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
SELECTen las tablas base. Además, el usuario de la vista parametrizada debe tenerUSAGEen el esquema de la vista ySELECTen la vista. Por ejemplo, el usuarioadmin_useres propietario de la vista parametrizada, por lo que tiene privilegiosSELECTen las tablas base, mientras que elpsv_userdebe tenerUSAGEen el esquemastoreySELECTen la vista.Asegúrate de que se haya agregado
IAM_USER_EMAILal clúster como usuario de la base de datos de IAM, accede como el usuariopostgreso comoadmin_user, y otorga el rolpsv_useral usuario autenticado por IAM:GRANT psv_user TO "IAM_USER_EMAIL";Reemplaza
IAM_USER_EMAILpor 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 restrinjan el acceso a las vistas designadas, accede a la base de datos como el usuario autenticado por IAM. En AlloyDB, los usuarios de IAM heredan los permisos de los roles de base de datos que se les asignan.
Accede a la base de datos como el usuario autenticado por IAM.
Verifica que no se pueda acceder a la tabla base.
SELECT * FROM store.checked_items; ERROR: permission denied for table checked_itemsAccede a las vistas seguras parametrizadas con 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'] );Accede a Google Cloud CLI como
IAM_USER_EMAILejecutandogcloud auth application-default loginpara quegcloud auth application-default print-access-tokengenere un token para el usuario de la base de datos de IAM restringido y, luego, consulta las vistas seguras parametrizadas con el métodoqueryDatacon 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": { "alloydb": { "database_reference": { "project_id": "PROJECT_ID", "region": "REGION", "cluster_id": "CLUSTER_ID", "instance_id": "INSTANCE_ID", "database_id": "DATABASE_ID", "table_ids": [ "store.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 } }'Usa el campo
table_idsendatabase_referencepara asegurarte de queQueryDatasolo genere SQL en la vista segura parametrizadastore.secure_checked_items. Si omitestable_idsy el rol de la base de datos tiene accesoSELECTa la tabla basestore.checked_items,QueryDatapodría consultar la tabla base directamente, lo que omitiría la vista segura. Especifica el nombre de la vista calificado por el esquema, ya que los nombres no calificados entable_idsse establecen de forma predeterminada en el esquemapublic.Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto de Google Cloud .REGION: Es la región en la que se encuentra tu instancia de AlloyDB para PostgreSQL.CLUSTER_ID: Es el ID de tu clúster de AlloyDB para PostgreSQL.INSTANCE_ID: Es el ID de tu instancia de AlloyDB para PostgreSQL.DATABASE_ID: Es el ID de tu base de datos de AlloyDB para PostgreSQL, que esdatabaseen este instructivo.
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.
En la consola de Google Cloud , ve a la página de AlloyDB.
Selecciona un clúster de la lista.
Haz clic en Borrar clúster.
En Borrar clúster, ingresa el nombre del clúster para confirmar que deseas borrarlo.
¿Qué sigue?
- Obtén más información sobre las vistas seguras parametrizadas.
Obtén información para administrar la seguridad de los datos de la aplicación con vistas seguras parametrizadas.