Sekrety i bezpieczeństwo w pipeline (gh secret, OIDC)
Pipeline to też powierzchnia ataku
CI/CD ma dostęp do kodu, sekretów i często do środowisk produkcyjnych. Wyciek tokenu z workflow potrafi być groźniejszy niż bug w aplikacji. Ta lekcja porządkuje, jak trzymać sekrety i jak całkiem ich pozbyć się dzięki OIDC.
Sekrety w GitHub Actions
Sekrety są szyfrowane i wstrzykiwane do workflow jako zmienne. Nigdy nie trafiają do logów (GitHub maskuje ich wartości). Definiujesz je na poziomie repo, środowiska lub organizacji.
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy
env:
API_TOKEN: ${{ secrets.API_TOKEN }}
run: ./scripts/deploy.sh
Zarządzanie przez gh CLI
gh secret pozwala ustawiać sekrety z terminala — szybciej niż klikanie w
panelu i łatwo zautomatyzować.
# Ustaw sekret repozytorium (z pliku lub interaktywnie)
gh secret set API_TOKEN
# Z wartości w zmiennej / pliku
gh secret set API_TOKEN --body "$TOKEN"
gh secret set SERVICE_JSON < service-account.json
# Sekret dla konkretnego środowiska
gh secret set DB_PASSWORD --env production
# Lista i usuwanie
gh secret list
gh secret delete API_TOKEN
Wskazówka:
gh secret listpokazuje nazwy i daty, nigdy wartości — sekretu nie da się odczytać po zapisaniu, można go tylko nadpisać. Jeśli zgubisz wartość, wygeneruj nową i zrotuj.
Najlepsza praktyka: OIDC zamiast długowiecznych kluczy
Klasycznie do deployu na chmurę (AWS, Azure, GCP) trzymano w sekretach długowieczne klucze. To ryzyko — taki klucz, jeśli wycieknie, działa miesiącami. OIDC (OpenID Connect) eliminuje problem: GitHub wystawia krótkożyciowy token tożsamości, który chmura wymienia na tymczasowe uprawnienia. Żadnych stałych kluczy w repo.
permissions:
id-token: write # pozwala workflow poprosić o token OIDC
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Login do chmury przez OIDC
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789:role/github-deploy
aws-region: eu-central-1
- run: ./deploy.sh
Po stronie chmury konfigurujesz trust policy, która ufa tokenom z konkretnego repo i gałęzi. Token żyje minuty, więc nawet przechwycony szybko wygasa.
Zasady bezpieczeństwa pipeline'u
| Zasada | Dlaczego |
|---|---|
Minimalne permissions | Domyślnie ogranicz GITHUB_TOKEN do read |
| Przypinaj akcje do wersji/SHA | @v4 lub konkretny SHA, nie @main |
| Sekrety per środowisko | Produkcja oddzielona od preview |
| OIDC zamiast kluczy | Brak długowiecznych poświadczeń |
Uważaj na pull_request_target | Może wystawić sekrety na forki |
Ograniczanie uprawnień tokenu
Domyślny GITHUB_TOKEN bywa zbyt potężny. Ustaw minimum na górze workflow:
permissions:
contents: read
Rozszerzaj tylko tam, gdzie konkretny job naprawdę potrzebuje więcej (np.
id-token: write dla OIDC, packages: write dla publikacji).
Podsumowanie
Sekrety trzymaj w GitHub Actions (szyfrowane, maskowane), zarządzaj nimi przez
gh secret i rotuj po incydentach. Tam, gdzie się da, zamień długowieczne klucze
na OIDC — krótkożyciowe tokeny bez stałych poświadczeń. Ogranicz
permissions i przypinaj akcje do wersji. To minimum higieny bezpiecznego CI/CD.