Dataform es una herramienta de Google Cloud Platform (GCP) que permite a los equipos de datos desarrollar, probar y desplegar transformaciones de datos. Al usar la integración continua (CI) para automatizar el despliegue de proyectos en Dataform, es fundamental comprender cómo gestionar los permisos de las cuentas de servicio en GitHub para garantizar la seguridad y la eficiencia.

Este artículo ofrece una guía completa para administrar los permisos de las cuentas de servicio en GitHub al implementar proyectos de Dataform mediante integración continua, con un enfoque en las mejores prácticas para entornos de desarrollo y producción.

Conectando Dataform con un repositorio Git de terceros

Dataform se integra con repositorios Git de terceros como GitHub, GitLab y Bitbucket. Para conectar un repositorio de Dataform a un repositorio Git remoto, el administrador debe otorgar el rol IAM de Dataform Admin (roles/dataform.admin) en los repositorios. Este rol proporciona los permisos necesarios para establecer la conexión. También se pueden utilizar roles personalizados u otros roles predefinidos para obtener los permisos necesarios.

Dataform ofrece la capacidad de trabajar con diferentes entornos, como desarrollo, pruebas y producción, lo que permite a los equipos gestionar y desplegar código de forma más eficiente. Para obtener más información sobre el uso de entornos en Dataform, consulta la documentación oficial (enlace a la documentación de entornos de Dataform)2.

En el caso de GitHub, la conexión se puede realizar a través de SSH o HTTPS 1. Para autorizar la conexión, se debe crear un token de acceso personal de GitHub con el nombre “dataform” y otorgarle los permisos api, read_repository y write_repository 1. Es importante establecer un tiempo de expiración adecuado para el token.

Este token se debe almacenar de forma segura en Secret Manager de GCP. Se debe otorgar acceso al secreto a la cuenta de servicio predeterminada de Dataform, que tiene el siguiente formato: service-YOUR_PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com 1. La cuenta de servicio necesita el rol roles/secretmanager.secretAccessor para acceder al secreto 3.

Restringiendo Git Remotes con organization policies

Para un mayor control sobre qué repositorios Git se pueden conectar a Dataform, las organizaciones pueden utilizar Organization Policies en GCP. Estas políticas permiten restringir los repositorios remotos permitidos para los repositorios de Dataform4.

Para configurar esta política:

  1. Ve a la página /Organizational Policies/Organization Policies.
  2. Si es necesario, selecciona la organización requerida en el menú desplegable del proyecto.
  3. Haz clic en Restrict git remotes for repositories in Dataform.
  4. Haz clic en Manage policy.
  5. Selecciona Customize para establecer la política de la organización para repositorios Git remotos específicos.
  6. Selecciona la Policy enforcement y Policy type
  7. Para Policy values, selecciona Custom.
  8. Introduce la URL completa de un repositorio Git remoto.
  9. Haz clic en New policy value e introduce las URL completas de los repositorios Git remotos según sea necesario.

Dataform Roles and Permissions

Dataform ofrece diferentes roles con permisos específicos para controlar el acceso a los recursos. Algunos de los roles predefinidos más relevantes son: 5

Role

Description

Permissions

Dataform Admin (roles/dataform.admin)

Tiene acceso completo a todos los recursos de Dataform.

Todos

Code Creator (roles/dataform.codeCreator)

Tiene acceso completo a todos los recursos de código privados y compartidos.

Crear y listar código en Dataform, acceder al código propio y al que se ha compartido explícitamente.

Code Editor (roles/dataform.codeEditor)

Tiene acceso de edición a Workspaces y acceso de solo lectura a Repositories.

Editar Workspaces, leer Repositories.

Code Viewer (roles/dataform.codeViewer)

Tiene acceso de solo lectura a todos los recursos de Dataform.

Leer todos los recursos.

Detailed Dataform Permissions

Dataform cuenta con 65 permisos diferentes que se pueden otorgar a las cuentas de servicio para un control de acceso granular. Estos permisos cubren una amplia gama de acciones, desde la creación y lectura de resultados de compilación hasta la gestión de repositorios y configuraciones de flujo de trabajo6.

Algunos ejemplos de permisos relevantes para CI/CD incluyen:

  • repositories.commit: Permite confirmar cambios en un repositorio de Dataform.
  • workflowConfigs.create: Permite crear configuraciones de flujo de trabajo.
  • releaseConfigs.create: Permite crear configuraciones de lanzamiento.

Para obtener una lista completa de los permisos de Dataform y los roles predefinidos que los incluyen, consulta la documentación de permisos de Dataform (enlace a la documentación de permisos de Dataform).

Mejores Prácticas para cuentas de servicio

Al configurar cuentas de servicio para Dataform, se recomienda crear un usuario de máquina en GitHub y limitar su acceso a los repositorios Git remotos que se utilizarán con Dataform 1. Esto ayuda a minimizar los riesgos de seguridad en caso de que la cuenta de servicio se vea comprometida. Al aislar el acceso de Dataform a través de un usuario de máquina dedicado, se reduce el riesgo de acceso no autorizado a otros repositorios o recursos en su organización de GitHub.

