En este documento, se describen las vistas parametrizadas en Spanner. Las vistas parametrizadas te permiten filtrar datos de forma dinámica según los parámetros de sesión que se pasan con las consultas, en especial para las aplicaciones y los sistemas de agentes que usan modelos de lenguaje grandes (LLM).
Las vistas parametrizadas extienden las capacidades de las vistas de la base de datos inyectando parámetros de contexto directamente en una definición de vista. Las vistas parametrizadas te permiten hacer lo siguiente:
- Pasa parámetros de contexto de tiempo de consulta, como la identidad del usuario o del usuario, a una definición de vista.
- Restringe los resultados de la consulta solo a las filas que coincidan con los parámetros proporcionados.
- Evita que los usuarios omitan los filtros de datos a nivel de la aplicación en las consultas en SQL generadas o ad hoc.
Para obtener más información, consulta Crea una vista parametrizada.
Cómo funcionan las vistas parametrizadas
Las vistas parametrizadas usan parámetros para pasar de forma segura el contexto a nivel de la aplicación, como un ID de usuario, a la base de datos. Cuando tu aplicación ejecuta una consulta, envía el contexto con la sentencia de consulta. Spanner accede a este contexto durante la ejecución, pero ni la consulta ni el usuario de la aplicación pueden leerlo ni modificarlo.
La función SECURE_CONTEXT() proporciona la interfaz de SQL para acceder a estos
parámetros seguros dentro de una definición de vista. Las vistas parametrizadas requieren
el modelo de seguridad de vista de derechos del definidor, en el que
la vista usa SECURE_CONTEXT() para acceder a los valores y filtrar los resultados.
Por ejemplo, para filtrar los datos según el ID del usuario que realiza la consulta, puedes
incluir lo siguiente en la cláusula WHERE de tu vista:
CREATE VIEW MyUserData
SQL SECURITY DEFINER AS
(SELECT *
FROM AllUserData
WHERE UserID = CAST(SECURE_CONTEXT('user_id'), INT));
Esto permite que la aplicación vea sus datos, pero no los de nadie más. También puedes crear una vista que permita a los moderadores ver datos menos sensibles de cualquier usuario:
CREATE VIEW SafeUserData
SQL SECURITY DEFINER AS
(SELECT UserID, AccountCreationTime, PublicProfileText
FROM AllUserData
WHERE SECURE_CONTEXT('role') = 'Moderator');
Aunque puedes usar SECURE_CONTEXT() en cualquier parte de una definición de consulta de vista,
la práctica recomendada para el rendimiento es usarla en la cláusula WHERE para filtrar
en las columnas de clave principal de una tabla o un índice. Esto garantiza que
Spanner envíe de manera eficiente la lógica de filtro a la capa de almacenamiento.
De forma predeterminada, consultar la función SECURE_CONTEXT() directamente en una consulta ad hoc
falla, a menos que el rol de la base de datos tenga el rol spanner_secure_context_reader.
Esto evita que los usuarios sin privilegios inspeccionen directamente los valores de los parámetros.
Un patrón recomendado es combinar vistas parametrizadas con vistas de derechos del definidor y control de acceso detallado (FGAC). Para asegurarte de que los usuarios solo puedan consultar datos a través de la vista, haz lo siguiente:
- Habilita el FGAC y crea un rol de base de datos para tu aplicación.
GRANTel privilegioSELECTen la vista para el rol.- Asegúrate de que el rol del sistema
publicno tenga privilegios otorgados en las tablas o vistas base.
Por ejemplo:
-- Create a role for the application user
CREATE ROLE pv_user;
-- Grant SELECT permission on the view to the role
GRANT SELECT ON VIEW MyUserData TO ROLE pv_user;
Después de crear la vista parametrizada, el proceso para una solicitud típica es el siguiente:
- Tu aplicación establece el contexto seguro en una solicitud de consulta. El contexto contiene información que identifica al usuario de la aplicación, como un ID o un rol de usuario.
- La aplicación ejecuta una consulta en una vista de derechos del definidor.
- La vista usa la función
SECURE_CONTEXT()en una cláusulaWHEREpara filtrar las filas según los valores proporcionados en el contexto seguro. - Spanner devuelve solo las filas que coinciden con el filtro, lo que filtra de manera eficaz los resultados de la consulta a los datos asociados con el contexto de la sesión del usuario.
Por ejemplo, una aplicación puede pasar el ID del usuario actual en el contexto seguro
con una de las bibliotecas cliente de Spanner. En el siguiente ejemplo, se usa la biblioteca cliente de C++ para establecer el parámetro seguro user_id:
(*request.mutable_secure_context())["user_id"] = "ca6095c4-1a68-44a8-9562-dd9e897326f0";
Luego, la aplicación ejecuta una consulta en SQL estándar en la vista. La vista
usa este user_id en su cláusula WHERE para devolver solo los registros que
pertenecen a ese usuario:
--Query executed by the application
SELECT * FROM MyUserData;
Beneficios de las vistas parametrizadas
Los parámetros te ayudan a lograr los siguientes objetivos:
Aísla los datos de los usuarios en aplicaciones multiusuario: Usa parámetros para asegurarte de que las consultas devuelvan datos solo para un usuario específico.
Restringir las consultas de IA agéntica: Restringe las consultas en lenguaje natural a los datos de un usuario o de un usuario.
Filtra datos con credenciales efímeras: Restringe el acceso a los datos según un ID de usuario o de usuario que no existe en Identity and Access Management (IAM).
Usa credenciales privadas para filtrar: Filtra los datos con los valores necesarios para la consulta que no se deben devolver al usuario final.
Mitigación de riesgos de seguridad
Las vistas parametrizadas ayudan a mitigar los riesgos de seguridad cuando los usuarios finales ejecutan consultas no confiables, como consultas en lenguaje natural, en tu base de datos. Estos riesgos incluyen los siguientes:
- Mensajes maliciosos: Los usuarios pueden intentar manipular el modelo subyacente para acceder a todos los datos de la aplicación.
- Consultas en SQL de alcance amplio: Los modelos de lenguaje grandes (LLM) pueden generar consultas en SQL que expongan datos sensibles, incluso a partir de consultas de usuarios bien intencionadas.
Con las vistas parametrizadas, puedes restringir el rango de filas que se devuelven a los usuarios individuales de la aplicación, sin importar cómo expresen sus consultas.
Prácticas recomendadas
Sigue estas prácticas para implementar vistas parametrizadas de manera eficaz.
Combina con vistas de derechos del definidor y FGAC: Usa parámetros como parte de un modelo de seguridad integral que incluya vistas de derechos del definidor y roles de control de acceso detallado. Otorga privilegios al rol
SELECTsolo en las vistas y asegúrate de que el rol y el rol del sistemapublicno tengan privilegios en las tablas base subyacentes.Usa JSON para contextos complejos: Para pasar un contexto estructurado, como un usuario con varios roles, serializa los datos como una cadena JSON. Pasa la cadena JSON como un solo parámetro. Usa JSON o JSONB integrados de Spanner para extraer valores dentro de la vista.
Simplifica el acceso con las UDF de SQL: Si accedes con frecuencia a campos dentro de un contexto JSON estructurado, crea funciones de SQL definidas por el usuario (UDF) para encapsular la lógica de extracción. El uso de UDF en tus vistas mejora la legibilidad y la capacidad de mantenimiento.
Protégete contra la inyección de instrucciones con Model Armor: Cuando generes consultas con LLM con entradas de usuario no confiables, usa Model Armor para identificar y bloquear de forma proactiva los intentos de inyección de instrucciones y jailbreaking.
Limitaciones
Las vistas parametrizadas tienen las siguientes limitaciones:
- Tipos de argumentos: La función
SECURE_CONTEXT()requiere un argumento de literal de cadena. - Tipos de resultados: La función
SECURE_CONTEXT()devuelve una cadena. - Interacciones de funciones de Spanner: No puedes usar
SECURE_CONTEXT()en columnas generadas, expresiones de valores de columna predeterminados ni dentro de funciones definidas por el usuario (UDF). - Barreras de seguridad: Las vistas parametrizadas en Spanner no incluyen una barrera de seguridad. Si bien todos los filtros se aplican antes de mostrar los resultados de la consulta, es posible que no restrinjan los datos a los que se accede durante el procesamiento interno de la consulta.
¿Qué sigue?
- Obtén información para crear una vista parametrizada.
- Obtén más información para usar vistas parametrizadas.
- Obtén más información sobre las vistas de derechos del definidor.
- Obtén más información sobre el control de acceso detallado.