コンテンツにスキップ

アプリケーションスキャン#

FutureVuls では、OS のパッケージだけではなくアプリケーションの依存ライブラリの脆弱性を検知、管理する機能があります。 依存ライブラリの脆弱性には CVE が採番されていない脆弱性がたくさんありますが、それら CVE が採番されていない脆弱性も検知されます。

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

LockFileのペーストスキャン#

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

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

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

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

  1. サーバを選択し、アプリケーションのタブで「LOCKFILE 追加」をクリック

    LOCKFILE追加ボタン

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

    image

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

    image

アプリケーションのSBOMインポート#

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

LockFile のペーストスキャンと同様の方法で SBOM が含む依存ライブラリを FutureVuls に登録できます。 SBOM に含まれたアプリケーションやライブラリは SBOM 追加と同時に登録され次回スキャン時に脆弱性を検知します。

  • サポート対象のSBOMツールは「こちら」に記載しています
  • サポート対象の依存ライブラリは「アプリケーションのSBOMインポート」を参照してください。
  • 2024-10-16リリース」より以前に登録されたアプリケーションのSBOMファイルは、サーバ種別:SBOMの場合のみサーバのSBOMファイルに統合されます。

アプリケーションの SBOM を FutureVuls コンソール画面から登録する方法の詳細は以下のリンクをご参照ください。

※ SBOM の追加がうまくできない場合は「依存ライブラリスキャンのFAQ」をご参照ください。

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

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

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

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

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

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

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

軽量版では root 権限が不要な代わりに、アプリケーションライブラリのスキャンを定期的に手動で行う必要があります。 また、指定するディレクトリパス以下のすべてのディレクトリ・ファイルに読み取り権限を持つユーザで実行する必要があります。 依存ライブラリの構成変更を常に FutureVuls に同期し脆弱性情報を最新化しておくためにも、どちらのモードも選択可能な場合は、基本的に通常版でのスキャンをご利用ください。

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

新しくアプリケーションライブラリをスキャンし、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 に反映します。

通常版では、スキャン対象コンテナイメージ/ライブラリ等のスキャンオプションを config.toml に手動で追加可能です。 詳しくは「 trivy スキャンの設定ページ」をご覧ください。

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

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

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

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. 画面下部に表示されているコマンドをコピーし、対象アプリケーションライブラリを管理しているローカル環境で貼り付け・実行する

Trivyスキャンで設定可能なオプション#

Trivy スキャンの設定方法については、Dockerスキャン(trivy) ページ にまとめて記載してあります。 スキャンするライブラリを手動で追加いただきたい場合は、こちらのページを参照してください。

git push時にライブラリの脆弱性をスキャンする#

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

  • サンプルで使用する環境変数
変数 説明 必須
VULS_SAAS_GROUPID スキャン結果をアップロードするグループのID
VULS_SAAS_TOKEN スキャン権限をもったトークン
TARGET_LIBRARY スキャン対象ディレクトリのパス
リポジトリ内すべてを対象とする場合は ${{ github.workspace }} のままでよい
VULS_SAAS_UUID FutureVulsで管理する用のUUID
新規登録の場合は uuidgen コマンド等で生成した値を指定する
ACTIONS_RUNTIME_TOKEN 認証させる GitHub トークン
RATELIMIT によるエラーが発生する場合に必要
  • FutureVuls 上で既に管理しているライブラリの構成情報を更新する場合は、対象ライブラリの UUID を VULS_SAAS_UUID として指定してください。

lib-uuid

以下の環境変数は「encrypted secrets」にてセットすることを推奨しています。

  • VULS_SAAS_GROUPID
  • VULS_SAAS_TOKEN

この情報を使うとFutureVulsの指定したグループに対して、任意のサーバのスキャン結果のアップロードが可能となってしまいます。

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

name: FutureVuls library Scan 
on: 
  push: 
defaults: 
  run: 
      shell: bash 
