Chromium Chronicle n.o 23: Compilaciones verificadas en Chrome Infra

Episodio 23: de Akash Mukherjee en Mountain View, CA (julio de 2021)
Episodios anteriores

Cuando compilamos Chrome, muchas piezas contribuyen al entorno que influye en la salida de un artefacto. Desde el SO, instalamos bibliotecas auxiliares, dependencias de terceros, herramientas instaladas y el propio entorno de ejecución. Cada uno de estos elementos se compila con varios niveles de higiene de seguridad.

Históricamente, Google usa la autorización binaria, una verificación interna de aplicación del entorno de ejecución que minimiza el riesgo con respecto a los usuarios con información privilegiada, ya que garantiza que el software de producción y la configuración implementada en Google se revisen de forma correcta y tengan fuentes rastreables.

Si garantizas que ninguna persona pueda comprometer la compilación y la cadena de suministro de artefactos compilados en LUCI sin ser detectado, Google reduce el riesgo en el software que enviamos a los usuarios.

A partir del año pasado, para cada compilación, el sistema produce un manifiesto de compilación verificable: un JWT firmado que describe por completo las fuentes que se incluyeron en la compilación, los hash criptográficos de los objetos binarios y artefactos generados, y los parámetros de compilación completos. Este manifiesto de compilación nos permite hacer un seguimiento de un artefacto hasta las fuentes, lo que hace que el proceso de compilación y sus resultados sean verificables.

Además, el manifiesto también nos permite verificar que el artefacto compilado no se modificó, ya que cualquier cambio invalidaría la firma. En total, esto nos proporciona una cadena de custodia para los artefactos a medida que atraviesan sistemas de confianza.

La Autorización binaria se implementa como un sistema de dos pasos. El sistema genera una provenance con información sobre el tiempo de compilación; la aplicación de la política se produce antes de firmar o instalar software.

def CreateProvenance(self, build_manifest: Mapping[str, Any]):
  """Builder generates and signs provenance given build manifest. Signed JWT is placed
  alongside built artifact."""

En Chrome, antes de firmar los artefactos de software producidos con la infraestructura de firma de Google, la política se aplica de manera forzosa a fin de cumplir con los requisitos de seguridad mínimos particulares de la compilación.

def VerifyProvenance(self, artifact_hash: str, provenance: str):
  """Provenance is verified using a policy engine service before signing an artifact."""

Los requisitos se dividen en aproximadamente 4 áreas:

  • Control de origen: Protege los datos que se ingresaron en la compilación.
  • Compilación: Protege el proceso que convierte la fuente en objeto binario.
  • Procedencia: Es una certificación que contiene manifiestos de compilación verificables.
  • Política: Son reglas que determinan si un artefacto determinado califica en un contexto determinado.

Implementar una verificación de aplicación de políticas como parte de los procesos de CI y CD para Chrome y la infraestructura nos permitió verificar que el código y la configuración cumplan con ciertos estándares mínimos de seguridad. Este es un control crítico que se usa para limitar la capacidad de un usuario con información privilegiado potencialmente malicioso o de una cuenta de usuario con información privilegiada comprometida a modificar el software que distribuimos a los usuarios.