Rozprzestrzenianie się sekretów: Jak naprawiliśmy wyciek 412 tokenów
Pipeline CI uległ awarii o 2:13 w nocy 3 marca. Znaleźliśmy 412 wyciekłych tokenów API w 37 repozytoriach. Ten błąd naraził nas na potencjalne koszty naruszenia bezpieczeństwa rzędu 1,2 miliona dolarów.
Większość zespołów uważa, że Vault rozwiązuje wszystkie problemy. W rzeczywistości Vault może stać się pojedynczym punktem awarii (single point of failure) pod kątem opóźnień. Gdy tokeny znajdują się poza Vaultem, używa się wartości zakodowanych na sztywno lub zmiennych środowiskowych. Takie rozwiązania zapasowe nie pojawiają się w logach audytowych.
Nasze metryki pokazały koszt tego rozproszenia:
- Normalne pobieranie sekretu: 48 ms na żądanie.
- Podczas wycieku: 187 ms na żądanie.
Agenci budowania (build agents) pobierali 12 tokenów na każde zadanie z odległego klastra Vault. Powodowało to przekroczenia czasu oczekiwania (timeouts) i zmuszało programistów do ręcznego wycofywania zmian. Opóźnienie (latency) to nie tylko powolny proces. To centrum kosztów, które zwiększa rachunki za chmurę i spowalnia pracę programistów.
Jeden wyciekły klucz AWS w repozytorium stagingowym mógłby kosztować 120 USD na godzinę, gdyby został wykorzystany przez atakującego. Jedna godzina nadużycia kosztuje więcej niż kwartalny audyt bezpieczeństwa.
Statyczne skanery zawiodły. Przeoczyły 78% naszych tokenów. Dlaczego? Ponieważ te tokeny były generowane w locie i znajdowały się w artefaktach budowania, a nie w kodzie źródłowym. Jeden krok GitHub Actions zapisał token w warstwie Docker. Skaner nic nie zauważył, ale token zalegał w naszym rejestrze przez wiele tygodni.
Potrzebujesz widoczności w czasie rzeczywistym (runtime visibility), a nie tylko statycznej inspekcji.
Zbudowaliśmy silnik Lambda, aby to naprawić. Monitoruje on CloudTrail pod kątem nowych sekretów i porównuje je z naszym Vaultem. Oto nowy przepływ pracy (workflow):
- Wykrycie sekretu za pomocą webhooka.
- Zapytanie Vaulta o metadane.
- Unieważnienie tokena poprzez API dostawcy.
- Otwarcie PR w celu usunięcia sekretu z pliku.
- Automatyczne scalenie (merge) PR, jeśli przejdzie CI.
Silnik ten dokonał rotacji 412 tokenów w 27 minut ze skutecznością 99,97%.
Obecnie śledzimy wiek sekretu. Jeśli token ma więcej niż 30 dni, budowanie kończy się niepowodzeniem. Ta prosta zasada zmniejszyła liczbę nowych wycieków o 62% w ciągu jednego kwartału. Używamy również modelu isolation-forest do oznaczania nietypowych wzorców użytkowania. Jeśli token pojawi się z nowego adresu IP, system natychmiast dokonuje jego rotacji.
Przestań traktować tokeny jak pliki. Traktuj wiek sekretu i opóźnienie pobierania jako kluczowe metryki. Jeśli to zrobisz, rozproszenie się zmniejszy.
