Zabezpečení vašich projektů Node.js pomocí CI/CD

Mnohokrát my jako vývojáři rádi předstíráme, že veškerý kód, který píšeme, je od přírody bezpečný. Koneckonců, kdo chce přiznat, že produkt, který vyrábí, je zaručený mít zranitelnostem dostatek času? Zároveň mohou bezpečnostní postupy často působit proti celkovým zkušenostem a agilitě vývojářů s nástroji, takže se ocitáme v nikdy nekončící bitvě mezi praktičností a vytvářením etického a bezpečného softwaru. Sečteno a podtrženo:bezpečnost je disciplína, která od nás jako vývojářů vyžaduje, abychom změnili naše procesy v jejich jádru, abychom se mohli rychle vyvíjet a v noci klidně spát.

Když si nejste jisti, zautomatizujte to!

Odpověď je zřejmá, ne? Přimějte k tomu roboty! Kdykoli je vývojový tým postaven před úkol, který vyžaduje významnou, opakující se práci, nejlepším přístupem je začít otázkou:„Jak mohu tento úkol zautomatizovat?“.

Bohužel, bot za vás nenavrhne bezpečné aplikace (...alespoň zatím ne 😬 ), ale co pro vás může udělat? Abychom na to odpověděli, podívejme se, co pro nás npm CLI může udělat hned po vybalení.

$ npm audit --audit-level=moderate
$ npm outdated

S těmito jednoduchými příkazy npm máme základní stavební blok, který potřebujeme k tomu, aby selhal náš proces sestavování, když je v seznamu závislostí nalezena zranitelnost zabezpečení, a upozorní nás, když naše balíčky zaostávají za doporučenými verzemi.

Zablokujte sestavení!

Vezměme si tedy tyto nástroje CLI a uveďme je do praxe. V této příručce budu používat akce GitHub k implementaci jejich velmi základní aplikace, která vám pomůže zavést systém.

Obecnou myšlenkou je vytvořit automatizační úlohu, která bude spuštěna při každém požadavku na vytažení ke masteru. Nejprve zablokujte sestavení po neúspěšném auditu.

name: Run Checks

on:
  pull_request:
    branches: [ master ]

jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node
        uses: actions/setup-node@v1
        with:
          node-version: '14.x'
      - name: CI Install
        run: npm ci
      - name: Audit
        run: npm audit --audit-level=moderate

Tento pracovní postup se roztočí a spustí příkaz audit, o kterém jsme hovořili dříve, ale abychom váš tým přinutili skutečně dodržet tuto kontrolu, musíme změnit některé konfigurace na GitHubu, jak je vidět níže:

Zkuste a držte krok!

Dále umožňuje upgradovat náš dříve definovaný pracovní postup tak, aby zahrnoval zastaralá oznámení. Cílem by bylo, aby to neblokovalo příchozí požadavky na stahování, ale spíše informovalo tým o zastaralých závislostech prostřednictvím slabého webového háčku. Případně můžete použít něco jako Dependabot, ale my zůstaneme u akcí, abychom demonstrovali základní koncept.

name: Run Checks

on:
  pull_request:
    branches: [ master ]
  schedule:
    - cron: '0 17 * * 5' # every friday at 5 PM 😈

jobs:
  check_versions:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: npm ci
      - uses: MeilCli/npm-update-check-action@v4
        id: outdated
      - uses: 8398a7/action-slack@v2
        if: steps.outdated.outputs.has_npm_update != 'false'
        with:
          status: ${{ job.status }}
          text: ${{ steps.outdated.outputs.npm_update_text }}
          author_name: GitHub Actions
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

Spíše než spouštění našeho vlastního skriptu, který využívá npm outdated , můžeme použít jednu z mnoha komunitou spravovaných akcí, které jsou k dispozici! V tomto příkladu použijeme npm-update-check-action. Jak můžete vidět ve výše uvedeném úryvku kódu, musíme jednoduše stáhnout akci a předat její výstup jedné z mnoha akcí slack web-hook, abychom informovali tým, pokud je detekován zastaralý balíček.

Chcete-li to zlepšit, můžete experimentovat s následujícími kroky:

  • Otevření problému s githubem ke sledování stavu toho, jak se tým rozhodl zacházet se zastaralým balíčkem.
  • Implementujte Dependabot
  • Pokud byla akce spuštěna prostřednictvím PR, nechejte akci okomentovat.

Souhrn

  • Bezpečnost je disciplína, která by měla ovlivnit proces vývoje aplikací, artefaktů balení a nasazení.
  • Vývojáři by se měli snažit o automatizované způsoby, jak přimět své týmy k odpovědnosti za opravy zastaralých balíčků a zranitelností zabezpečení.
  • S npm CLI máme mnoho způsobů, jak vyřešit zranitelnost a zastaralý audit balíčků, které můžeme využít v našich kanálech.

Reference

  • Dokumentace akcí Github
  • npm audit Dokumentace
  • npm outdated Dokumentace
  • Po vybalení akce Github pro npm audit