CI/CD-pipelines har tillgång till dina hemligheter, din kod och dina servrar. Ändå ser jag sällan att de härdas ordentligt.

1. Pinning av actions till SHA

# Dåligt — en komprometterad tag kan injicera kod
- uses: actions/checkout@v4

# Bra — fixerad till exakt commit
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11

Varför? Om någon kapar actions/checkout och uppdaterar taggen v4 körs deras kod i din pipeline.

2. Minsta möjliga behörigheter

permissions:
  contents: read      # Bara läsning av repo
  packages: write     # Skriv bara till packages

Standardbehörigheterna är alldeles för breda. Begränsa alltid.

3. Miljöskydd för deployment

Konfigurera i GitHub → Settings → Environments:

  • Required reviewers — manuellt godkännande innan deploy
  • Deployment branches — bara main får deploya
  • Wait timer — fördröjning innan deploy startar
jobs:
  deploy:
    environment:
      name: production
      url: https://example.se
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@b4ffde65
      - run: ./deploy.sh

4. Rotera hemligheter regelbundet

GitHub Secrets är bekvämt, men:

  • Rotera alla tokens minst var 90:e dag
  • Använd korta livslängder där det går (OIDC tokens)
  • Logga aldrig hemligheter — add-mask om det behövs
- run: echo "::add-mask::${{ secrets.API_TOKEN }}"

5. Skanna beroenden

- name: Dependency audit
  run: |
    pip install pip-audit
    pip-audit --requirement requirements.txt --fix --dry-run

6. Begränsa self-hosted runners

Self-hosted runners kör kod på din infrastruktur. Om du använder dem:

  • Kör aldrig runners på servrar med känslig data
  • Använd ephemeral runners som raderas efter varje jobb
  • Isolera runners i egna VMs eller containers

En komprometterad pipeline kan vara värre än ett dataintrång. Behandla den därefter.