[GitHub Actions] Snyk Node Actionを使ってCI Workflow上で脆弱性のチェックをしてみた

2022.06.08

こんにちは、CX事業本部 IoT事業部の若槻です。

Snykは、ソースコードをスキャンしてOSSやコードなどに含まれる脆弱性を独自のデータベースやインテリジェンスをもとに検出することができるセキュリティプラットフォームです。

今回は、GitHub ActionsSnyk Node Actionを使ってCI Workflow上でNodeプロジェクトの脆弱性のチェックをしてみました。

やってみた

Snyk Tokenの取得、設定

GitHub ActionsからSnykに接続するためのTokenを取得および設定します。

SnykのAccount Settingsを開きます。TokenのKEYを控えます。

GitHubのSecretsにSnyk Tokenを設定します。ここではRepositoryのSecretsにSNYK_TOKENという名前で設定しました。

Snyk Node Actionで脆弱性をスキャンする

Snyk Node Actionを使えば、SnykによるNodeプロジェクトのスキャンをGitHub Actions Workflowに設定できます。

snyk/actions/nodeを次のように使用します。

.github/workflows/ci.yml

name: Example workflow for Node using Snyk
on: push
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Run Snyk to check for vulnerabilities
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

CommitをPushするとWorkflowが実行されました。今回は脆弱性が検出されなかったため実行が成功しました。

次に同じWorkflowで脆弱性を含むDependencyをRepositoryに含めてみます。

npm i firebase-admin

added 169 packages, and audited 171 packages in 15s

9 packages are looking for funding
  run `npm fund` for details

2 high severity vulnerabilities

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

CommitをPushしてWorkflowを実行すると、今度はFailしました。

Snykのスキャンで1件の脆弱性が検出されています。

Testing /github/workspace...
Tested 164 dependencies for known issues, found 1 issue, 1 vulnerable path.
Issues with no direct upgrade or patch:
  ✗ Denial of Service (DoS) [High Severity][https://snyk.io/vuln/SNYK-JS-DICER-2311764] in dicer@0.3.1
    introduced by firebase-admin@10.2.0 > dicer@0.3.1
  No upgrade or patch available
Organization:      cm-rwakatsuki
Package manager:   npm
Target file:       package-lock.json
Project name:      test220608
Open source:       no
Project path:      /github/workspace
Licenses:          enabled

記載されているURLを開くと、Snykのデータベースで脆弱性の詳細な情報を確認できます。この脆弱性はDoSに対する脆弱性があるようです。

これにより脆弱性があればCIを失敗させて、解消されるまではPull RequestのMergeやDeployをさせないようにするWorkflowが組めそうですね。

一定のSeverity以上の場合のみFailさせる

検出された脆弱性のSeverity Levelが一定以上の場合のみWorkflowをFailさせることも可能です。

SnykのSeverity Levelには次の4段階があります。

  • low
  • medium
  • high
  • critical

critical以上の場合のみFailするようにしてみます。args--severity-threshold=criticalと指定します。

.github/workflows/ci.yml

name: Example workflow for Node using Snyk
on: push
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Run Snyk to check for vulnerabilities
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        with:
          args: --severity-threshold=critical

先ほどと同じDependencyを利用してWorkflowを実行しましたが、今度は実行が成功しました。

プロジェクトの脆弱性を継続的に監視する

プロジェクトをSnykに登録することにより、CI実行以降にも脆弱性を継続的に監視し、新しく脆弱性が検出された時に通知を行うこともできます。

プロジェクトのSnykへの登録は、commandmonitorと指定します。

.github/workflows/ci.yml

name: Example workflow using Snyk
on: push
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Run Snyk to check for vulnerabilities
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        with:
          command: monitor

Workflowを実行すると、Workflowの実行自体は成功します。

Snykのコンソールを見ると、プロジェクト一覧にWorkflowを実行したRepositoryおよびプロジェクトが登録されています。

プロジェクト内に含まれている脆弱性の詳細も確認可能です。

また脆弱性が検出された際には下記のようなメールが届いて脆弱性の検出を通知してくれます。

おわりに

GitHub ActionsでSnyk Node Actionを使ってCI Workflow上で脆弱性のチェックをしてみました。

今回はDependency(OSS)の検出だけでしたが、コード自体の脆弱性やIaC、ライセンス違反などもチェックすることができます。SnykをCI/CDに組み込んで常にセキュアなプロダクトをデリバリーできるようにしてみてはいかがでしょうか。

参考

以上