Gyakori biztonsági hibák a GitHub Actions munkafolyamatokban

A modern szoftverfejlesztés egyik alappillére a folyamatos integráció és szállítás (CI/CD), amelynek köszönhetően a fejlesztési ciklus gyorsabbá, megbízhatóbbá és hatékonyabbá válik. A GitHub Actions az egyik legnépszerűbb eszköz ezen a területen, amely lehetővé teszi a fejlesztők számára, hogy automatizált munkafolyamatokat hozzanak létre közvetlenül a GitHub tárolóikon belül. Azonban a kényelem és a hatékonyság mellett a biztonság kérdése is kiemelten fontossá válik. Egy rosszul konfigurált GitHub Actions munkafolyamat súlyos biztonsági kockázatokat jelenthet, amelyek akár adatszivárgáshoz, jogosulatlan hozzáféréshez vagy rosszindulatú kódinjektáláshoz vezethetnek. Ebben a cikkben bemutatjuk a leggyakoribb biztonsági hibákat, amelyekkel a GitHub Actions munkafolyamatokban találkozhatunk, és megvizsgáljuk, hogyan kerülhetjük el őket.

1. A GITHUB_TOKEN túlengedékeny engedélyei

Minden GitHub Actions munkafolyamat automatikusan kap egy ideiglenes hozzáférési tokent, a GITHUB_TOKEN-t, amely lehetővé teszi számára, hogy a tárolóban végezzen műveleteket (pl. kód klónozása, pull requestek megnyitása, kommentek hozzáadása). Alapértelmezés szerint ez a token széles körű engedélyekkel rendelkezik, beleértve az olvasási és írási hozzáférést számos erőforráshoz. Ha egy munkafolyamat sebezhetővé válik, egy támadó kihasználhatja ezt a tokent a tároló manipulálására vagy érzékeny adatok megszerzésére.

A hiba lényege és a kockázat

A probléma abból adódik, hogy a GITHUB_TOKEN alapértelmezett engedélyei gyakran sokkal szélesebbek, mint amennyire a munkafolyamatnak valójában szüksége van. Ha egy külső action-t vagy egy bemeneti adatot kihasználnak, a támadó teljes hozzáférést kaphat a token által biztosított összes művelethez.

Megoldás: A legkisebb jogosultság elve

Alkalmazzuk a legkisebb jogosultság elvét (principle of least privilege). Explicit módon korlátozzuk a GITHUB_TOKEN engedélyeit minden egyes munkafolyamatban a minimálisan szükséges szintre. Ezt a munkafolyamat YAML fájljában tehetjük meg a permissions kulcsszóval. Például, ha egy munkafolyamatnak csak olvasási hozzáférésre van szüksége a tartalomhoz, és pull requesteket kell nyitnia, akkor:

permissions:
  contents: read
  pull-requests: write
  checks: write # Ha státusz ellenőrzést is végez
  # Minden más engedélyt alapértelmezetten megtagadunk

Ez drámaian csökkenti a potenciális támadási felületet.

2. Harmadik féltől származó Actions: A függőségi lánc kockázata

A GitHub Actions piactéren rengeteg hasznos, előre elkészített action található, amelyek felgyorsíthatják a fejlesztést. Ezek használata azonban a szoftverellátási lánc (supply chain) biztonsági kockázatait is magával hozza.

A hiba lényege és a kockázat

Sok fejlesztő egyszerűen a legújabb verzióra hivatkozik (pl. uses: actions/checkout@v3 vagy @master), anélkül, hogy ellenőrizné az action forráskódját. Ez azt jelenti, hogy ha az action fejlesztőjének tárolóját feltörik, vagy rosszindulatú kódot injektálnak a legújabb verzióba, az a te munkafolyamataidban is lefuthat, és komoly károkat okozhat. Ráadásul egy akció fejlesztője bármikor kiadhat egy rosszindulatú frissítést.

Megoldás: Rögzítés commit SHA-hoz és auditálás

Mindig rögzítsd az action-öket egy specifikus commit SHA-hoz, ne csak a főverzióhoz vagy ághoz. Ez biztosítja, hogy pontosan azt a kódot futtatod, amit auditáltál és amit vársz. Példa:

uses: actions/checkout@v3 # Kerüld!
uses: actions/checkout@8e5cd47f6507a21349f7b6053351a029c7882200 # Helyes! (teljes SHA)

