Protege construcciones

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:

  • Ofuscación o optimización del código: Por ejemplo, la herramienta de código abierto de Google Closure Compiler analiza y analiza JavaScript, quita el código inactivo, reescribe y minimiza lo que queda. También comprueba que el código no tenga errores comunes de JavaScript.
  • Compilación de 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).
  • Compilación de código y vinculación, creación de una biblioteca o un archivo ejecutable: Por ejemplo, compilación de código C++ en una Biblioteca compartida (.so) o un archivo ejecutable de Windows (.exe)
  • Empaquetado del código en un formato distribuible o implementable: Los ejemplos incluyen la creación de archivos Java WAR (.war) desde archivos de clase de Java, la creación de una imagen de Docker o una distribución compilada de Python (.whl).

Según el lenguaje de programación que uses y el entorno en el que realices la implementación, tu compilación puede contener diferentes combinaciones de estas operaciones. Por ejemplo, una compilación podría empaquetar código de Python en una distribución compilada y subirla a un almacén de artefactos, como Artifact Registry o PyPI, para que puedas usarlo como una dependencia en Cloud Functions. También puedes alojar el código de Python en contenedores y, luego, implementar la imagen de contenedor en Cloud Run o Google Kubernetes Engine.

Las prácticas de este documento se enfocan en compilar código para empaquetar o implementar en entornos de ejecución en lugar de compilarlo.

Cómo usar compilaciones automáticas

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

Por ejemplo, una secuencia de comandos de compilación puede ser de la siguiente manera:

  • Un cloudbuild.yaml de Cloud Build.
  • Un archivo Make que ejecutes con la herramienta make.
  • Un archivo de flujo de trabajo de GitHub Actions en formato YAML almacenado en el directorio .github/workflows/.

Las compilaciones automáticas proporcionan coherencia en los pasos de compilación. Sin embargo, también es importante ejecutar las compilaciones en un entorno coherente y confiable.

Aunque las compilaciones locales pueden ser útiles para fines de depuración, lanzar software de compilaciones locales puede generar muchos problemas de seguridad, incoherencias y también ineficiencias en el proceso de compilación.

  • Permitir compilaciones locales proporciona una forma para que un atacante con intent malicioso modifique el proceso de compilación.
  • Las incoherencias en los entornos locales y las prácticas para desarrolladores 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 aprovechan más recursos de infraestructura, como el procesamiento, el almacenamiento y las redes. En los requisitos del framework SLSA, las compilaciones automatizadas son un requisito para el nivel SLSA de SLSA, y el uso de un servicio de compilación en lugar de entornos de desarrollador para las compilaciones es un requisito para el nivel de SLSA.

Cloud Build es el servicio de compilación administrado en Google Cloud. Usa un archivo de configuración de compilación para proporcionar pasos de compilación a Cloud Build. Puedes configurar compilaciones para recuperar dependencias, ejecutar pruebas de unidades, realizar análisis estáticos y de integración, y crear artefactos con herramientas de compilación como Docker, Gradle, Maven, Go y Python. Cloud Build está completamente integrado en otros servicios de CI/CD en Google Cloud, como Artifact Registry y Cloud Deploy, y entornos de ejecución, como GKE y Cloud Run. También proporciona integración en los principales sistemas de administración de código fuente, como GitHub y Bitbucket.

Generar procedencia de compilación

La procedencia de compilación 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 las fuentes de entrada, la cadena de herramientas de compilación y la duración de la compilación.

Generar procedencia de compilaciones te ayuda a hacer lo siguiente:

  • Verifica que se haya creado un artefacto compilado a partir de una ubicación de origen de confianza y un sistema de compilación de confianza.
  • Identifica el código insertado desde una ubicación de fuente o sistema de compilación no confiables.

Puedes usar mecanismos de alertas y de políticas para usar los datos de procedencia de la compilación de forma proactiva. 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. Para el nivel SLSA, los datos de procedencia de la compilación también deben ser los siguientes:

  • Se generan mediante el servicio de compilación o se pueden leer directamente desde este.
  • El consumidor debe verificar su autenticidad y autenticidad. Esto debe hacerse con una firma digital que genera el servicio que crea los datos de procedencia de la compilación.

Para el nivel SLSA 3, el contenido de origen también debe incluir lo siguiente:

  • El 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 una procedencia de compilación para imágenes de contenedor que proporcionan una garantía de compilación de SLSA de nivel 3. Para obtener más información, consulta Visualiza la procedencia de la compilación.

Usa un entorno de compilación efímero

Los entornos efímeros son entornos temporales diseñados para durar una sola invocación de compilación. Después de la compilación, se limpia o borra el entorno. Las compilaciones efímeras garantizan 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 volver a usar un entorno de compilación existente, el servicio de compilación aprovisiona un entorno nuevo para cada compilación y, luego, lo destruye una vez que se completa el proceso de compilación.