Permisos para GitHub Actions

GitHub Actions permite automatizar flujos de trabajo de CI/CD. Para el despliegue de proyectos en Dataform, se deben configurar los permisos de GitHub Actions con cuidado para evitar riesgos de seguridad.

Se recomienda seguir las siguientes mejores prácticas 7:

  • Principio de mínimo privilegio: Otorgar solo los permisos necesarios a los flujos de trabajo.
  • Utilizar etiquetas de versión específicas: Para protegerse contra ataques a la cadena de suministro de acciones de terceros.
  • No utilizar secretos en texto plano: Almacenar las claves de API, tokens y contraseñas en GitHub Secrets.
  • No referenciar valores que no se controlan: Un PR malicioso podría inyectar código.
  • Tener cuidado con los runners autohospedados: Preferiblemente, no utilizar esta opción para repositorios de código abierto o requerir aprobación para todas las ejecuciones de flujos de trabajo de origen externo.
  • Precaución con el disparador pull_request_target: Este disparador puede ser vulnerable a ataques de inyección de código.
  • Preferir OpenID Connect: Para acceder a los recursos de la nube. OpenID Connect mejora la seguridad al eliminar la necesidad de administrar claves de cuentas de servicio de larga duración, lo que reduce el riesgo de robo y uso indebido de credenciales.

Si planeas usar GitHub Actions, se recomienda incluir la opción de alcance workflow al crear el token de acceso personal en GitHub, ya que no está incluida de forma predeterminada10.

Un ejemplo de cómo configurar una acción de GitHub para desplegar una Cloud Function en función del entorno se puede encontrar en 10. Este ejemplo muestra cómo se puede usar una acción de GitHub para automatizar el despliegue de funciones en diferentes proyectos de GCP según el entorno.

Validating SQL Syntax in CI/CD

Para garantizar la calidad del código y prevenir errores de despliegue, es importante validar la sintaxis SQL en el proceso de CI/CD. Algunas estrategias para lograr esto incluyen: 11

  • Integración de linters SQL: Integrar un linter SQL dedicado en el pipeline de CI/CD para analizar el código SQL e informar de errores de sintaxis.
  • Pre-commit hooks: Utilizar un framework de pre-commit hooks para ejecutar el linter SQL en los archivos .sqlx modificados antes de que un desarrollador pueda confirmar sus cambios.
  • Scripts de validación personalizados: Desarrollar un script que utilice la API de BigQuery para ejecutar dry-runs de las consultas SQL y validar su sintaxis.

Troubleshooting Connection Issues

Si se producen errores de conexión al integrar Dataform con GitHub, es importante verificar lo siguiente: 12

  • Estado del servidor de GitHub: Comprobar si hay algún problema con los servidores de GitHub en la página de estado de GitHub.
  • Configuración del firewall: Asegurarse de que la configuración del firewall permita el tráfico hacia y desde los servidores de GitHub.

Consideraciones de Seguridad

Es fundamental comprender los riesgos de seguridad asociados a la concesión de permisos excesivos a las cuentas de servicio. Si una cuenta de servicio con permisos excesivos se ve comprometida, un atacante podría escalar privilegios y tomar el control de toda la cuenta 13.

Algunos de los riesgos específicos de las cuentas de servicio en Dataform incluyen 14:

  • Falta de visibilidad: Las cuentas de servicio a menudo carecen de visibilidad dentro de la infraestructura de seguridad de una organización, lo que dificulta la respuesta a incidentes y la identificación del origen de una brecha de seguridad.
  • Rotación de contraseñas: Las cuentas de servicio a menudo se excluyen de las prácticas regulares de rotación de contraseñas, lo que aumenta el riesgo de que las credenciales comprometidas se utilicen durante períodos prolongados.
  • Privilegios de acceso elevados: Las cuentas de servicio pueden tener acceso privilegiado similar al de un administrador. Si no se gestionan adecuadamente, las cuentas de servicio con privilegios excesivos pueden ser explotadas por atacantes para obtener acceso a otros sistemas y datos dentro de su organización, lo que lleva a brechas más extensas.

Estrategia de Permisos

Para garantizar un despliegue seguro y eficiente de proyectos en Dataform, se recomienda la siguiente estrategia de permisos para cuentas de servicio en GitHub:

Entorno de Desarrollo:

  • Utilizar una cuenta de servicio con permisos limitados para el desarrollo.
  • Otorgar permisos de lectura y escritura en el repositorio de desarrollo.
  • Limitar el acceso a recursos sensibles, como datos de producción.

Entorno de Producción:

  • Utilizar una cuenta de servicio diferente con permisos más restrictivos para la producción.
  • Otorgar solo permisos de lectura en el repositorio de producción.
  • Implementar controles de acceso más estrictos para proteger los datos de producción.