Továbbá:

  • Feltétlenül auditáld a külső action-ök forráskódját, mielőtt használnád őket, különösen, ha érzékeny adatokat kezelnek.
  • Lehetőség szerint részesítsd előnyben a hivatalos GitHub action-öket vagy a nagy, megbízható szervezetek által fenntartott action-öket.
  • Fontold meg saját, privát action-ök létrehozását a kritikus műveletekhez.

3. Titkok nem megfelelő kezelése

A munkafolyamatok gyakran igényelnek hozzáférést érzékeny információkhoz, mint például API kulcsok, adatbázis jelszavak vagy felhőszolgáltatói hitelesítő adatok. Ezek nem megfelelő kezelése az egyik legnagyobb biztonsági kockázat.

A hiba lényege és a kockázat

A leggyakoribb hiba, hogy a titkokat közvetlenül a munkafolyamat YAML fájljába vagy a tárolóba kódolják. Másik gyakori hiba a titkok nem biztonságos környezeti változókként való használata vagy naplókba való kikerülése.

Megoldás: GitHub Secrets, OIDC és biztonságos környezet

Használjuk a GitHub beépített Secrets funkcióját. Ezek titkosítottak, és csak a munkafolyamatokban érhetők el. Soha ne írd ki a titkokat a naplókba! Használhatod a core.set-output helyett a biztonságosabb kimenetkezelést, vagy győződj meg róla, hogy a titkok soha ne jelenjenek meg a kimenetben.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Használd a titkot
      run: echo "Ez a titok: ${{ secrets.MY_API_KEY }}" # NE TEDD EZT!
    - name: Helyes titokhasználat (például környezeti változóként)
      env:
        API_KEY: ${{ secrets.MY_API_KEY }}
      run: echo "Futtatás API kulccsal..." # A kulcs nem jelenik meg a naplóban

Emellett, amennyiben felhőszolgáltatókat (AWS, Azure, GCP) használsz, fontold meg az OpenID Connect (OIDC) használatát. Az OIDC lehetővé teszi, hogy a GitHub Actions munkafolyamatok ideiglenes, rövid élettartamú hitelesítő adatokat kapjanak közvetlenül a felhőszolgáltatótól, anélkül, hogy hosszú élettartamú titkokat kellene tárolni a GitHub Secretsben. Ez jelentősen növeli a biztonságot, mivel minimalizálja a kiszivárgás kockázatát.

4. Bemeneti adatok validálásának hiánya

A workflow_dispatch esemény lehetővé teszi a munkafolyamatok kézi indítását, paraméterek átadásával. A pull_request eseményeknél pedig a pull request címe, leírása vagy a módosított fájlok nevei is felhasználhatók. Ha ezeket a bemeneti adatokat nem validáljuk megfelelően, kódinjektálási vagy parancs-injektálási támadások áldozatául eshetünk.

A hiba lényege és a kockázat

Ha egy munkafolyamat közvetlenül használja a felhasználó által megadott bemeneti adatokat shell parancsokban (pl. git checkout ${{ github.event.inputs.branch }}) anélkül, hogy validálná vagy megfelelően „escapelné” azokat, egy támadó rosszindulatú parancsokat injektálhat. Például, ha egy ágnevet vár, és valaki "my-branch; rm -rf /"-t ad meg, az katasztrofális következményekkel járhat.

Megoldás: Szigorú bemeneti validáció

Minden külső bemeneti adatot szigorúan validálj és tisztíts meg, mielőtt felhasználnád őket a shell parancsokban. Használd a GitHub Actions kifejezéseit (expressions) a validációhoz:

on:
  workflow_dispatch:
    inputs:
      branch:
        description: 'Melyik ágon fusson a workflow?'
        required: true
        default: 'main'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Ellenőrizd az ág nevét
      if: ${{ !startsWith(github.event.inputs.branch, 'feature/') && github.event.inputs.branch != 'main' }}
      run: |
        echo "Érvénytelen ág név. Csak 'main' vagy 'feature/' előtagú ágak engedélyezettek."
        exit 1
    - name: Checkout kód
      uses: actions/checkout@v3
      with:
        ref: ${{ github.event.inputs.branch }}

Ezen felül használj további sanitizálási technikákat, ha shell parancsokkal dolgozol, vagy preferáld a beépített action-öket, amelyek már kezelik a biztonságos bemeneteket.

5. Önálló futtatók (Self-Hosted Runners) nem megfelelő biztonsága

