依存ライブラリスキャン

FutureVulsでは、OSのパッケージだけではなくアプリケーションの依存ライブラリの脆弱性を検知、管理する機能があります。

検知方法はいくつかあり、それぞれスキャン可能な種類、検知性能の違いがありますので実際に試した上で選択、あるいは組み合わせて検知されることをおすすめします。

それぞれの検知方法の特徴はスキャン方法の選択肢と特徴に記載しています。


Lockfileのペーストスキャン

ブラウザにLockFileの内容をペーストしてスキャンする方法です。

登録されたLockFileに影響する脆弱性が公開されたタイミングでFutureVulsにて検知され、自動でタスク登録されユーザに通知されます。 依存ライブラリをバージョンアップしてLockFileの内容が更新された場合は、FutureVulsの画面上からLockFileの内容を更新してください。FutureVulsで検知済みタスクのステータスが「patch_applied」に自動更新されます。

ペーストスキャンでサポートするLockFileは以下の通りです。

スキャン可能なLockfileやバイナリは対応環境を参照してください。

LockFileをFutureVuls画面から登録する方法を説明します。

  • サーバを選択し、LOCKFILEのタブで追加をクリック

image

  • LockFileに名前を付け、種別を選択。LockFileの内容をペーストし、送信。

image

  • 次回スキャン時にソフトウェアの登録と脆弱性を検知します

image


Trivyでファイルシステム上のパスを指定したスキャン

aquasecurity/trivyはアプリケーション依存ライブラリの脆弱性検知が可能なOSSツールです。指定したディレクトリ以下に格納されているアプリケーション依存ライブラリを自動検出して、それらの脆弱性をスキャンできます。FutureVulsではTrivyのスキャン結果を取り込み、FutureVuls上でアプリケーションライブラリの脆弱性を管理できます。

Trivyは様々な言語のLockファイルやjarファイルのようなバイナリを基に脆弱性スキャンを行います。 サポート対象の言語やパッケージエコシステムの詳細は、Trivy Language-specific PackagesのFilesysetm列、Rootfs列を参照してください。

Trivyによるコンテナイメージスキャンでは、以下の2パターンをご利用いただけます。

ローカル環境にTrivyをインストールしてスキャンする

Trivyをローカル環境にインストールし、アプリケーションライブラリをスキャンした結果をFutureVulsにアップロードします。この方法では、通常版と軽量版の2つのインストールモードが選択できます。それぞれの違いは以下の通りです。

項目 説明 通常版 軽量版
root権限 インストール時にroot権限が必要かどうか 必要 不要
対応環境 セットアップ可能な環境 参考 Linux全般
定期スキャン アプリケーションライブラリを自動で定期的にスキャンするか 対応 未対応

新しく依存ライブラリをスキャンする

新しくアプリケーションライブラリをスキャンし、FutureVulsに登録する場合は次の手順に従ってください。

  1. サーバタブの サーバ追加 ボタンからダイアログを開き、ファイルシステム上のライブラリをスキャン を選択する Trivyによるライブラリスキャン追加ダイアログ誘導
  2. スキャナトークンを選択し、スキャン対象ディレクトリの絶対パスを入力する
    • パスを指定しない場合は自動でルートディレクトリが指定され、ファイルシステム上の全てのアプリケーションライブラリがスキャン対象となります。
  3. プロキシ環境下の場合は、経由するプロキシサーバを入力する
  4. 軽量版を使用する場合はスイッチバーにチェックをいれる
  5. 画面下部に表示されているコマンドをコピーし、対象アプリケーションライブラリを管理しているローカル環境で貼り付け、実行する Trivyによるライブラリスキャン追加ダイアログ
  6. FutureVulsにて対象グループのサーバタブに、スキャンしたディレクトリが追加されていることを確認
    • 通常版の場合、FutureVulsに反映されるまで5~10分程度かかります。
      • インストール後、すぐにスキャンを実行したい場合は次のコマンドを実行してください。
        • /opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log

以上で登録は完了です。 通常版をご利用の場合は、スキャナが1日1回自動で起動し、対象のディレクトリをスキャンしてFutureVulsに反映します。

通常版では、さらにいくつかのスキャンオプションがご利用いただけます。

また、スキャン結果が反映されない場合はコチラを参照ください。

登録済みライブラリの構成情報を更新する

  • 登録済みの構成情報を基に脆弱性情報を最新化する

FutureVulsに既に登録済みのアプリケーションライブラリの構成情報を基に、脆弱性情報の最新化を行いたい場合は、FutureVuls上から手動スキャンを実行してください。

  • アプリケーションライブラリの構成情報の変更をFutureVulsに反映する

