Udostępnianie sekretów w GitHub Actions – bez Vaulta
Autor: Maxim Novak
Możesz udostępniać sekrety w GitHub Actions bez HashiCorp Vault, używając akcji GitHub od Vaulted. Tworzy ona zaszyfrowane, samozniszczące się linki bez żadnej infrastruktury. Korzysta z szyfrowania po stronie klienta AES-256-GCM i działa jako pojedynczy krok workflow — bez serwera menedżera sekretów ani konfiguracji w chmurze.
Potoki CI przez cały czas potrzebują tymczasowych danych uwierzytelniających. Klucz deploy, który powinien istnieć tylko przez jeden run. Token przekazywany między dwoma repozytoriami podczas migracji. Dane uwierzytelniające rotowane w jednym workflow i konsumowane w innym.
Standardowa rada brzmi: „użyj menedżera sekretów." Ale uruchamianie HashiCorp Vault lub konfigurowanie AWS Secrets Manager tylko po to, by przekazać jedne dane uwierzytelniające między workflow, to jak wynajmowanie magazynu, żeby wysłać list.
GitHub Repo Secrets dobrze radzą sobie ze statycznym przypadkiem — długotrwałe klucze API, tokeny deploy, dane uwierzytelniające konta serwisowego. Ale nie wystarczają dla czegokolwiek tymczasowego lub dynamicznego.
Luka: tymczasowe udostępnianie sekretów w CI/CD
Repo Secrets są zaprojektowane dla wartości, które rzadko się zmieniają i są konsumowane przez jedno repozytorium. Nie obejmują:
- Jednorazowych przekazań podczas rotacji kluczy — Rotujesz dane uwierzytelniające w jednym workflow i inny workflow (lub zespół) musi pobrać nową wartość dokładnie raz.
- Udostępniania danych uwierzytelniających między repozytoriami — Dwa repozytoria muszą wymienić krótkotrwały token, ale żadne nie powinno go trwale przechowywać.
- Czasowo ograniczonego dostępu dla podwykonawców — Token CI, który powinien wygasnąć po zamknięciu okna deploymentu podwykonawcy.
- Wiedzy o tym, kiedy sekret został odczytany — Repo Secrets nie dają żadnego wglądu w to, czy i kiedy wartość została przeczytana.
To są tymczasowe problemy, które wymagają tymczasowego rozwiązania.
Lżejsze podejście: zaszyfrowane, samozniszczające się linki
Akcja Vaulted na GitHub pozwala tworzyć i pobierać zaszyfrowane, samozniszczające się sekrety bezpośrednio z twoich workflow — bez żadnej infrastruktury do zarządzania.
Tworzenie sekretu:
- name: Share rotated credential
id: share
uses: vaulted-fyi/share-secret@v1
with:
secret: ${{ steps.rotate.outputs.new_token }}
views: 1
expires: 1h
Krok zwraca URL zawierający zaszyfrowany sekret. Klucz szyfrowania znajduje się we fragmencie URL, więc nigdy nie trafia na serwery Vaulted.
Pobieranie sekretu:
- name: Get shared credential
id: get
uses: vaulted-fyi/share-secret/get@v1
with:
url: ${{ needs.rotate.outputs.secret_url }}
- name: Deploy with rotated credential
run: ./deploy.sh
env:
API_TOKEN: ${{ steps.get.outputs.secret }}
Po pobraniu link jest skonsumowany, a ciphertext po stronie serwera zostaje usunięty. Sekret istnieje tylko w pamięci runnera przez czas trwania tego zadania.
Model bezpieczeństwa
Trzy właściwości sprawiają, że rozwiązanie jest bezpieczne w zastosowaniach CI/CD:
-
Szyfrowanie zero-knowledge. Sekret jest szyfrowany algorytmem AES-256-GCM wewnątrz runnera GitHub, zanim opuści proces. Klucz szyfrowania jest osadzony w fragmencie URL, który nigdy nie jest wysyłany do serwera. Vaulted przechowuje wyłącznie ciphertext, którego nie może odszyfrować. To jest szyfrowanie po stronie klienta zastosowane do CI/CD.
-
Automatyczne maskowanie logów. Akcja wywołuje
core.setSecretprzedcore.setOutput, rejestrując każdą linię wartości sekretu w maszerze logów GitHub. Wieloliniowe sekrety są maskowane wiersz po wierszu, więc nawet częściowe dopasowania są redagowane z logów workflow. -
Samozniszczające się linki. Limity wyświetleń i wygasanie czasowe są egzekwowane po stronie serwera. Sekret utworzony z
views: 1iexpires: 1hzostaje trwale usunięty po pierwszym pobraniu lub po upływie godziny — w zależności od tego, co nastąpi pierwsze.
Kiedy używać tego zamiast menedżera sekretów
| Scenariusz | Menedżer sekretów | Vaulted Action |
|---|---|---|
| Długotrwałe dane uwierzytelniające produkcyjne | Tak | Nie |
| Konfiguracja runtime aplikacji (URL-e DB, klucze API) | Tak | Nie |
| Jednorazowe przekazanie danych między workflow | Przerost formy | Tak |
| Tymczasowe udostępnianie tokenów między repozytoriami | Przerost formy | Tak |
| Czasowo ograniczony dostęp CI dla podwykonawcy | Przerost formy | Tak |
| Dystrybucja danych uwierzytelniających po rotacji | Przerost formy | Tak |
Menedżery sekretów są właściwym narzędziem dla sekretów konsumowanych przez aplikacje w czasie wykonania. Vaulted jest do przekazania — momentu, w którym dane uwierzytelniające przemieszczają się z jednego miejsca do drugiego i nie powinny być trwale przechowywane.
Pierwsze kroki
Dodaj akcję do dowolnego workflow:
- uses: vaulted-fyi/share-secret@v1
with:
secret: ${{ secrets.TEMP_CREDENTIAL }}
views: 1
expires: 1h
Znajdziesz ją w GitHub Marketplace. Sekrety utworzone przez akcję są kompatybilne z aplikacją webową i CLI — cokolwiek zostało utworzone w jednym miejscu, można pobrać z innego.
Bez serwera Vault. Bez polityk IAM. Bez infrastruktury. Tylko zaszyfrowane linki, które się samozniszczają.
Powiązane
- Bezpieczne udostępnianie kluczy API — zaszyfrowane, samozniszczające się linki dla danych uwierzytelniających API
- Bezpieczne udostępnianie plików .env — udostępniaj konfiguracje środowiskowe bez Slacka
- Szyfrowanie end-to-end wyjaśnione — wizualny przewodnik z live demo szyfrowania