Míg a GitHub által hosztolt futtatók biztonságos, izolált környezetet biztosítanak minden egyes futtatáshoz, az önálló futtatók (self-hosted runners) telepítésével a felhasználó vállalja a futtató környezet biztonságának felelősségét.

A hiba lényege és a kockázat

Ha egy önálló futtató nincs megfelelően konfigurálva és védve, a munkafolyamatok során futtatott kód hozzáférhet a futtató gép erőforrásaihoz, a hálózati erőforrásokhoz, sőt, akár más projektek adataihoz is, ha nem megfelelő a szegmentálás. Egy rosszindulatú munkafolyamat könnyedén kompromittálhatja a futtatót és az azt tartalmazó infrastruktúrát.

Megoldás: Szigorú izoláció és monitorozás

  • Izoláció: Ne futtass érzékeny, éles környezeti munkafolyamatokat ugyanazon az önálló futtatón, mint a nem megbízható forrásokból (pl. külső hozzájárulásokból származó pull requestek) származó munkafolyamatokat. Különítsd el a futtatókat cél szerint (pl. dev, prod, külső PR).
  • Ephemeral runners: Használj ideiglenes, egyszer használatos futtatókat, amelyek minden futás után megsemmisülnek. Ez megakadályozza az állapotfenntartó támadásokat.
  • Hálózati korlátozások: Korlátozd a futtató hálózati hozzáférését a minimálisan szükségesre. Használj tűzfalakat és biztonsági csoportokat.
  • Host biztonság: Rendszeresen frissítsd a futtatók operációs rendszerét és szoftvereit, és alkalmazz szigorú hozzáférés-szabályozást a host gépen.
  • Monitorozás: Figyeld a futtatók tevékenységét, a rendellenes viselkedést, és integráld a logokat a központi naplózási rendszerekbe.

6. Ágazati védelmi szabályok hiánya vagy gyengesége

Az ágazati védelmi szabályok (branch protection rules) kritikus fontosságúak a kódintegritás és a biztonság fenntartásában. Ezek hiánya vagy gyenge konfigurálása megnyithatja az utat a jogosulatlan vagy ellenőrizetlen kódmódosítások előtt.

A hiba lényege és a kockázat

Ha nincsenek beállítva ágazati védelmi szabályok, bárki, aki írási hozzáféréssel rendelkezik a tárolóhoz, közvetlenül a fő ágra (pl. main vagy master) küldhet kódot, megkerülve a kódellenőrzéseket és a CI/CD folyamatokat. Ez rosszindulatú kód bejuttatásához vagy a kritikus rendszerek megzavarásához vezethet.

Megoldás: Erős ágazati védelem

Konfigurálj erős ágazati védelmi szabályokat a kritikus ágaidon (pl. main, production):

  • Pull requestek kötelezővé tétele: Követeld meg, hogy minden módosítás pull requesten keresztül történjen.
  • Minimális felülvizsgálók száma: Követelj meg legalább egy (vagy több) jóváhagyó felülvizsgálatot a pull requestek merge-elése előtt.
  • Kötelező státuszellenőrzések: Követeld meg, hogy a CI/CD munkafolyamatok sikeresen lefutottak legyenek a merge előtt. Ide tartozhatnak a tesztek, a linterek, a biztonsági ellenőrzések.
  • Kód tulajdonosok: Használj CODEOWNERS fájlt, hogy bizonyos kódterületek módosításához specifikus csapatok vagy személyek jóváhagyására legyen szükség.
  • Futtatási történet törlésének tiltása: Tiltsd le a futtatási történet átírását vagy törlését.

7. Naplózás és monitorozás hiánya

Ahogy minden más informatikai rendszerben, a CI/CD munkafolyamatokban is elengedhetetlen a megfelelő naplózás és monitorozás. A biztonsági incidensek gyors felismerésének kulcsa, hogy lássuk, mi történik a rendszereinkben.

A hiba lényege és a kockázat

Ha nem figyeled aktívan a GitHub Actions munkafolyamatok futásait, a sikertelen vagy gyanús futásokat, valamint az audit naplókat, akkor egy esetleges támadás észrevétlen maradhat, vagy csak későn derül ki, amikor már nagy a kár.

Megoldás: Aktív naplózás és értesítések

Használd ki a GitHub beépített audit naplóit, amelyek rögzítik a tárolóban és a szervezetben történt minden fontos eseményt. Integráld a GitHub Actions naplókat a központi logkezelő rendszeredbe (SIEM), ha van. Állíts be értesítéseket a gyanús tevékenységekre:

  • Sikertelen biztonsági ellenőrzések
  • Váratlanul hosszú futási idők
  • Sikertelen bejelentkezési kísérletek (self-hosted runner-ek esetében)
  • Munkafolyamatok, amelyek váratlanul módosítják a konfigurációt vagy a titkokat.

