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, y cada una tiene su propio gerente regional. El conjunto de datos de ventas en BigQuery tiene el importe de ventas por región y por fecha.

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

Requisitos

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

Limitaciones

  • El panel requiere una autorización única de cada usuario la primera vez que lo ve.
  • Los usuarios no pueden editar el panel ni compartirlo con otras personas.
  • Si eres cliente de Workspace y tu administrador inhabilitó el uso compartido de archivos de Drive con “Cualquier persona que tenga el 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.

Crea un nuevo conector de comunidad

Revisa Cómo funcionan los conectores de la comunidad y completa el codelab de Community Connector para comenzar. Usa la herramienta para desarrolladores para crear conectores y lograr un proceso de desarrollo más rápido y sencillo.

Escribe el código del conector

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

Actualiza el manifiesto

Consulta la referencia del manifiesto y completa el manifiesto 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 permisos pertinentes para los servicios que se usan en el conector.

El manifiesto debería verse de la siguiente manera:

{
  ...
  "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 Cloud.
    • Roles de Identity and Access Management (IAM) obligatorios: BigQuery Data Viewer, BigQuery Job User
  3. Descarga el archivo JSON para obtener las claves de las cuentas de servicio. Almacena las claves en las propiedades de la secuencia de comandos de tu proyecto del conector.
  4. Incluye la biblioteca OAuth2 para Apps Script en tu proyecto de Apps Script.
  5. Implementa el código de OAuth2 requerido 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. Construye tu consulta de BigQuery.
    • Con el correo electrónico, busca la asignación entre el correo electrónico y los datos.
    • Usa las cláusulas 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 Data Studio] para devolver la configuración de la consulta desde getData.
    • Pasa la consulta construida, el proyecto de facturación y el token de OAuth de la cuenta de servicio.
    • Condicional: Si recibes la entrada 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 las versiones para los conectores.
  2. Crea una implementación de producción para el conector.
  3. Usa la implementación de producción para crear una fuente de datos y un informe nuevo en Data Studio.
  4. Agrega todas las tablas y los gráficos del informe.
  5. El panel ya está listo para compartirse con los usuarios.

Haz que el panel esté disponible para 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 con “Cualquier persona que tenga el vínculo”.
  3. Opcional: Usa un servicio de acortador de URLs para crear un vínculo corto para la URL del panel. Comparte la URL acortada con tus usuarios. Esto ayuda a reemplazar la URL del panel más adelante si es necesario.
  4. Opcional: Mide el uso del panel de control configurando Google Analytics para tu informe.

Código de ejemplo