Proteger compilaciones

En este documento se describen las prácticas recomendadas para proteger tus compilaciones. El código de compilación puede hacer referencia a diferentes tipos de operaciones, como las siguientes:

  • Optimizar u ofuscar código: por ejemplo, la herramienta de código abierto de Google Closure Compiler analiza JavaScript, elimina el código inactivo y reescribe y minimiza lo que queda. También comprueba el código para detectar errores habituales de JavaScript.
  • Compilar código en código intermedio: por ejemplo, puedes compilar código Java en un archivo de clase Java (.class) o código C++ en un archivo de objeto (.obj).
  • Compilar código y vincular, crear una biblioteca o un archivo ejecutable: por ejemplo, compilar código de C++ en una biblioteca compartida (.so) o en un archivo ejecutable de Windows (.exe).
  • Empaquetar código en un formato distribuible o desplegable: por ejemplo, crear archivos WAR de Java (.war) a partir de archivos de clase de Java, crear una imagen de Docker o crear una distribución compilada de Python (.whl).

En función del lenguaje de programación que uses y del entorno en el que implementes tu compilación, esta puede contener diferentes combinaciones de estas operaciones. Por ejemplo, una compilación puede empaquetar código Python en una distribución compilada y subirla a un almacén de artefactos como Artifact Registry o PyPI para que puedas usarla como dependencia en las funciones de Cloud Run. También puedes contenerizar el código Python y desplegar la imagen de contenedor en Cloud Run o Google Kubernetes Engine.

Las prácticas de este documento se centran en crear código para empaquetar o implementar en entornos de tiempo de ejecución, en lugar de compilar código.

Usar compilaciones automatizadas

Una compilación automatizada o una compilación con secuencias de comandos define todos los pasos de la compilación en una secuencia de comandos de compilación o en una configuración de compilación, incluidos los pasos para obtener el código fuente y los pasos para compilar el código. El único comando manual, si lo hay, es el comando para ejecutar la compilación.

Por ejemplo, un archivo de compilación puede ser:

  • Una compilación de Cloud Build cloudbuild.yaml.
  • Un archivo Makefile que se ejecuta con la herramienta make.
  • Un archivo de flujo de trabajo de GitHub Actions en formato YAML almacenado en el directorio .github/workflows/.

Las compilaciones automatizadas proporcionan coherencia en los pasos de compilación. Sin embargo, también es importante ejecutar compilaciones en un entorno coherente y de confianza.

Aunque las compilaciones locales pueden ser útiles para depurar, lanzar software a partir de ellas puede generar muchos problemas de seguridad, incoherencias e ineficiencias en el proceso de compilación.

  • Permitir compilaciones locales ofrece a un atacante con intenciones maliciosas una forma de modificar el proceso de compilación.
  • Las incoherencias en los entornos locales de los desarrolladores y en sus prácticas dificultan la reproducción de compilaciones y el diagnóstico de problemas de compilación.

Las compilaciones manuales hacen que el proceso sea ineficiente, ya que utilizan más recursos de infraestructura, como computación, almacenamiento y redes. En los requisitos del marco SLSA, las compilaciones automatizadas son un requisito para el nivel 1 de SLSA, y usar un servicio de compilación en lugar de entornos de desarrollo para las compilaciones es un requisito para el nivel 2 de SLSA.

Cloud Build es el servicio de compilación gestionado deGoogle Cloud. Utiliza un archivo de configuración de compilación para proporcionar pasos de compilación a Cloud Build. Puedes configurar compilaciones para obtener dependencias, ejecutar pruebas unitarias, análisis estáticos y pruebas de integración, así como crear artefactos con herramientas de compilación como Docker, Gradle, Maven, Go y Python. Cloud Build está totalmente integrado con otros servicios de CI/CD enGoogle Cloud como Artifact Registry y Cloud Deploy, así como con entornos de ejecución como GKE y Cloud Run. También se integra con los principales sistemas de gestión de código fuente, como GitHub y Bitbucket.

Generar procedencia de compilación

Build provenance es una colección de datos verificables sobre una compilación.