Recomendaciones adicionales:

  • Roles predefinidos: Aprovechar los roles predefinidos de Dataform, como Code Creator, Code Editor y Code Viewer, para una gestión de permisos más sencilla 5.
  • Roles personalizados: Si es necesario, crear roles personalizados con permisos específicos para diferentes tareas.
  • Control de acceso granular: Implementar el control de acceso granular en BigQuery para restringir el acceso a datos sensibles a nivel de tabla, fila y columna 16.
  • Aserciones: Utilizar aserciones en Dataform para realizar comprobaciones de calidad de datos y garantizar la integridad de los datos 16.
  • Supervisión: Supervisar las actividades de las cuentas de servicio para detectar cualquier comportamiento sospechoso.
  • Consideraciones de seguridad adicionales: Tenga en cuenta que cualquier cuenta de servicio a la que se le otorguen los roles requeridos por Dataform podría obtener acceso a BigQuery o Secret Manager en el proyecto al que pertenece esa cuenta de servicio, independientemente de los controles de servicio de VPC. Además, cualquier usuario que tenga el permiso dataform.repositories.create de IAM puede ejecutar código utilizando la cuenta de servicio predeterminada de Dataform y todos los permisos otorgados a esa cuenta de servicio15.

Conclusión

La gestión adecuada de los permisos de las cuentas de servicio en GitHub es esencial para el despliegue seguro y eficiente de proyectos en Dataform con integración continua. Al seguir las mejores prácticas y recomendaciones de seguridad, se puede minimizar el riesgo de accesos no autorizados y proteger los datos sensibles.

Es importante recordar que la seguridad es un proceso continuo. Se deben revisar y actualizar periódicamente los permisos de las cuentas de servicio para adaptarse a las necesidades cambiantes y garantizar la seguridad de los datos.

Recomendaciones Clave:

  • Utilizar usuarios de máquina dedicados en GitHub para Dataform.
  • Adherirse al principio de mínimo privilegio al otorgar permisos.
  • Implementar OpenID Connect para acceder a los recursos de la nube.
  • Utilizar roles predefinidos o personalizados para una gestión de permisos eficiente.
  • Implementar el control de acceso granular en BigQuery.
  • Supervisar las actividades de las cuentas de servicio.
  • Revisar y actualizar periódicamente los permisos.

Works cited

  1. Connect to a third-party Git repository | Dataform – Google Cloud, accessed January 23, 2025, https://cloud.google.com/dataform/docs/connect-repository
  2. CI/CD for ETL/ELT pipelines – Dataform – Medium, accessed January 23, 2025, https://medium.com/dataform/ci-cd-for-etl-elt-pipelines-db29015a58e1
  3. Example end-to-end ELT data pipeline using GCP Dataform. – GitHub, accessed January 23, 2025, https://github.com/jolares/example-gcp-dataform
  4. Restrict remote repositories | Dataform – Google Cloud, accessed January 23, 2025, https://cloud.google.com/dataform/docs/restrict-git-remotes
  5. Control access to Dataform with IAM | Google Cloud, accessed January 23, 2025, https://cloud.google.com/dataform/docs/access-control
  6. Dataform – gcp.permissions.cloud, accessed January 23, 2025, https://gcp.permissions.cloud/iam/dataform
  7. GitHub Actions Security Best Practices [cheat sheet included] – GitGuardian Blog, accessed January 23, 2025, https://blog.gitguardian.com/github-actions-security-cheat-sheet/
  8. 7 GitHub Actions Security Best Practices (With Checklist) – StepSecurity, accessed January 23, 2025, https://www.stepsecurity.io/blog/github-actions-security-best-practices
  9. Security hardening for GitHub Actions, accessed January 23, 2025, https://docs.github.com/actions/security-guides/security-hardening-for-github-actions
  10. Configuring Data Pipeline Environments in Dataform | by Alex Feldman | Google Cloud, accessed January 23, 2025, https://medium.com/google-cloud/configuring-data-pipeline-environments-in-dataform-f06359ff634c
  11. Solved: Dataform CI CD – Google Cloud Community, accessed January 23, 2025, https://www.googlecloudcommunity.com/gc/Data-Analytics/Dataform-CI-CD/td-p/720576
  12. Workflows run Dataform repo that connected to Github – Google Cloud Community, accessed January 23, 2025, https://www.googlecloudcommunity.com/gc/Data-Analytics/Workflows-run-Dataform-repo-that-connected-to-Github/m-p/549885
  13. Service accounts should not have roles assigned with excessive privileges – tfsec, accessed January 23, 2025, https://aquasecurity.github.io/tfsec/v1.6.2/checks/google/iam/no-privileged-service-accounts/
  14. The Security Risks of Service Accounts: You Can’t Protect What You Can’t See | Silverfort, accessed January 23, 2025, https://www.silverfort.com/blog/the-security-risks-of-service-accounts-you-cant-protect-what-you-cant-see/
  15. Grant Dataform required access | Google Cloud, accessed January 23, 2025, https://cloud.google.com/dataform/docs/required-access
  16. Data Governance with Dataform in GCP: Ensuring Trustworthy and Secure Data – Medium, accessed January 23, 2025, https://medium.com/google-cloud/data-governance-with-dataform-in-gcp-ensuring-trustworthy-and-secure-data-3dc3991f749a