Prácticas recomendadas de RLS para fuentes de datos y libros de trabajo

La seguridad a nivel de fila (RLS) en Tableau restringe las filas de datos que un determinado usuario puede encontrar en un libro de trabajo. Esto difiere de los permisos de Tableau, que controlan el acceso al contenido y la funcionalidad de las funciones. Por ejemplo, los permisos controlan si un usuario puede hacer comentarios o editar un libro de trabajo, mientras que la seguridad a nivel de fila permite que dos usuarios que consulten el mismo dashboard vean solo los datos que cada usuario tiene permiso para ver.

Hay muchas maneras de implementar RLS en Tableau. Por ejemplo, puede configurar RLS en el nivel de fuente de datos o libro de trabajo, o puede configurar RLS en el nivel de conexión mediante una conexión virtual con una directiva de datos (requiere Data Management). Consulte la Descripción general de las opciones de seguridad a nivel de fila en Tableau para obtener detalles sobre las alternativas.

Nota: este tema se centra en las prácticas recomendadas de RLS para fuentes de datos y libros de trabajo. Para ver ejemplos más detallados sobre los conceptos descritos en este tema, consulte Prácticas recomendadas para la seguridad a nivel de fila con tablas de derechos(El enlace se abre en una ventana nueva) o Configurar la base de datos con la seguridad a nivel de fila en Tableau(El enlace se abre en una ventana nueva) del blog Tableau and Behold.

Flujo de trabajo de RLS

Para conexiones en tiempo real y extracciones de varias tablas, el flujo de trabajo básico de Seguridad a nivel de fila es:

  1. El usuario se identifica iniciando sesión en Tableau Server o en Tableau Cloud
    • Esto requiere un nombre de usuario distinto por usuario y un inicio de sesión único y seguro (SSO)
    • Active Directory, LDAP o la API de REST de Tableau pueden utilizarse para sincronizar nombres de usuario y establecer permisos
  2. El conjunto de derechos de datos para el usuario se recupera de todos los derechos de datos posibles
    • Esto requiere una estructura de datos que pueda vincular los derechos con el nombre de usuario de Tableau
  3. Los datos se filtran por los derechos de ese usuario
    • Esto a menudo requiere la utilización de funciones de usuario en un campo calculado
  4. Los datos publicados y filtrados se utilizan para crear contenido
    • El uso de una fuente de datos publicada (en lugar de insertada) con un filtro de fuentes de datos asegura que el RLS no pueda modificarse descargando o editando en la web el libro de trabajo

La forma en que se configuran las uniones, los campos calculados y los filtros depende de la estructura de los datos y de la forma en que se gestionan los usuarios.

Tablas de derechos

Cualquier combinación única de atributos en los que se puedan filtrar los datos es un derecho. Lo más común es que haya tablas separadas para especificar los derechos en sí mismos y asignar esos derechos a los usuarios o roles de usuario. La desnormalización se recomienda desde el punto de vista del rendimiento, ya que las uniones son operaciones costosas.

La vista de derechos, que consiste en los derechos asignados a usuarios o roles, se une a los datos. A continuación, se aplica un filtro de fuente de datos basado en el usuario, que actúa como una cláusula WHERE que solo introduce los derechos y, por lo tanto, las filas de datos adecuadas para el usuario en cuestión. (La optimización de la consulta debe asegurar que el filtrado ocurre antes de unirse cuando se procesa la consulta para minimizar la duplicación de datos. Para obtener más información, consulte Ejecución y orden de procesamiento de las operaciones).

Modelos de tablas de derechos

Por lo general, se usan dos modelos para representar los derechos:

Mapeo completo al nivel más profundo de granularidad

  • Los derechos se definen completamente para cada columna.
  • Hay una fila en la tabla de mapeo para cada posible derecho que tenga el usuario.
  • Este modelo requiere menos cláusulas de unión.

Derechos escasos

  • Los derechos se definen para cada nivel jerárquico, utilizando NULL para representar "todos".
  • Hay una sola línea en la tabla de asignación para un nivel determinado de la jerarquía de derechos, lo que reduce enormemente el número de líneas de derechos para los usuarios de niveles superiores de una jerarquía.
  • Este modelo requiere uniones y filtros más complejos.

Usuarios y roles

Las combinaciones de derechos suelen representarse como roles, que luego se vinculan a los usuarios en una tabla de asignación múltiple. Esto permite cambiar o eliminar fácilmente a un usuario de un rol, sin dejar de mantener un registro del rol y sus derechos.