jobs: 
  docker-test: 
    name: FutureVuls library Scan 
    env: 
      VULS_SAAS_GROUPID: ${{ secrets.VULS_SAAS_GROUPID }}
      VULS_SAAS_TOKEN: ${{ secrets.VULS_SAAS_TOKEN }}
      TARGET_LIBRARY: "${{ github.workspace }}" 
      VULS_SAAS_UUID: "xxxx" 
      ACTIONS_RUNTIME_TOKEN: ${{ secrets.GITHUB_TOKEN }} 
    runs-on: ubuntu-latest 
    steps: 
    - uses: actions/checkout@v4 
    - name: cached scan db 
      uses: actions/cache@v3 
      with: 
        path: vulndb/ 
        key: trivy-vulndb 
    - name: scan and upload 
      run: 
        curl -s https://installer.vuls.biz/vuls-trivy-light.sh | 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 グループ設定 > FutureVuls 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-latest
    steps:
      - uses: actions/checkout@v4
        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によるローカルなファイルシステム上のライブラリスキャン」と比較して、サポート対象言語が少ないため、ご注意ください。

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

スキャン方法#

新規登録#

作業環境に合わせて、以下3つのツールをインストールする。

tools releases
trivy https://github.com/aquasecurity/trivy/releases/
trivy-to-vuls https://github.com/future-architect/vuls/releases
future-vuls https://github.com/future-architect/vuls/releases
インストールコマンド例

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_*.tar.gz

trivy-to-vulsをインストール

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*.tar.gz

future-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*.tar.gz

trivyをインストール

curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | \
grep "browser_download_url.*_macOS-ARM64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf trivy_*.tar.gz

trivy-to-vulsをインストール

curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
grep "browser_download_url.*trivy-to-vuls.*_darwin_arm64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf trivy-to-vuls*.tar.gz

future-vulsをインストール

curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
grep "browser_download_url.*future-vuls.*_darwin_arm64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf future-vuls*.tar.gz

続いて、以下の環境変数をセットする。

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トークン

トークン設定

GITHUB_TOKENGITLAB_TOKEN が両方設定されている場合は、常に GITHUB_TOKEN を認証トークンとして利用するため、GitLab 上のリポジトリをスキャンする場合は GITHUB_TOKEN を環境変数から削除してください。

最後に、リポジトリをスキャンして FutureVuls にアップロードする。

./trivy repo -q -f json --list-all-pkgs ${REPOSITORY_URL} | \
./trivy-to-vuls parse --stdin | \
./future-vuls upload --stdin --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 -o ./results.json --list-all-pkgs ${REPOSITORY_URL}
./trivy-to-vuls parse ./ -f result.json | \
./future-vuls upload --stdin --group-id ${FVULS_GROUP_ID} --token ${FVULS_TOKEN}  --uuid ${FVULS_SERVER_UUID}

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

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

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

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

Linux サーバのみ対応しています。Window サーバの場合は、「Trivyでファイルシステム上のパスを指定したスキャン」をご利用ください。

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 = truefindLockDirs を指定すると、スキャン対象サーバ上の findLockDir 以下の LockFile や Jar などを自動検索できます。

findLock = true かつ findLockDirs を指定しない場合」はルート以下の全ディレクトリの LockFile を find コマンドで検索します。この場合、find コマンド実行中に、1つの CPU コアを専有する可能性があります。 もし許容できない場合は findLockDirs を指定して自動検索の対象ディレクトリの指定をおすすめします。

[servers]

[servers.sample]
user = "vuls-saas"
host = "localhost"
port = "local"
findLock = true 
findLockDirs = [
  "/path/to/project1/lib",
  "/path/to/project2/lib",
]

スキャン後のパッケージは、OS パッケージ同様、ソフトウェアとタスクに表示されます。

GitHub Security Alerts連携#

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

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

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

AWS Lambdaの依存ライブラリをスキャン#

Amazon InspectorによるAWS Lambda関数スキャン機能」を利用し、AWS Lambda の依存ライブラリの脆弱性を FutureVuls に取り込み管理することが出来ます。

Amazon Inspector を FutureVuls に連携するメリットについては下記のブログ記事をご参考ください。

FutureVuls と Amazon Inspector の連携:脆弱性の一元管理、リスク判断と運用者への対応指示まで自動化

連携方法の詳細は「こちら」を参照してください。

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

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