Los metadatos de procedencia incluyen detalles como los resúmenes de las imágenes compiladas, las ubicaciones de la fuente de entrada, la cadena de herramientas de compilación y la duración de la compilación.

Generar la procedencia de la compilación te permite hacer lo siguiente:

  • Verifica que se ha creado un artefacto compilado a partir de una ubicación de origen de confianza y con un sistema de compilación de confianza.
  • Identifica el código inyectado desde una ubicación de origen o un sistema de compilación que no es de confianza.

Puedes usar mecanismos de alertas y políticas para usar de forma proactiva los datos de procedencia de la compilación. Por ejemplo, puedes crear políticas que solo permitan implementaciones de código compilado a partir de fuentes verificadas.

En el nivel 1 de SLSA, la procedencia de la compilación debe estar disponible para los consumidores de los artefactos compilados. En el caso del nivel 2 de SLSA, los datos de procedencia de la compilación también deben cumplir los siguientes requisitos:

  • Generados por el servicio de compilación o legibles directamente desde el servicio de compilación.
  • Los consumidores pueden verificar su autenticidad e integridad. Esto debe hacerse con una firma digital generada por el servicio que crea los datos de procedencia de la compilación.

En el nivel 3 de SLSA, el contenido de procedencia también debe incluir lo siguiente:

  • Punto de entrada de la definición de compilación.
  • Todos los parámetros de compilación están bajo el control del usuario.

Cloud Build puede generar la procedencia de las compilaciones de imágenes de contenedor que proporcionan una garantía de compilación de nivel 3 de SLSA. Para obtener más información, consulta Ver la procedencia de la compilación.

Usar un entorno de compilación efímero

Los entornos efímeros son entornos temporales que están diseñados para durar una sola invocación de compilación. Después de la compilación, el entorno se borra o se elimina. Las compilaciones efímeras aseguran que el servicio de compilación y los pasos de compilación se ejecuten en un entorno efímero, como un contenedor o una VM. En lugar de reutilizar un entorno de compilación, el servicio de compilación proporciona un nuevo entorno para cada compilación y, a continuación, lo destruye una vez que se ha completado el proceso de compilación.

Los entornos efímeros aseguran compilaciones limpias, ya que no hay archivos residuales ni ajustes de entorno de compilaciones anteriores que puedan interferir en el proceso de compilación. Un entorno no efímero ofrece a los atacantes la oportunidad de inyectar archivos y contenido maliciosos. Un entorno efímero también reduce los costes de mantenimiento y las incoherencias en el entorno de compilación.

Cloud Build configura un nuevo entorno de máquina virtual para cada compilación y lo destruye después de la compilación.

Restringir el acceso al servicio de compilación

Sigue el principio de seguridad de mínimos accesos y concede los permisos mínimos necesarios al servicio de compilación y a los recursos de compilación. También debes usar una identidad no humana para ejecutar compilaciones e interactuar con otros servicios en nombre de la compilación.

Si usas Cloud Build:

  • Concede los permisos mínimos necesarios a los miembros de tu organización.
  • Personaliza los permisos de la cuenta de servicio que actúa en nombre de Cloud Build para que solo tenga los permisos necesarios para tu uso. Edita los permisos de la cuenta de servicio de Cloud Build predeterminada o usa una cuenta de servicio personalizada.
  • Usa la política de organización Integraciones permitidas de Cloud Build para controlar los servicios externos que pueden invocar activadores de compilación.
  • Coloca Cloud Build en un perímetro de servicio mediante Controles de Servicio de VPC. El perímetro permite la libre comunicación entre los servicios que se encuentran dentro de él, pero limita la comunicación a través del perímetro en función de las reglas que especifiques. Google Cloud El perímetro también reduce el riesgo de filtración externa de datos.

    Cloud Build solo admite Controles de Servicio de VPC para las compilaciones que ejecutes en un grupo privado.

Proteger las credenciales