Alternativamente, se puede crear una tabla de asignación múltiple que, en su lugar, asigna a los usuarios directamente a los derechos, en lugar de tener que unirse a una tabla de roles. Esto requiere gestionar los valores directamente en la tabla, pero elimina una unión.

Nota: Los valores de usuario asociados con un rol o derecho deben coincidir con el nombre de usuario o nombre completo en el sitio de Tableau para poder aprovechar las funciones de usuario en Tableau Desktop.

Uniones

Independientemente del modelo utilizado para representar los derechos, es aconsejable unir todos los derechos y tablas de mapeo en una única vista de derechos desnormalizados. Mientras que al principio esto causará una versión "blowup" (altamente duplicada) de los derechos, el filtro de la fuente de datos en el usuario lo reducirá. También querrá esta vista si piensa utilizar una extracción.

El método de granularidad más profunda puede tener un beneficio de rendimiento cuando todo es jerárquico: solo necesita hacer una unión en el nivel más profundo de la jerarquía. Esto solo funciona si todos los atributos del nivel inferior son distintos. Si es posible realizar una duplicación (por ejemplo, una subregión central en más de una región), deberá unir todas las columnas para lograr el efecto de un valor clave distinto.

Los detalles reales y sus características de rendimiento dependen del sistema de datos y requieren pruebas. Por ejemplo, el uso de una sola clave podría mejorar potencialmente el rendimiento, ya que la unión solo se ejecuta en una columna, pero la indexación correcta de todas las columnas puede dar el mismo rendimiento cuando se tienen en cuenta otros factores.

Implementación de la seguridad a nivel de fila

Granularidad más profunda

Una vez creada la vista desnormalizada de los derechos asignados, se establece una unión interna entre la vista y los datos en el cuadro de diálogo de conexión de datos de Tableau. Los datos pueden permanecer en un esquema en estrella tradicional. Alternativamente, las tablas de dimensiones y hechos se pueden materializar juntas en dos vistas. Las extracciones de varias tablas crearán tablas de extracción para que coincidan con las uniones, por lo que la creación de las dos vistas simplificará la extracción resultante. El SQL seguirá este patrón básico:

SELECT * 
FROM data d INNER JOIN entitlements e ON
d.attribute_a = e.attribute_a AND 
d.attribute_b = e.attribute_b AND ... 
WHERE e.username = USERNAME()

Derechos escasos

Si sus derechos se asemejan más al modelo de derechos escasos, entonces el SQL personalizado para unir los datos a los derechos sería un poco más complejo debido a los valores NULL. Conceptualmente, tendría el siguiente aspecto: 

