De Chromium Chronicle #23: Geverifieerde builds in Chrome Infra

Aflevering 23: door Akash Mukherjee in Mountain View, CA (juli 2021)
Vorige afleveringen

Wanneer we Chrome bouwen, dragen veel onderdelen bij aan de omgeving die de output van een artefact beïnvloedt. Vanuit het besturingssysteem, geïnstalleerde ondersteunende bibliotheken, afhankelijkheden van derden, geïnstalleerde tools en de runtime-omgeving zelf; elk van deze is gebouwd met verschillende veiligheidshygiëneniveaus.

Historisch gezien gebruikt Google binaire autorisatie , een interne runtime-afdwingingscontrole die het risico van insiders minimaliseert door ervoor te zorgen dat de bij Google geïmplementeerde productiesoftware en configuratie op de juiste manier worden beoordeeld en een traceerbare herkomst hebben.

Door ervoor te zorgen dat geen enkele persoon de constructie en de toeleveringsketen van artefacten die op LUCI zijn gebouwd in gevaar kan brengen zonder te worden gedetecteerd, vermindert Google de risico's voor software die we naar gebruikers verzenden.

Vanaf vorig jaar produceert het systeem voor elke build een verifieerbaar buildmanifest : een ondertekende JWT die volledig de bronnen beschrijft die in de build zijn gebruikt, cryptografische hashes van geproduceerde binaire bestanden en artefacten, en volledige buildparameters. Met dit bouwmanifest kunnen we een artefact terugvoeren naar de bron, waardoor het bouwproces en de resultaten ervan verifieerbaar worden.

Bovendien stelt het manifest ons ook in staat om te verifiëren dat het gebouwde artefact niet is gewijzigd, omdat eventuele wijzigingen de handtekening ongeldig zouden maken. In totaal biedt dit ons een controleketen voor artefacten terwijl ze zich tussen vertrouwde systemen verplaatsen.

Binaire autorisatie wordt geïmplementeerd als een tweestapssysteem. Het systeem genereert een herkomst met informatie over de bouwtijd; de handhaving van het beleid vindt plaats voordat software wordt ondertekend of geïnstalleerd.

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

Voor Chrome wordt het beleid afgedwongen voordat de geproduceerde softwareartefacten worden ondertekend met behulp van de ondertekeningsinfrastructuur van Google om te voldoen aan bepaalde minimale beveiligingsvereisten van de build.

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

De vereisten zijn onderverdeeld in grofweg 4 gebieden:

  • Bronbeheer: beschermt de gegevens die in de build zijn opgenomen.
  • Build: beschermt het proces dat de bron omzet in binair bestand.
  • Herkomst: attest dat een verifieerbaar bouwmanifest bevat.
  • Beleid: regels die bepalen of een bepaald artefact in een bepaalde context in aanmerking komt.

Door een beleidshandhavingscontrole te implementeren als onderdeel van de CI- en CD-processen voor Chrome en de infrastructuur, hebben we kunnen verifiëren dat de code en configuratie voldoen aan bepaalde minimumnormen voor beveiliging. Dit is een kritieke controle die wordt gebruikt om de mogelijkheid van een potentieel kwaadwillende insider of een gecompromitteerd insider-account te beperken om de software aan te passen die we aan gebruikers distribueren.