登録している依存ライブラリに変更があった場合は、本手順に従ってFutureVulsに反映してください。

  • 通常版の場合
    • スキャナが1日1回自動で起動し、イメージをスキャンしているため操作は必要ありません
    • 今すぐスキャナを起動したい場合は、rootユーザもしくはvuls-trivy-saasユーザで次のコマンドを実行してください。
      • /opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log
  • 軽量版の場合
    1. サーバタブで対象のサーバをクリックし、サーバ詳細ページを開く
    2. 構成情報を更新 ボタンをクリックしてダイアログを開く Trivyスキャン ライブラリ更新
    3. スキャナトークンを選択し、スキャン対象ディレクトリの絶対パスを入力する
    4. プロキシ環境下の場合は、経由するプロキシサーバを入力する
    5. 画面下部に表示されているコマンドをコピーし、対象アプリケーションライブラリを管理しているローカル環境で貼り付け、実行する

CI/CDパイプラインに組み込む方法

TrivyをCI/CDパイプラインに組み込み、アプリケーションライブラリをスキャンした結果をFutureVulsにアップロードします。このドキュメントではGitHub Actionsを例に紹介します。 GitHub ActionsのサンプルYAMLファイルは以下のとおりです。

  • サンプルで使用する環境変数
変数 説明 必須
VULS_SAAS_GROUPID スキャン結果をアップロードするグループのID
VULS_SAAS_TOKEN スキャン権限をもったトークン
TARGET_LIBRARY スキャン対象ディレクトリのパス
VULS_SAAS_UUID FutureVulsで管理する用のUUID
新規登録の場合はuuidgenコマンド等で生成した値を指定する

スキャン用のスクリプトファイルを用いてスキャンします。

name: FutureVuls Docker Image Scan
on:
  push
defaults:
  run:
      shell: bash
jobs:
  docker-test:
    name: FutureVuls Docker Image Scan
    env:
      VULS_SAAS_GROUPID: ${{ secrets.VULS_SAAS_GROUPID }}
      VULS_SAAS_TOKEN: ${{ secrets.VULS_SAAS_TOKEN }}
      TARGET_LIBRARY: "/aaa/bbb"
      VULS_SAAS_UUID: "xxxxxxxx"
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: cached scan db
      uses: actions/cache@v2
      with:
        path: vulndb/
        key: trivy-vulndb
    - name: scan and upload
      env: 
      run: 
        curl -s http://installer.vuls.biz/vuls-trivy-light.sh | \
        VULS_SAAS_GROUPID="${env.VULS_SAAS_GROUPID}" \
        VULS_SAAS_TOKEN="${env.VULS_SAAS_TOKEN}" \
        TARGET_LIBRARY="${env.TARGET_LIBRARY}" \
        bash -s inst

GitHub ActionsでPush時にLockfileを自動更新する方法

futurevuls/fvuls-lockfile-uploaderを使い、git push 時にLockfileが更新されたかをチェックし、Lockfileが更新された場合のみ、FutureVuls登録済みのLockfileをREST API経由で更新する方法を解説します。

下記のサンプルでは、release ブランチにプッシュされた場合かつ、./go.sum または ./web/yarn.lock が変更された場合のみ実行されます。

サンプル内の以下の環境変数は、Encrypted Secretsにてセットして下さい。

環境変数名 確認方法
FVULS_SERVER_UUID サーバ一覧から確認する
FVULS_TOKEN グループ設定 > 開発者APIから確認する
on:
  push:
    ## https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#onpushpull_requestpaths
    paths:
      - 'go.sum'
      - 'web/yarn.lock'
    branches:
      - release

name: Check lockfiles
jobs:
  build:
    env:
      FVULS_SERVER_UUID: ${{ secrets.FVULS_SERVER_UUID }}
      FVULS_TOKEN: ${{ secrets.FVULS_TOKEN }}
    name: Upload lockfile
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Upload go.sum
        uses: futurevuls/fvuls-lockfile-uploader@v1
        with:
          repoName: ${{ github.repository }}
          path: './go.sum'
      - name: Upload web/yarn.lock
        uses: futurevuls/fvuls-lockfile-uploader@v1
        with:
          repoName: ${{ github.repository }}
          path: './web/yarn.lock'

trivyでリモートレポジトリ上のライブラリをスキャン

trivyのrepositoryスキャンと連携することで、GitHub/GitLab 上にある言語ライブラリの脆弱性を検知し、FutureVuls上で管理できます。 これにより、trivyをインストールするローカル環境内にスキャン対象のライブラリファイルが存在しない場合でも、ライブラリスキャンをご利用いただけます。

サポート対象の言語やパッケージエコシステムの詳細は、Trivy Language-specific PackagesのRepository列を参照してください。

スキャン方法

新規登録

  • ネットワークに接続されたクライアントにtrivyをインストール
curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | \
grep "browser_download_url.*_Linux-64bit.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf trivy_*
curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
grep "browser_download_url.*trivy-to-vuls.*_linux_amd64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf trivy-to-vuls*
curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
grep "browser_download_url.*future-vuls.*_linux_amd64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf future-vuls*
  • 環境変数をセット
export FVULS_GROUP_ID=xxx
export FVULS_TOKEN=xxx
export FVULS_SERVER_UUID=`uuidgen`
export REPOSITORY_URL=https://xxx.xxxxx/xxx
# プロキシ環境下の場合は経由するプロキシサーバをセット
export https_proxy=http://name:pass@proxy:port