A GitHub Advanced Security funkciói, mint a Code scanning és a Secret scanning, szintén segíthetnek a proaktív hibafeltárásban.

8. Függőségek és szoftverellátási lánc sebezhetőségei

A munkafolyamatok gyakran építenek harmadik féltől származó könyvtárakra, csomagokra és image-ekre. Ezek elavult vagy sebezhető verzióinak használata jelentős kockázatot jelenthet.

A hiba lényege és a kockázat

Ha egy munkafolyamat olyan build környezetet használ, amely elavult függőségeket vagy sebezhető alap image-eket tartalmaz, az könnyen kihasználhatóvá válhat. Egy ilyen sebezhetőség lehetővé teheti a támadók számára, hogy rosszindulatú kódot futtassanak a CI/CD környezetben, vagy kompromittálják a generált artefaktumokat.

Megoldás: Dependabot és sebezhetőségi szkennerek

  • A Dependabot automatikusan ellenőrzi a tároló függőségeit, és pull requesteket hoz létre a biztonsági javításokkal és a verziófrissítésekkel. Aktiváld a Dependabot alerts és security updates funkcióit.
  • Integrálj sebezhetőségi szkennereket (pl. OWASP Dependency-Check, Snyk, Trivy) a munkafolyamataidba, hogy a build folyamat során ellenőrizzék a függőségeket és a Docker image-eket.
  • Használj megbízható és rendszeresen frissített alap image-eket a Docker konténereidhez.

9. Statisztikai elemzések (pl. CodeQL) hiánya

A kód biztonságának biztosítása nem ér véget a munkafolyamatok konfigurációjával. Magát az alkalmazáskódot is folyamatosan ellenőrizni kell a potenciális sebezhetőségek szempontjából.

A hiba lényege és a kockázat

Ha nem használsz statikus alkalmazásbiztonsági tesztelő (SAST) eszközöket a munkafolyamataidban, a potenciális biztonsági hibák (pl. SQL injekció, XSS, Path Traversal) bekerülhetnek az éles rendszerbe, anélkül, hogy a fejlesztési ciklus korai szakaszában észrevették volna őket.

Megoldás: Integrálj SAST eszközöket

Integráld a GitHub beépített CodeQL eszközét, vagy más SAST megoldásokat (pl. SonarQube, Bandit Pythonhoz) a munkafolyamataidba. Ezek az eszközök automatikusan elemzik a kódot minden push vagy pull request esetén, és jelentik a talált sebezhetőségeket. Ez lehetővé teszi, hogy a hibákat már a fejlesztési ciklus elején javítsd, minimalizálva a „shift-left” biztonsági megközelítés jegyében a kockázatokat és a javítási költségeket.

name: "CodeQL"

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      security-events: write
      contents: read

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3

    - name: Initialize CodeQL
      uses: github/codeql-action/init@v2
      with:
        languages: javascript # vagy a használt nyelvek listája

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v2

Összefoglalás és jövőbeli lépések

A GitHub Actions egy rendkívül erőteljes eszköz, de mint minden ilyen erejű platform, megfelelő odafigyelést és biztonsági tudatosságot igényel. A fent részletezett gyakori hibák elkerülésével jelentősen megerősítheted a szoftverfejlesztési folyamatod biztonságát és minimalizálhatod a potenciális támadási felületeket.

Ne feledd, a biztonság nem egy egyszeri feladat, hanem egy folyamatos folyamat. Rendszeresen ellenőrizd a munkafolyamataidat, tartsd naprakészen az action-öket és a függőségeket, és tájékozódj a legújabb biztonsági fenyegetésekről és bevált gyakorlatokról. A proaktív megközelítés és a folyamatos éberség kulcsfontosságú ahhoz, hogy a GitHub Actions munkafolyamataid továbbra is hatékonyak és biztonságosak maradjanak.

Investálj az oktatásba, ösztönözd a csapatodat a biztonsági szempontok figyelembevételére a fejlesztési folyamat minden szakaszában, és építs ki egy robusztus, ellenálló CI/CD környezetet. Ezzel nemcsak a kódod, hanem a teljes fejlesztési ökoszisztémád biztonságát is garantálni tudod.

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük