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:
- Ofuscar o optimizar código: Por ejemplo, la herramienta de código abierto de Google El Closure Compiler analiza JavaScript. quita el código muerto, y reescribe y minimiza lo que queda. También verifica el código para los errores comunes de JavaScript.
- Compila 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 ejecutable de Windows (.exe
). - Empaquetar código en un formato distribuible o implementable: Los ejemplos incluyen la creación de archivos Java WAR (
.war
) a partir de archivos de clase Java, la creación de una imagen de Docker o la creación de 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 podría contener diferentes combinaciones de estas operaciones. Por ejemplo, una compilación puede empaquetar código de Python en una distribución compilada y subirla a una tienda de artefactos, como Artifact Registry o PyPI, para que puedas usarla como dependencia en las funciones de Cloud Run. También puedes alojar el código de Python en contenedores y, luego, implementarlo 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 compilar código.
Usa 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 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 comando 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 Makefile que ejecutas con la herramienta
make
. - Un archivo de flujo de trabajo de GitHub Actions en formato YAML almacenado en tu 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 confiable.
Aunque las compilaciones locales pueden ser útiles para depurar, lanzar software desde compilaciones locales puede generar muchos problemas de seguridad, inconsistencias y deficiencias en el proceso de compilación.
- Permitir compilaciones locales permite que un atacante con intención maliciosa para modificar el proceso de compilación.
- Las inconsistencias en los entornos locales y las prácticas de los 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 procesamiento, almacenamiento y redes. En los requisitos del framework de 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 desarrollador para las compilaciones es un requisito para el nivel 2 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, análisis estáticos y pruebas de integración, y crear artefactos 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, así como en entornos de ejecución, como GKE y Cloud Run. También proporciona integración con los principales sistemas de administración de código fuente, como GitHub y Bitbucket.
Genera la procedencia de la compilación
La origen de compilación es una colección. de datos verificables acerca de 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 la procedencia de la compilación te ayuda a hacer lo siguiente:
- Verifica que un artefacto compilado se haya creado desde una ubicación de fuente confiable y con un sistema de compilación confiable.
- Identifica el código insertado desde una ubicación de fuente o un sistema de compilación no confiables.
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 compilada a partir de fuentes verificadas.
Para el nivel 1 de SLSA, la procedencia de la compilación debe estar disponible para los consumidores de los artefactos compilados. Para el nivel 2 de SLSA, los datos de procedencia de la compilación también deben cumplir con los siguientes requisitos:
- Se genera con el servicio de compilación o se puede leer directamente desde él.
- Un consumidor puede verificar la autenticidad y la integridad. Esto se debe hacer con una firma digital generada por el servicio que crea los datos de procedencia de la compilación.
Para el nivel 3 de la SLSA, el contenido de la procedencia también debe incluir lo siguiente:
- El punto de entrada de la definición de compilación.
- Todos los parámetros de compilación bajo el control de un usuario.
Cloud Build puede generar la procedencia de compilaciones para imágenes de contenedores que proporcionan garantías de compilación de SLSA de nivel 3. Para obtener más información, consulta Ver la procedencia de la compilación
Usa 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, 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 reutilizar un entorno de compilación existente, el servicio de compilación aprovisiona un entorno nuevo para cada compilación y, luego, lo destruye después de que se completa el proceso de compilación.
Los entornos efímeros garantizan compilaciones limpias, ya que no hay archivos residuales o configuración del entorno de compilaciones anteriores que puedan interferir en la compilación el proceso de administración de recursos. Un entorno no efímero brinda una oportunidad para que los atacantes inyectar archivos y contenido maliciosos. Un entorno efímero también reduce la sobrecarga de mantenimiento y reduce las inconsistencias en el entorno de compilación.
Cloud Build configura un nuevo entorno de máquina virtual para cada compilación y la destruye después de la compilación.
Restringe el acceso al servicio de compilación
Sigue el principio de seguridad de privilegio mínimo otorgando los permisos los permisos necesarios para el servicio y los recursos de compilación. También debes usar una identidad no humana para ejecutar compilaciones y, en su nombre, interactuar con otros servicios.
Si usas Cloud Build, ten en cuenta lo siguiente:
- Otorga los permisos mínimos necesarios a los miembros de tu organización.
- Personalizar 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. Editar los permisos del valor predeterminado cuenta de servicio de Cloud Build o considera usar cuenta de servicio personalizada.
- 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.
Coloca Cloud Build en un perímetro de servicio con los Controles del servicio de VPC. El perímetro permite una comunicación libre entre los servicios de Google Cloud dentro del perímetro, pero los límites la comunicación en el perímetro según las reglas que especifiques. El perímetro también mitiga el riesgo de robo de datos.
Cloud Build solo admite los Controles del servicio de VPC para las compilaciones que se ejecutan en un grupo privado.
Protege 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 que usas en tus compilaciones ayuda a prevenir 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 tu configuración de compilación. En su lugar, almacena las credenciales en un almacén de claves seguro.
En Google Cloud, usa Secret Manager almacena claves de API, contraseñas y otros datos sensibles. Puedes configurar Cloud Build para usar 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 te permite publicar tus dependencias, quién tiene acceso de lectura y escritura a tus repositorios de artefactos y políticas para fuentes de confianza de artefactos de compilación que implementas en los 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 y herramientas comunes. instaladas en ellos. 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 personalizados que creas. Puedes también puedes usar buildpacks como compiladores, que incluye lo siguiente: Paquetes de compilación de Google Cloud.
Revisa los compiladores que usas en tus compilaciones de Cloud Build. averigua quién los proporciona y decide si confías en él en tu software de la cadena de suministro. Para mantener un mayor control sobre el código de un compilador, puedes crear compiladores personalizados en lugar de usar compiladores de una fuente pública.
Reduce las oportunidades de alterar la compilación
Existen muchos 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 una compilación que persiste y afecta a una compilación posterior.
- Las compilaciones que aceptan parámetros de usuario distintos del punto de entrada de compilación y el ubicación de la fuente de nivel superior.
- Compilaciones que especifican dependencias con rangos o dependencias que son mutables (por ejemplo, usar una imagen con la etiqueta
latest
) Estos enfoques crean el riesgo de que las compilaciones usen 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 variables de influencia definidas en las secuencias de comandos de compilación.
- Restringe el acceso al servicio y los recursos de compilación.
- Haz referencia a versiones inmutables de dependencias en lugar de identificadores, como etiquetas que puedan dirigir a una versión diferente del artefacto en el futuro. Para obtener más información sobre las dependencias, consulta Administración de dependencias.
Software Delivery Shield
Software Delivery Shield es un solución de cadena de suministro de software de extremo a extremo completamente administrada. Proporciona un conjunto de capacidades y herramientas integral y modular Servicios de Google Cloud que pueden usar los desarrolladores, DevOps y equipos de seguridad para mejorar la postura de seguridad de la cadena de suministro de software. Integra muestra estadísticas de seguridad para 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 del software la seguridad de la cadena de suministro.
- Vulnerabilidades, lista de materiales de software (SBOM) y vulnerabilidades Declaraciones de Exploitability eXchange (VEX) para artefactos de compilación.
- La procedencia de la compilación, que es una colección de metadatos verificables sobre una compilación Incluye detalles como resúmenes de las imágenes compiladas, la 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.
Si necesitas instrucciones para ver las estadísticas de seguridad de las aplicaciones compiladas, consulta Compila una aplicación y visualiza estadísticas de seguridad.
¿Qué sigue?
- Conoce las prácticas recomendadas para proteger el código fuente.
- Conoce las prácticas recomendadas para proteger las dependencias.
- Conoce las prácticas recomendadas para proteger las implementaciones.