Chromium Chronicle n. 23: build verificate in Chrome Infra

Puntata 23: di Akash Mukherjee a Mountain View, CA (luglio 2021)
Puntate precedenti

Quando sviluppiamo Chrome, molte parti contribuiscono all'ambiente e influenza l'output di un artefatto. Dal sistema operativo, dalle librerie di supporto installate, dalle dipendenze di terze parti, dagli strumenti installati e dall'ambiente di runtime stesso; ognuno di questi è realizzato con vari livelli di ottimizzazione della sicurezza.

Storicamente, Google utilizza l'autorizzazione binaria, un controllo interno dell'applicazione forzata del runtime che riduce al minimo i rischi legati agli addetti ai lavori garantendo che il software di produzione e la configurazione implementati in Google vengano esaminati correttamente e abbia una provenienza tracciabile.

Assicurando che nessuna singola persona possa compromettere la build e la catena di fornitura degli artefatti basati su LUCI senza essere rilevata, Google riduce il rischio sul software che spediamo agli utenti.

A partire dall'anno scorso, per ogni build, il sistema produce un manifest di build verificabile, ovvero un JWT firmato che descrive completamente le origini inserite nella build, gli hash crittografici dei programmi binari e gli artefatti prodotti e i parametri completi della build. Questo manifest di build ci consente di risalire a un artefatto nelle origini, rendendo verificabile il processo di build e i relativi output.

Inoltre, il file manifest ci consente anche di verificare che l'elemento creato non sia stato modificato in quanto eventuali modifiche renderebbero la firma non valida. In totale, questo ci fornisce una catena di custodia per gli artefatti mentre passano da sistemi attendibili.

Autorizzazione binaria è implementata come un sistema in due passaggi. Il sistema genera una provenance con informazioni sulla data di build; l'applicazione del criterio avviene prima di firmare o installare il software.

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

Per Chrome, prima di firmare gli artefatti software prodotti utilizzando l'infrastruttura di firma di Google, il criterio viene applicato in modo da soddisfare determinati requisiti di sicurezza minimi della build.

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

I requisiti sono suddivisi in circa quattro aree:

  • Controllo del codice sorgente:protegge i dati inseriti nella build.
  • Build: protegge il processo che converte il codice sorgente in binario.
  • Provenienza: attestazione che contiene un manifest di build verificabile.
  • Norma: regole che determinano se un determinato artefatto è idoneo in un determinato contesto.

L'implementazione di un controllo di applicazione dei criteri nell'ambito dei processi CI e CD per Chrome e l'infrastruttura ci ha consentito di verificare che il codice e la configurazione soddisfino determinati standard minimi per la sicurezza. Si tratta di un controllo fondamentale utilizzato per limitare la capacità di un account interno potenzialmente dannoso o di un utente interno compromesso di modificare il software che distribuisciamo agli utenti.