Los entornos efímeros garantizan compilaciones limpias, ya que no hay archivos residuales ni configuraciones 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 insertar archivos y contenido maliciosos. Un entorno efímero también reduce la sobrecarga de mantenimiento y las incoherencias en el entorno de compilación.

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

Cómo restringir el acceso al servicio de compilación

Sigue el principio de seguridad de privilegio mínimo y otorga 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, ten en cuenta lo siguiente:

  • Otorga 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 de modo que solo tenga los permisos necesarios para tu uso. Edita los permisos de la cuenta de servicio de Cloud Build predeterminada o considera usar una cuenta de servicio personalizada en su lugar.
  • Usa la política de la organización Integraciones permitidas de Cloud Build para controlar los servicios externos que pueden invocar activadores de compilación.
  • Colocar Cloud Build en un perímetro de servicio mediante los Controles del servicio de VPC Este perímetro permite una comunicación libre entre los servicios de Google Cloud dentro del perímetro, pero limita la comunicación dentro de él según las reglas que especifiques. El perímetro también mitiga el riesgo de robo de datos.

    Cloud Build solo es compatible con los Controles del servicio de VPC para las compilaciones que ejecutas en un grupo privado.

Proteger credenciales

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

Evita almacenar credenciales hard-coded directamente en el control de versión o 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 que use secretos almacenados en Secret Manager.

Administra tus dependencias

La integridad de tus aplicaciones depende de la integridad del código que desarrollas y de las dependencias que usas. También debes considerar dónde publicas tus dependencias, quién tiene acceso para leer y escribir en tus repositorios de artefactos, y las políticas para fuentes confiables de artefactos de compilación que implementes en tus entornos de ejecución.

Para obtener más información sobre la administración de dependencias, consulta Cómo administrar dependencias.

En Cloud Build, usas compiladores en la nube para ejecutar comandos. Los compiladores son imágenes de contenedor con lenguajes comunes y herramientas instaladas. Puedes usar imágenes de contenedores públicos de registros públicos, como Docker Hub, los compiladores que proporciona Cloud Build, los compiladores que aporta la comunidad y los compiladores personalizados que crees. También puedes usar paquetes de compilación como compiladores, incluidos los paquetes de compilación 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 mantener más control sobre el código en un compilador, puedes crear compiladores personalizados en lugar de usar compiladores de fuente pública.

Reducir las oportunidades de modificar la creación

Existen otros factores que pueden influir en una compilación, incluidos los siguientes:

  • Compilaciones que se ejecutan de forma simultánea y pueden influir entre sí o que persisten y afectan a una compilación posterior
  • Compilaciones que aceptan parámetros del usuario que no son el punto de entrada de compilación ni la ubicación de origen de nivel superior
  • Compilaciones que especifican dependencias con rangos o dependencias que son mutables (por ejemplo, mediante una imagen con la etiqueta latest) Estos enfoques crean un riesgo de que las compilaciones usen versiones incorrectas o no deseadas de las dependencias.

Las siguientes prácticas ayudan a mitigar estos riesgos:

  • Ejecutar 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 dependencias en lugar de 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 Administración de dependencias.

Sigue las prácticas recomendadas para compilar contenedores

Revisa las prácticas recomendadas para compilar contenedores a fin de obtener información sobre las formas de compilar imágenes de contenedor que sean más confiables y menos vulnerables a los ataques, incluidas las siguientes:

  • Empaqueta aplicaciones únicas
  • Manejo de procesos
  • Optimización de la caché de compilación de Docker
  • Quitar herramientas innecesarias y mantener las imágenes lo más pequeñas posible
  • Analizar en busca de vulnerabilidades con Artifact Analysis Puedes analizar las imágenes almacenadas en Artifact Registry o analizarlas de forma local antes de almacenarlas.
  • Prácticas recomendadas de etiquetado
  • Consideraciones de seguridad para el uso de imágenes públicas

Software Delivery Shield

Software Delivery Shield es una solución de seguridad de la cadena de suministro de software de extremo a extremo completamente administrada. Proporciona un conjunto integral y modular de funciones y herramientas en los servicios de Google Cloud que los desarrolladores, DevOps y los equipos de seguridad pueden usar para mejorar la postura de seguridad de la cadena de suministro de software. Muestra estadísticas de seguridad para las aplicaciones compiladas en la IU de Cloud Build en la consola de Google Cloud. Esto incluye lo siguiente:

  • El nivel SLSA, que identifica el nivel de madurez de la seguridad de tu cadena de suministro de software.
  • Declaraciones sobre vulnerabilidades, lista de materiales de software (SBOM) y también declaraciones de Vulnerability Exploitability eXchange (VEX) para artefactos de compilación.
  • Procedencia de compilación, que es una colección de metadatos verificables sobre una compilación. Incluye detalles como los resúmenes de las imágenes compiladas, las ubicaciones de las fuentes 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 ver las estadísticas de seguridad de las aplicaciones compiladas, consulta Compila una aplicación y consulta las estadísticas de seguridad.

¿Qué sigue?