Seguridad a nivel de fila de BigQuery con servicios avanzados

Por ejemplo, supongamos que intentas crear una solución para tu organización de ventas. La organización de ventas se divide en varias regiones, en las que cada región tiene su propio administrador regional. El conjunto de datos de ventas en BigQuery tiene monto de ventas por región y fecha.

La solución propuesta tendrá un único panel en el que los administradores regionales podrán ver los datos de ventas solo de sus propias regiones.

Requisitos

  • Los usuarios del panel accederán con una cuenta de Google.
  • Hay una asignación disponible entre el correo electrónico del usuario y los datos o filas a los que tiene acceso.
  • Se usará una cuenta de servicio para acceder a los datos de BigQuery. Por lo tanto, el proveedor del panel central y administrará la facturación.

Limitaciones

  • El panel requiere una autorización única de cada visualizador en la primera vista.
  • Los visualizadores no pueden editar el panel ni compartirlo con otros usuarios.
  • Si eres cliente de Workspace y tu administrador inhabilitó el uso compartido de archivos de Drive en “Cualquier persona con un vínculo”, quita la restricción de uso compartido o desarrolla la solución en una cuenta de Gmail.com.

Solución

Completa todos los pasos que se indican a continuación para implementar la solución.

Crear un nuevo conector de comunidad

Para comenzar, consulta Cómo funcionan los conectores de la comunidad y completa el Codelab sobre los conectores de la comunidad. Usa la Herramienta para desarrolladores para crear conectores a fin de agilizar y facilitar el proceso de desarrollo.

Escribe el código del conector

  1. getAuthType() debe mostrar NONE.
  2. getConfig() debe mostrar una configuración vacía.
    • Opcional: Si necesitas entradas específicas para configurar el panel, puedes solicitar entradas del usuario aquí.
  3. getSchema() debe mostrar el esquema de tu consulta.
    • Opcional: Puedes agregar cálculos y campos personalizados en la consulta de SQL o mediante campos calculados como parte del esquema.
  4. getData() se completará en un paso posterior.

Actualizar manifiesto

Consulta la referencia del manifiesto y complétalo con toda la información requerida, incluida la siguiente:

  1. establece dataStudio.forceViewersCredentials en true.
  2. establece dataStudio.advancedServices.data en true.
  3. Para oauthScopes, agrega https://www.googleapis.com/auth/userinfo.email y https://www.googleapis.com/auth/script.external_request. Consulta Alcances de autorización para Apps Script para obtener más información.
    • Condicional: Agrega todos los alcances relevantes para los servicios usados en el conector.

El manifiesto debería tener el siguiente aspecto:

{
  ...
  "dataStudio": {
    "forceViewersCredentials": true,
    "advancedServices": {
       "data": true
    },
    ...
  }
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/userinfo.email"
    ],
  ...
}

Implementa una cuenta de servicio

  1. Crea una cuenta de servicio en tu proyecto de Google Cloud. Este será tu proyecto de facturación.
  2. Asegúrate de que esta cuenta de servicio tenga acceso a BigQuery en el proyecto de la nube.
    • Funciones requeridas de Identity and Access Management (IAM): BigQuery Data Viewer, BigQuery Job User
  3. Descarga el archivo JSON para obtener las claves de cuentas de servicio. Almacena las claves en las propiedades de secuencias de comandos de tu proyecto de conector.
  4. Incluye la biblioteca de OAuth2 para Apps Script en tu proyecto de Apps Script.
  5. Implementa el código OAuth2 necesario para la cuenta de servicio:
    var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
    var SERVICE_ACCOUNT_KEY = 'private_key';
    var SERVICE_ACCOUNT_EMAIL = 'client_email';
    var BILLING_PROJECT_ID = 'project_id';
    
    /**
     * Copy the entire credentials JSON file from creating a service account in GCP.
     */
    function getServiceAccountCreds() {
      return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
    }
    
    function getOauthService() {
      var serviceAccountCreds = getServiceAccountCreds();
      var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
      var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];
    
      return OAuth2.createService('RowLevelSecurity')
        .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
        .setTokenUrl('https://accounts.google.com/o/oauth2/token')
        .setPrivateKey(serviceAccountKey)
        .setIssuer(serviceAccountEmail)
        .setPropertyStore(scriptProperties)
        .setCache(CacheService.getScriptCache())
        .setScope(['https://www.googleapis.com/auth/bigquery.readonly']);
    }
    

Implementa getData().

  1. Crea tu consulta de BigQuery.
    • Con el correo electrónico, busca la asignación entre el correo electrónico y los datos.
    • Usa la cláusula JOIN o WHERE para filtrar los datos.
  2. Obtén el correo electrónico del usuario efectivo (referencia de identidad del usuario).
  3. Usa los servicios avanzados de Looker Studio para mostrar la configuración de consulta desde getData.
    • Pasa la consulta creada, el proyecto de facturación y el token de OAuth de la cuenta de servicio.
    • Condicional: Si recibes entradas del usuario a través del conector getConfig, debes incorporar la entrada como parámetros de BigQuery.

Crea el panel

  1. Comprende cómo funcionan las implementaciones y versiones para los conectores.
  2. Crea una implementación de producción para el conector.
  3. Usar la implementación de producción para crear una fuente de datos y un informe nuevo en Looker Studio
  4. Agrega todas las tablas y los gráficos al informe.
  5. El panel ya está listo para que lo compartas con tus usuarios.

Poner el panel a disposición de los usuarios

  1. Comparte la secuencia de comandos del conector con los usuarios seleccionados o con “Cualquier persona que tenga el vínculo”.
  2. Comparte el panel con los usuarios seleccionados o mediante “Cualquier persona con el vínculo”.
  3. Opcional: Usa un servicio de acortador de URL a fin de crear un vínculo corto para la URL del panel. Comparte la URL abreviada con tus usuarios. Esto ayuda a reemplazar la URL del panel más adelante si es necesario.
  4. Opcional: Mide el uso del panel mediante la configuración de Google Analytics para tu informe.

Código de ejemplo