Snykを使用したOSSの脆弱性チェック

はじめに

ソフトウェアを開発する上でOSSを使用する機会が多いですが、使用するOSSのライセンスの問題や脆弱性があるかどうかをチェックすることは、ソフトウェアの品質を高めるうえで非常に重要になってきます。
OSSのチェックを行うためのツールとしてはいくつかあり、有名どころでいくとBlack DuckやSnykが挙げられます。
今回は、Snykを利用したOSSの脆弱性チェックを、自動化ツールGithubActionsと連携させて行う簡単な仕組みを構築しました。

Snykの特徴

Snykとはセキュリティプラットフォームで、docker、IaC、プログラム等の様々なソースコードの脆弱性を検知できるサービスとなっています。
様々なバージョン管理ツールやCI/CDツールをサポートしていて、連携がとりやすいことも特徴の一つです。
プランは無償プランから有償プランまでいくつか選べます。
無償プランでは、月にテスト回数の制限がありますが脆弱性のチェックを行うことができます。
※Snykの詳細については、公式ページが公開されているのでこちらをご覧ください。

GithubActionsとSnykの連携

それでは実際にSnykを使っていきたいと思います。
自動化ツールとしては、会社でも使用しているGithubActionsを用いたいと思います。
今回サンプルで作成するのは、ソフトウェア開発で使用しているOSS(grpcやprotocolbufferなど)をWorkspaceにダウンロードし、そのOSSの脆弱性を自動でチェックします。
SnykのWEB UIと連携して、チェック結果をUI上に表示させます。
併せて、結果ファイル(vuln.json)も出力します。

ファイル構成

フォルダ構成は以下の通りとなります。

|--.github
|  |--workflows
|  |  |--snyk-scan.yml
|--README.md

ワークフローの定義ファイル(snyk-scan.yml)は、以下の通りとなります。

---
name: snyk-scan
on:
  workflow_dispatch:
  push:
    branches:
      - "develop"
      - "main"

jobs:
  scan-job:
    name: scan-job
    runs-on: ubuntu-latest
    steps:
      - name: Ceckout repository
        uses: actions/checkout@v3

      - name: Download rules_proto
        run: |
          curl -OL https://github.com/bazelbuild/rules_proto/archive/refs/tags/4.0.0-3.19.2-2.tar.gz
          tar xfzv 4.0.0-3.19.2-2.tar.gz

      - name: Download com_github_protocolbuffers_protobuf
        run: |
          curl -OL https://github.com/protocolbuffers/protobuf/archive/v3.19.2.tar.gz
          tar xfzv v3.19.2.tar.gz

      - name: Download com_github_grpc_grpc
        run: |
          curl -OL https://github.com/grpc/grpc/archive/2717aa8c9b768de99c811628af4e8c30d6c2da4f.tar.gz
          tar xfzv 2717aa8c9b768de99c811628af4e8c30d6c2da4f.tar.gz

      - name: Setup SNYK
        run: |
          curl https://static.snyk.io/cli/latest/snyk-linux -o snyk
          chmod +x ./snyk
          ./snyk auth ${{ secrets.SNYK_API_TOKEN }}

      - name: Scan source
        run: |
          set +e
          ./snyk test --unmanaged --all-projects --json-file-output=vuln.json
          ./snyk monitor --unmanaged
          set -e

      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: Results file
          path: vuln.json

      - name: Clean workspace
        if: ${{ always() }}
        run: |
          chmod +w ${{github.workspace}} -Rf
          rm -rf ${{github.workspace}}/*

DownloadステップでOSSをWorkspaceにダウンロードしています。
Setup SNYKステップで、Snyk CLIのダウンロードとAPIキーの認証を行っています。
(事前に、Snykへの登録およびAPIキーの取得とシークレットへの登録を行ってください。)
今回はSnyk CLIをダウンロードして行っていますが、Docker環境を用いてscanを実行することも可能です。
(参考:Snyk CLIを用いたC/C++プロジェクトのScan方法)
Scan Sourceステップでは、Scanの実行とSnykのWEB UIへの表示を行っています。

実行結果

GithubActionsの実行結果です。
結果ファイルとして、vuln.jsonファイルもUploadされています。

GithubActions Result
GithubActions Result-2

WEB UIにアクセスすると、以下のようにScanしたOSSの脆弱性を確認することができます。

Snyk Result

今回は無償プランということでOSSの脆弱性の表示のみされますが、有償プランにすると各OSSのライセンスの管理をすることも可能となります。

おわりに

今回は、Snyk CLIを用いて直接ソースコードをScanしました。
しかし、ビルドツールであるBazelと連携したScanなども可能なので、Scan方法は状況に応じて適切なものを選択していきたいと思います。
また、まだ試せていない機能もたくさんあるので、随時アップデートしていきたいと思います。

Test

Posted by okuribito