# スキャン対象レポジトリによってセットする変数を選択する
export GITHUB_TOKEN=xxxxxxxx
export GITLAB_TOKEN=xxxxxxxx
環境変数 説明 詳細
FVULS_GROUP_ID グループID グループ設定を開き、URLから確認する。
https://console.vuls.biz/org/xxx/group/[ココ]/setting/profile
FVULS_TOKEN トークン グループ設定>トークンを開き、スキャン権限を持つトークンを選択する。
FVULS_SERVER_UUID UUID uuidgen などのコマンドを使って任意に作成する。
FutureVuls上でサーバの識別に利用される。
REPOSITORY_URL レポジトリURL スキャン対象のレポジトリのURL。
GITHUB_TOKEN GitHubトークン スキャン対象レポジトリに読み取り権限をもつGitHubトークン。
GITLAB_TOKEN GitLabトークン スキャン対象レポジトリに読み取り権限をもつGitLabトークン。

  • レポジトリをスキャンしてFutureVulsにアップロード
./trivy repo -q -f json --list-all-pkgs ${REPOSITORY_URL} | \
./trivy-to-vuls parse --stdin | \
./future-vuls upload --stdin --url https://auth.vuls.biz/one-time-auth --group-id ${FVULS_GROUP_ID} --token ${FVULS_TOKEN}  --uuid ${FVULS_SERVER_UUID}

FutureVulsを開いて確認すると、新しくサーバが登録され、言語ライブラリの脆弱性が検知されているのが確認できます。

ライブラリファイル更新

既に一度登録したライブラリを更新する場合は、環境変数 FVULS_SERVER_UUID に、対象サーバのUUIDをセットしてからスキャン・アップロードしてください。

trivy repoサーバのUUIDを取得

# trivy, trivy-to-vuls, future-vulsのインストールは省略

export FVULS_GROUP_ID=xxx
export FVULS_TOKEN=xxx
export FVULS_SERVER_UUID=xxx
export REPOSITORY_URL=https://xxx.xxxxx/xxx

# スキャン対象レポジトリによってセットする変数を選択する
export GITHUB_TOKEN=xxxxxxxx
export GITLAB_TOKEN=xxxxxxxx

./trivy repo -q -f json --list-all-pkgs ${REPOSITORY_URL} | \
./trivy-to-vuls parse --stdin | \
./future-vuls upload --stdin --url https://auth.vuls.biz/one-time-auth --group-id ${FVULS_GROUP_ID} --token ${FVULS_TOKEN}  --uuid ${FVULS_SERVER_UUID}

Vuls ScannerでLockfileを指定したスキャン

サーバ上に配置されているLockfileやバイナリのパスを指定して依存ライブラリの脆弱性をスキャンする方法です。

スキャン可能なLockfileやバイナリは対応環境を参照してください。

本機能はローカルスキャンモード、リモートスキャンモードの両方に対応しています。

Vuls ローカルスキャンモードの動作

config.tomlに、スキャン対象のLockFileのパスを指定します。scan時に指定されたパスのLockfileを解析し依存ライブラリのリストを取得します。

lockfile-local

Vuls リモートスキャンモードの動作

config.tomlに、スキャン対象サーバ上のLockFileのパスを指定します。scan時にSSHで接続したリモートサーバの指定したパスのLockfileを解析し、依存ライブラリのリストを取得します。

lockfile-remote

設定方法

/opt/vuls-saas/config.tomlにlockfileのパスを指定して下さい。

[servers]

[servers.sample]
user = "vuls-saas"
host = "localhost"
port = "local"
lockfiles = [
  "/home/user/lockfiles/package-lock.json",
  "/home/user/lockfiles/Gemfile.lock",
  "/home/user/lockfiles/yarn.lock"
]

また、config.tomlで findLock = true を指定すると、スキャン対象サーバ上のLockFileを自動検索してスキャン可能です。

[servers]

[servers.sample]
user = "vuls-saas"
host = "localhost"
port = "local"
findLock = true
  • スキャン後のパッケージは、OSパッケージ同様、ソフトウェアとタスクに表示されます。

GitHub Security Alerts連携

GitHubの機能である、GitHub Security Alertsは、レポジトリ内のLockfileに記載された依存ライブラリの脆弱性をスキャンする機能です。FutureVulsではGitHubとAPI連携し、GitHubにて検知された脆弱性をFutureVulsに取り込むことが出来ます。

ソースコードをGitHubで管理してない場合でも、LockfileのみをGitHub上で管理することにより、GitHubにて脆弱性検知が可能となります。

サポート対象の言語と種類はGitHub:Supported package ecosystemsを参照してください。


FutureVulsの画面上でCPEを登録する方法

FutureVuls画面上からCPEを登録してライブラリの脆弱性スキャンをする方法です。CPEを用いたスキャンの情報ソースがNVDとJVNですので、NVD, JVNに登録されていないライブラリ脆弱性は検知出来ません。また、登録対象のライブラリがさらに依存するライブラリも登録する必要がありますので、通常は他の方法を採用するのが良いでしょう。