SELECT *
FROM data d 
INNER JOIN entitlements e ON
(e.region_id = d.region_id OR ISNULL(e.region_id) AND
(e.sub_region_id = d.sub_region_id OR ISNULL(e.sub_region_id) AND
(e.country_id = d.country_id OR ISNULL(e.country_id)

Sin usar SQL personalizado, esto se puede hacer con una unión cruzada y filtros adicionales en Tableau Desktop. Cree un cálculo de unión en ambos lados del diálogo de unión que simplemente consiste en el número entero 1 y póngalos iguales. Esto une cada fila de la tabla de datos con cada fila de la tabla de derechos.

A continuación, necesita un cálculo (o cálculos individuales) para tener en cuenta los niveles de la jerarquía. Por ejemplo, puede tener varios cálculos que sigan este formato: [region_id] = [region_id (Entitlements View)] OR ISNULL([region_id (Entitlements View)]

O puede tener un cálculo combinado para todos los niveles en uno:

([region_id] = [region_id (Entitlements View)] OR ISNULL([region_id (Entitlements View)])
AND
([sub_region_id] = [sub_region_id (Entitlements View)] OR ISNULL([sub_region_id (Entitlements View)])
AND
([country_id] = [country_id (Entitlements View)] OR ISNULL([country_id (Entitlements View)])

La función ISNULLL hace coincidir cualquier columna de derechos con todos los elementos de la otra columna. Como siempre con RLS, estos cálculos se deben añadir como filtros de fuentes de datos.

Filtros de fuentes de datos

Para ambos enfoques, una vez que los derechos se unen correctamente con los datos, es necesario establecer un filtro para limitar los datos de un usuario específico. Se debe crear un campo calculado con una función de usuario. Por ejemplo, una simple comparación booleana de si el usuario listado en el campo Nombre de usuario es el mismo que el nombre de usuario de la persona registrada en el sitio de Tableau: [Username] = USERNAME()

Este cálculo se debe usar como un filtro de fuente de datos (con el valor TRUE seleccionado).

Si la fuente de datos está insertada y un usuario tiene permisos para editar o descargar el libro de trabajo, entonces el RLS es inexistente, ya que los filtros que lo aplican pueden eliminarse fácilmente. La fuente de datos de Tableau debe publicarse por separado, en lugar de dejarse insertada en el libro de trabajo.

Todos los accesos con la granularidad más profunda

También hay un escenario común en el que hay dos niveles de acceso dentro de la organización: personas que pueden verlo todo ("acceso completo") o personas con algún subconjunto de derechos razonablemente definible. Esto se ve más comúnmente en las aplicaciones integradas: la organización que alberga los datos puede ver todo, pero cada cliente solo puede ver sus propios datos. En este caso, se necesita una forma de devolver los datos completos para los usuarios de "acceso completo", manteniendo al mismo tiempo la granularidad más profunda para el resto de usuarios.

Para esta técnica, se utilizarán grupos de Tableau para crear una sustitución utilizando un cálculo en la condición de unión.

  1. Crear un grupo para los usuarios que deben ver todos los datos (llamado Acceso completo) 
  2. Desde el punto de vista del hecho, cree una unión izquierda con dos condiciones de unión
    • La primera condición de unión debe estar en la columna que representa el nivel más profundo de granularidad
    • La segunda condición de unión debe tener dos cálculos:
      • En el lado izquierdo (la vista de los hechos), para el cálculo, establezca el valor True
      • En el lado derecho (la vista de derechos), el cálculo debería ser: IF ISMEMBEROF('All Access') THEN False ELSE True END
  3. En una hoja, cree un cálculo estructurado como: [Username] = USERNAME() OR ISMEMBEROF(['All Access'] ([Entitlements View)])
  4. Crear un filtro de fuente de datos en el cálculo del nombre de usuario

Si un usuario es miembro del grupo Acceso completo, entonces la unión se convierte en una unión a la izquierda en True = False. Esto significa que no hay coincidencias en absoluto en la vista de derechos, por lo que la vista de hechos completa se devuelve con valores NULL para las columnas de la vista de derechos (duplicación cero). En el caso de que el usuario no forme parte del grupo Acceso completo, la condición de unión True = True no cambia nada y la unión funcionará tal y como se espera.

El cálculo de usuario utilizado como filtro de fuente de datos es válido para todas las filas cuando el grupo de sustitución está funcionando, o se filtrará solo hasta la granularidad más profunda del usuario en la jerarquía.

Ejecución y orden de procesamiento de las operaciones

Cuando se consulta una visualización en Tableau (Desktop, Server o Tableau Cloud), Tableau envía una consulta optimizada al RDBMS que procesa la consulta y envía los resultados de vuelta a Tableau para renderizar la visualización con los datos resultantes. El orden de las operaciones cuando se llevan a cabo las uniones, los cálculos y los filtros depende del optimizador de consultas y de cómo se ejecuta la consulta.

Conexiones en tiempo real

Cuando se utiliza una conexión en vivo a una fuente de datos en Tableau, el rendimiento de la ejecución de la consulta depende del optimizador de consultas que traduce el SQL entrante en un plan eficiente para recuperar los datos.

Hay dos maneras de procesar la consulta:

  1. Filtrar las filas de derechos para el usuario y luego unirse a la tabla de hechos
  2. Unir los derechos a la tabla de hechos y luego filtrar a las filas del usuario

En una situación ideal, el optimizador de consultas asegurará que la base de datos procese la consulta filtrando y luego uniendo. Si un usuario tiene derecho a todo, esto significa que el número máximo de filas procesadas será el número de filas de la tabla de datos.

Si la base de datos procesa la consulta uniendo y luego filtrando, puede haber duplicación de datos. El número máximo de filas procesadas será el número de usuarios con derecho a ver esa fila en particular por cada fila de la tabla de datos.

Estará claro si este segundo escenario ocurre: sus consultas tardan mucho tiempo en terminar, recibe errores o hay problemas de rendimiento en la base de datos. El volumen total de datos se expandirá exponencialmente, lo que podría causar un esfuerzo excesivo del sistema en el backend.

Extractos

Cuando la fuente de datos en Tableau es una conexión en vivo, Tableau envía todas las consultas que son necesarias para renderizar una visualización o dashboard particular al RDBMS. Cuando la fuente de datos es una extracción, el proceso de consulta de datos de la fuente de datos subyacente solo tiene lugar durante la creación y actualización de la extracción. El motor de extracción del archivo es el encargado de responder las consultas individuales de las visualizaciones.

El mismo orden de operaciones está presente cuando se crean extracciones de una sola tabla. Sin embargo, la "ampliación" tendrá lugar tanto en la fuente de datos subyacente como en la propia extracción resultante.

Consideraciones sobre las extracciones

A partir de la versión 2018.3 de Tableau, el motor de datos puede crear una extracción de tablas múltiples y la RLS puede implementarse como se describe anteriormente. El uso de extracciones de tablas múltiples reduce el tiempo que se tarda en generar una extracción con relaciones múltiples al no materializar la unión.

La extracción debe construirse con un objeto de datos y un objeto de derechos. Este es el almacenamiento más simple en la extracción y da como resultado el mejor rendimiento.

  • El objeto de datos es la tabla, vista o consulta SQL personalizada que representa la combinación desnormalizada de las tablas de datos y las tablas de dimensiones necesarias
  • El objeto derechos es una tabla desnormalizada, vista o consulta SQL personalizada de los derechos necesarios para filtrar los datos al nivel más granular necesario:
    • Una columna para el nombre de usuario que coincida con los nombres de usuario exactos en Tableau Server o en Tableau Cloud
    • Una línea para cada uno de los derechos más granulares al objeto de datos

Este formato se presenta según el método de granularidad más profunda descrito anteriormente. Las extracciones de tablas múltiples utilizan el mismo método, con la advertencia de que solo se están uniendo dos objetos de datos y que ya se aplica cualquier filtrado específico de campo dentro del objeto.

Debido a que las extracciones de tablas múltiples tienen deshabilitados los filtros de extracción, puede filtrar en las vistas o tablas a las que se conecta en la fuente de datos, o definir los filtros en objetos SQL personalizados en el cuadro de diálogo Conexión de datos de Tableau.

Nota: Al igual que con las conexiones en vivo, si la fuente de datos está insertada y un usuario tiene permisos para editar o descargar el libro de trabajo, entonces el RLS es inexistente, ya que los filtros que lo aplican pueden eliminarse fácilmente. La extracción debe publicarse por separado en lugar de dejarse insertada en el libro de trabajo.

Extracciones de tabla individual

El siguiente método solo se recomienda cuando se utiliza una versión de Tableau anterior a 2018.3: las extracciones de tablas múltiples son preferibles si están disponibles.

Las extracciones de tablas individuales materializan cualquier unión creada al construir la fuente de datos de Tableau y almacenan todo como una sola tabla a través de una consulta, cuyos resultados se transforman en una sola tabla en el archivo de extracción. Esta desnormalización conlleva el riesgo de causar una duplicación masiva de datos, ya que cada fila asignada a más de un derecho o usuario se duplicaría como resultado de la relación múltiple.

Para evitar esta duplicación:

  1. Cree un campo de usuarios de seguridad que contenga los nombres de usuario para ese derecho
    • por ejemplo, un valor puede ser "bhowell|mosterheld|rdugger"
  2. Utilice la función CONTAINS() dentro de Tableau para identificar correctamente a los usuarios individuales
    • Por ejemplo, CONTAINS([Security Users Field], USERNAME())

Este método obviamente tiene algunas condiciones. Requiere que pase de sus derechos en filas a una sola columna separada correctamente usando SQL, y esa columna solo puede contener un número limitado de caracteres. Las coincidencias parciales pueden ser un problema y es necesario utilizar separadores que nunca serán válidos en las propias identificaciones. Aunque rinde bien en el motor de datos de Tableau, si se usa como cálculo de cadena, funcionará bastante lento en la mayoría de las bases de datos. Esto limita su capacidad de volver a cambiar a una conexión en vivo.

Alternativamente, puede usar diferentes extracciones por "rol" o nivel de derecho, de modo que solo se incluyan en la extracción los datos apropiados para esa persona o nivel. Sin embargo, esto requiere determinados procesos para permitir y aprovechar adecuadamente la publicación de plantillas dentro de Tableau Server, generalmente a través de las API.

Usar la seguridad a nivel de fila (RLS) incorporada en una base de datos

Muchas bases de datos tienen mecanismos para RLS incorporados. Si su organización ya ha implementado seguridad a nivel de fila en una base de datos, es posible que pueda aprovechar su RLS actual. No es necesariamente más fácil ni mejor implementar un modelo de RLS incorporado que crearlo según las características de Tableau. Estas técnicas generalmente son útiles cuando una organización ya ha invertido en estas tecnologías y quiere rentabilizar esa inversión. La ventaja más importante de usar la Seguridad de nivel de fila incorporada es que permite a los administradores implementar y controlar su directiva de seguridad de datos desde un mismo lugar: las bases de datos. Para obtener más información, consulte Seguridad a nivel de fila en la base de datos.

¡Gracias por sus comentarios!Sus comentarios se han enviado correctamente. ¡Gracias!