Chromium Chronicle nr 23: zweryfikowane kompilacje w infrastrukturze Chrome

Odcinek 23: Akash Mukherjee w Mountain View, Kalifornia (lipiec 2021 r.)
Poprzednie odcinki

Kiedy tworzymy Chrome, wiele elementów wpływa na środowisko, które wpływa na sposób działania artefaktu. Zainstalowane biblioteki pomocnicze, zależności od innych firm, zainstalowane narzędzia i środowisko wykonawcze. Każdy z nich jest oparty na różnych poziomach higieny zabezpieczeń.

W przeszłości Google używa autoryzacji plików binarnych, czyli wewnętrznej kontroli egzekwowania zasad w środowisku wykonawczym, która minimalizuje ryzyko nieupoważnionego dostępu. Dzięki temu oprogramowanie produkcyjne i konfiguracja wdrożone w Google są odpowiednio sprawdzone i mają możliwe do ustalenia pochodzenie.

Dbając o to, aby nikt nie włamał się na kompilację i łańcuch dostaw artefaktów opartych na LUCI bez ich wykrycia, Google zmniejsza ryzyko, że dostarczamy oprogramowanie do użytkowników.

Od zeszłego roku dla każdej kompilacji system tworzy możliwy do zweryfikowania plik manifestu – podpisany JWT, który w pełni opisuje źródła przekazane do kompilacji, kryptograficzne hasze utworzonych plików binarnych i artefaktów oraz pełne parametry kompilacji. Ten plik manifestu kompilacji umożliwia nam śledzenie artefaktu w źródłach, dzięki czemu proces kompilacji i jego dane wyjściowe można zweryfikować.

Plik manifestu pozwala też sprawdzić, czy skompilowany artefakt nie został zmodyfikowany, ponieważ jakiekolwiek zmiany unieważniłyby podpis. Ogólnie oznacza to łańcuch obserwacji artefaktów przemierzających różne systemy zaufanych.

Autoryzacja plików binarnych jest wdrożona jako system dwuetapowy. System generuje provenance z informacjami o czasie kompilacji. Egzekwowanie zasad następuje przed podpisaniem lub zainstalowaniem oprogramowania.

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

W przypadku Chrome przed podpisaniem utworzonych artefaktów oprogramowania przy użyciu infrastruktury podpisywania Google zasada ta jest egzekwowana w celu spełnienia określonych minimalnych wymagań dotyczących bezpieczeństwa kompilacji.

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

Wymagania są podzielone na około 4 obszary:

  • Kontrola ze źródłem: chroni dane, które trafiają do kompilacji.
  • Kompilacja: chroni proces, który konwertuje źródło na plik binarny.
  • Pochodzenie: atest zawierający możliwy do zweryfikowania plik manifestu kompilacji.
  • Zasada: reguły, które określają, czy dany artefakt kwalifikuje się w danym kontekście.

Wdrożenie kontroli egzekwowania zasad w ramach procesów CI i CD w Chrome oraz w infrastrukturze pozwoliło nam sprawdzić, czy kod i konfiguracja spełniają określone minimalne standardy bezpieczeństwa. Jest to funkcja o znaczeniu krytycznym, która pozwala ograniczyć możliwość modyfikowania oprogramowania, które rozpowszechniamy wśród użytkowników, przez potencjalnie nieupoważnione osoby lub konta.