Las compilaciones suelen incluir conexiones a otros sistemas, como el control de versiones, los almacenes de artefactos y los entornos de implementación. Proteger las credenciales que usas en tus compilaciones ayuda a evitar el acceso no autorizado a los sistemas de tu cadena de suministro de software y la filtración de datos.

No almacenes credenciales codificadas directamente en el control de versiones ni en la configuración de compilación. En su lugar, almacena las credenciales en un almacén de claves seguro.

En Google Cloud, Secret Manager almacena de forma segura claves de API, contraseñas y otros datos sensibles. Puedes configurar Cloud Build para usar secretos almacenados en Secret Manager.

Gestionar tus dependencias

La integridad de tus aplicaciones depende de la integridad del código que desarrolles y de las dependencias que utilices. También debes tener en cuenta dónde publicas tus dependencias, quién tiene acceso de lectura y escritura a tus repositorios de artefactos, y las políticas de fuentes de confianza de artefactos de compilación que implementas en tus entornos de tiempo de ejecución.

Para obtener más información sobre la gestión de dependencias, consulta Gestionar dependencias.

En Cloud Build, se usan compiladores de Cloud para ejecutar comandos. Los compiladores son imágenes de contenedor con lenguajes y herramientas comunes instalados. Puedes usar imágenes de contenedor públicas de registros públicos, como Docker Hub, compiladores proporcionados por Cloud Build, compiladores de la comunidad y compiladores personalizados que crees. También puedes usar buildpacks como compiladores, incluidos los buildpacks de Google Cloud.

Revisa los compiladores que usas en tus compilaciones de Cloud Build, descubre quién los proporciona y decide si confías en ellos en tu cadena de suministro de software. Para tener más control sobre el código de un creador, puedes crear creadores personalizados en lugar de usar creadores de una fuente pública.

Reducir las oportunidades de alterar la compilación

Hay otros factores que pueden influir en una compilación, como los siguientes:

  • Compilaciones que se ejecutan simultáneamente y pueden influirse entre sí, o una compilación que persiste y afecta a una compilación posterior.
  • Compilaciones que aceptan parámetros de usuario distintos del punto de entrada de la compilación y de la ubicación de origen de nivel superior.
  • Compilaciones que especifican dependencias con intervalos o dependencias que son mutables (por ejemplo, mediante una imagen con la etiqueta latest). Estos enfoques suponen un riesgo para las compilaciones, ya que pueden usar versiones incorrectas o no deseadas de las dependencias.

Las siguientes prácticas ayudan a mitigar estos riesgos:

  • Ejecuta cada compilación en un entorno efímero.
  • Evita ejecutar compilaciones con parámetros adicionales para que los usuarios no puedan influir en las variables definidas en las secuencias de comandos de compilación.
  • Restringe el acceso al servicio de compilación y a los recursos de compilación.
  • Haz referencia a versiones inmutables de las dependencias en lugar de a identificadores, como etiquetas, que pueden apuntar a una versión diferente del artefacto en el futuro. Para obtener más información sobre las dependencias, consulta Gestión de dependencias.

Seguridad de la cadena de suministro de software

Google Cloud proporciona un conjunto de funciones y herramientas modulares que puedes usar para mejorar la postura de seguridad de tus cadenas de suministro de software. Muestra información valiosa sobre la seguridad de las aplicaciones creadas con Cloud Build. Entre los datos que recoge se incluyen los siguientes:

  • El nivel de SLSA, que identifica el nivel de madurez de la seguridad de tu cadena de suministro de software.
  • Vulnerabilidades, lista de materiales de software (SBOM) y declaraciones de Vulnerability Exploitability eXchange (VEX) de artefactos de compilación.
  • Crea la procedencia, que es un conjunto de metadatos verificables sobre una compilación. Incluye detalles como los resúmenes de las imágenes compiladas, las ubicaciones de origen de entrada, la cadena de herramientas de compilación, los pasos de compilación y la duración de la compilación.

Para obtener instrucciones sobre cómo consultar estadísticas de seguridad de aplicaciones compiladas, consulta el artículo Crear una aplicación y consultar estadísticas de seguridad.

Siguientes pasos