JFrog Japan Blog

DevOpsを加速する、JFrog日本法人メンバーによるブログです。

JFrog ArtifactoryやXrayといった自社ツールはもちろん、CI/CDやコンテナ技術(DockerやKubernetes)などDevOpsの一般的な内容も扱います。
その他、日本でのDevOps事例紹介やお楽しみコンテンツも掲載予定です。 JFrogならではの面白くて役に立つブログを目指しますので、お楽しみに!

JFrog Xray無料版でOSS脆弱性をチェックする方法

こんにちは!JFrog Developer AdvocateのよしQ(よしきゅー)です。

以前ブログではJFrog Xrayを利用してOSS脆弱性がスキャンについてお知らせし、 以下でそれに必要な設定編その1として、JFrog Artifactoryの設定について説明しました。 blog.jfrog.co.jp

今回は、設定編その2として、 Artifactoryに登録したアーティファクト(ビルド)に対してXrayがチェックを行うための設定について説明します。

なお、Xrayによるスキャンは、Artifactoryに保管されたアーティファクトに対して行われます。(Xrayを単体で利用することはできません。)
そのため、Artifactoryに対してアーティファクトを保管することが、Xrayのスキャンを行う前提条件となります。 まだArtifactoryの準備ができていない場合は、前述はArtifactoryの設定を参照しながら環境の準備をお願いします。

ステップ0: Artifactoryの状況を確認

このブログは、JFrog Artifactoryの設定と、アーティファクトおよびビルドが登録とが完了している状態からの説明です。

その際、Buildの都度識別できるようBuild nameとBuild numberを設定していましたが、 Buildの都度、チェックが行われるように設定していきます。

スタートを合わせる意図で、ビルドの状況を確認します。 アプリケーション(Application)メニューの「Artifactory」> 「Builds」の順に進んで(下図赤線)、ビルドの一覧画面に進み、「xraytest-build」を選択します。

Build 「xraytest-build」の一覧 (設定前)

前回のブログでbuild number「sample1-001」を登録していて、Xray statusは未設定であったため、 「Not Scanned」でした。

では、設定を始めていきましょう!

ステップ1: 対象リソースのIndexを作成する

管理者(Administration)メニューの「Xray」> 「Settings」の順(赤線)に進み、「Indexed Resources」(青枠)を押下し、Indexed Resource画面へ遷移します。

Xray settings画面

Index Resources画面で「Build」タブを選択し、「Manage Builds」を押下し、 対象のBuildをIndex作成対象に設定します。

Indexed Resources画面 (Buildsタブ)

表示されるConfigure Indexed Builds画面で、対象のBuildを選択します。 今回は「xraytest-build」が対象になりますので、それを選択し、画面中央部の「>」を押下して選択済みにします。

Configure Indexed Builds画面 (選択前)

選択されたことを確認して、「Save By Name」ボタンを押下し、設定を登録します。

Configure Indexed Builds画面 (選択後)

Indexed Resources画面に戻り、追加されたことが確認できます。

Indexed Resources画面 (設定追加後)

ステップ2: XrayスキャンのためのPolicyとWatchを設定する

PolicyとWatchとは

Xrayのスキャン設定では、「Policy」と「Watch」をそれぞれ設定する必要があります。 これらの考え方について、まず理解いただきたいと思います。

  • Policy: 1つ以上のルールからなる問題ありとする内容と、問題ありの場合の挙動をルールとして定義
  • Watch: チェックする対象と、チェックに利用するPolicyを定義

図に示すと以下のようなイメージで、Watchでチェック対象を、Policyで具体的なチェック内容を定義する形になります。

PolicyとWatchの関係

ステップ2-1: Policyを設定する

管理者(Administration)メニューの「Xray」> 「Watches & Policies」の順に進み、「Policies」タブの「Create a Policy」を押下し、Policyを作成します。

Watches & Policies画面 (Policyタブ)

Policyを以下の通り設定していきましょう。

Policy設定画面

  • Policy Name (必須): 任意の名前を設定します。例では「Sample-policy」としています。
  • Description: 説明が必要であれば記載します。
  • チェックに関するルールを追加するために「New Rule」(上図赤枠)を押下し、Policy Rules設定画面を開きます。

Policy Rule設定画面では、以下の通り設定していきます。

Policy Rule設定画面(上部)

  • Rule name (必須): 任意の名前を設定します。例では「Sample-rule」としています。(スペース入力不可)
  • Criteria: チェック結果として問題(Violation)ありとする内容を設定します。
    • Minimal Severity: JFrogの脆弱性データベースのSeverity(重要度レベル)で設定値以上の脆弱性が含まれている場合、問題ありとなります。(重要度レベルはAll Severities(すべて) > Low > Medium > High > Critical の順)
    • CVSS Score: 設定されたCVSSスコアの範囲を問題ありとします。(CVSSスコアはCVSS v3によるものです)
    • General viorations only when fixed versions are available: 脆弱性が修正されたバージョンが公開されていない問題は対象外とする場合、チェックを入れます。

Policy Rule設定画面(Automatic Actions)

  • Automatic Actions: 問題ありとなった場合に実行するものを選択します。

今回は例として、Minimal SeverityがMedium以上のものを問題ありとし、問題の有無は画面上で確認するものとして、Automatic ActionsはFail Build(ビルドが失敗したことを返却する)のみ設定することとします。

Policy Rule (Criteria設定例)

Policy Rule (Automatic Actions設定例)

  • 「Save」ボタンを押下し、Policy Ruleを登録。Policy設定画面に戻ります。

Policy設定例

最後にPolicy設定画面の「Create」を押下し、設定を保存します。 Watches & Policies画面に戻り、追加されていることを確認しましょう。

Watches & Policies画面(Policy追加後)

ステップ2-2: Watchを追加する

Watches & Policies画面の「Watches」タブを押下し、「Set up a Watch」を押下してWatchを追加します。

Watches & Policies画面 (Watchタブ)

Create New Watch(新規作成)画面が開きますので、以下の通り、設定を行なっていきます。

Create New Watch画面 (設定前)

特に、今回は以下の箇所を設定します。

  • ①Name (必須): 任意の名前を設定します。例では「Sample-watch」とします。
  • ②Description: 説明が必要であれば記載します。
  • ③Add Builds: 「+」を押下すると、Configure Selected Buildsモーダルが表示されるので、 ステップ1でIndexを設定したBuild (xraytest-build)を追加します。
    Configure Selected Buildsモーダル
  • ④Manage Policies: Manage Watch Policiesモーダルが表示されるので、ステップ2-1で設定したPolicy (Sample-policy)を追加します。
    Manage Watch Policiesモーダル

すべて設定が完了すると以下の通りとなり、「Create」ボタンを押下するとWatchが作成されます。

Create New Watch画面 (設定後)

ステップ3: Buildに登録済みの情報に対してチェック処理を実施する

ステップ0で確認したBuildに対して、ステップ2で設定した内容でチェック処理を行います。

設定前に登録されているBuildに対するチェックは、画面からの操作ができず、JFrog CLIやREST APIを使用して実施する必要があります。 今回はJFrog CLIを用いてチェック処理を行います。

ビルドを登録した場所から以下のコマンドを実施します。

% jf bs xraytest-build sample1-001
  • jf bsは、Buildに対してXrayのチェックを実施します。
    • bsは、Xrayのスキャンを実施することを指示しています。
    • xraytest-buildsample1-001は、ビルドを識別するために指定したオプションと同じ値を--build-name, --build-numberの順に指定します。

実行すると、実行結果として以下の結果を得ます。

02:38:42 [🔵Info] Scan of build xraytest-build is in progress
02:38:42 [🔵Info] Waiting for Build Scan to complete...
02:38:50 [🔵Info] The scan data is available at: https://*******.jfrog.io/ui/builds/xraytest-build/sample1ild/sample1-001/*************/xrayData?buildRepo=artifactory-build-info
The full scan results are available here: /var/folders/zw/qxc0r4_d3835x7bb6zhtxy3c0000gn/T/jfrog.cli.temp.-1661189930-2506192196
Security Violations
┌──────────┬────────────┬──────────┬───────┬──────────┬────────────┬────────────┬────────────┐
│ SEVERITY │ IMPACTED   │ IMPACTED │ TYPE  │ FIXED    │ COMPONENT  │ COMPONENT  │ CVE        │
│          │ PACKAGE    │ PACKAGE  │       │ VERSIONS │            │ VERSION    │            │
│          │            │ VERSION  │       │          │            │            │            │
├──────────┼────────────┼──────────┼───────┼──────────┼────────────┼────────────┼────────────┤
│ 🔥High   │ org.apache │ 2.14.1   │ Maven │ [2.12.2] │ com.exampl │ 0.0.1-SNAP │ CVE-2021-4 │
│          │ .logging.l │          │       │ [2.15.0] │ e:sample1  │ SHOT       │ 4228       │
│          │ og4j:log4j │          │       │ [2.3.1]  │            │            │            │
│          │ -core      │          │       │          │            │            │            │
├──────────┼────────────┼──────────┼───────┼──────────┼────────────┼────────────┼────────────┤
│ 🔥High   │ org.spring │ 5.3.20   │ Maven │          │ com.exampl │ 0.0.1-SNAP │ CVE-2016-1 │
│          │ framework: │          │       │          │ e:sample1  │ SHOT       │ 000027     │
│          │ spring-web │          │       │          │            │            │            │
├──────────┼────────────┼──────────┼───────┼──────────┼────────────┼────────────┼────────────┤
│ 🔥High   │ org.apache │ 2.14.1   │ Maven │ [2.12.4] │ com.exampl │ 0.0.1-SNAP │ CVE-2021-4 │
│          │ .logging.l │          │       │ [2.17.1] │ e:sample1  │ SHOT       │ 4832       │
│          │ og4j:log4j │          │       │ [2.3.2]  │            │            │            │
│          │ -core      │          │       │          │            │            │            │
├──────────┼────────────┼──────────┼───────┼──────────┼────────────┼────────────┼────────────┤
│ 🎃Medium │ org.apache │ 2.14.1   │ Maven │ [2.12.3] │ com.exampl │ 0.0.1-SNAP │ CVE-2021-4 │
│          │ .logging.l │          │       │ [2.17.0] │ e:sample1  │ SHOT       │ 5105       │
│          │ og4j:log4j │          │       │ [2.3.1]  │            │            │            │
│          │ -core      │          │       │          │            │            │            │
├──────────┼────────────┼──────────┼───────┼──────────┼────────────┼────────────┼────────────┤
│ 🎃Medium │ org.apache │ 2.14.1   │ Maven │ [2.12.2] │ com.exampl │ 0.0.1-SNAP │ CVE-2021-4 │
│          │ .logging.l │          │       │ [2.16.0] │ e:sample1  │ SHOT       │ 5046       │
│          │ og4j:log4j │          │       │ [2.3.1]  │            │            │            │
│          │ -core      │          │       │          │            │            │            │
└──────────┴────────────┴──────────┴───────┴──────────┴────────────┴────────────┴────────────┘
┌─────────────────────────────────────────────┐
│ No license compliance violations were found │
└─────────────────────────────────────────────┘
02:38:50 [🚨Error] One or more of the violations found are set to fail builds that include them

また、画面上でも同様の結果を確認することができるようになります。

まずBuildの一覧画面では、Xray statusが「Not Scanned」から「Critical」の状態になりました。

Build 「xraytest-build」の一覧 (設定・Xrayチェック後)

また、詳細画面の「Xray Data」タブ >「Violations」タブには、エラーとなった結果が表示されます。

Violationsタブの問題一覧 (Log4j脆弱性ありの状態)

この画面のCVE IDをクリックすると、さらに詳細の情報を得ることができます。 この情報には、すでに脆弱性への対応が完了しているバージョンがある場合はその情報を確認でき(赤枠部)、 修正対応を迅速に対応することができます。

脆弱性の詳細情報表示 (脆弱性ありの状態)

ステップ4: 脆弱性を修正して、ビルド実施とArtifactoryへの登録を実施する

以下のように、pom.xml内で Log4j のバージョンをしているしている箇所を、 「2.14.1」から表示されていた脆弱性が解消されたバージョンである「2.17.2」*1を利用するよう変更します。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>  <!-- 2.14.1 → 2.17.2 -->
</dependency>

その後、再度ビルドします。(build-numberは前回のビルドと異なることを示すsample1-002に変更しています。)

% jf mvn clean
% jf mvn install --build-name=xraytest-build --build-number=sample1-002
% jf rt bce xraytest-build sample1-002
% jf rt bp xraytest-build sample1-002

Xrayのテストがすでに完了しているので、上記のコマンドののち、すぐにスキャンが実施されます。 Xrayのスキャン結果は以下のようになり、Log4jの脆弱性は表示されなくなりました。

Build 「xraytest-build」の一覧 (Log4j脆弱性なしの状態)

Violationsタブの問題一覧 (Log4j脆弱性なしの状態)

上記のいずれのパターンでも検知されている脆弱性(CVE-2016-1000027)が残っています。 これはSpring Frameworkの脆弱性であり、今回利用したSpring Bootを利用したことで表示されています。

ステップ5: 問題に対する無視ルール(Ignore Rule)を作成する

チームでの脆弱性確認の結果、今回のコードでは影響がないと判断した場合、 Xrayの設定により、異常と扱われないように「無視ルール(Ignore Rule)」を 以下のように追加することで、除外することも可能です。

無視ルールの作成は、「Violations」タブに表示されている一覧で、 該当行を選択した際に表示される右側に表示されるアイコンを押下します。

無視ルールの作成 (赤枠部)

表示されるモーダル画面(Create Vulnerability Ignore Rule)で詳細を設定します。

無視ルールの詳細設定 (Create Vulnerability Ignore Rule)

  • Based on the Vulnerability: 無視対象の脆弱性に対する設定です
    • XRAY-XXXX: 対象の脆弱性を示すIDでXray内で管理されているもの(前の画面で選択した脆弱性)
    • For any Vulnerability: すべての脆弱性に対してのルールとする場合はこちらを選択
  • Based on the Component: 無視対象のOSSコンポーネントに対する設定です
    • Version ... : OSSコンポーネントの特定のバージョンに対してのルールとする場合はこちらを選択
    • Any Version ... : OSSコンポーネントの全てのバージョンに対してのルールとする場合はこちらを選択
    • For any Component: すべてのコンポーネントに対してのルールとする場合はこちらを選択
  • Based on the Build: 無視対象のビルド(build-name)に対する設定です
    • Version ... : ビルドの特定のバージョン(build-number)に対してのルールとする場合はこちらを選択
    • Any Version ... : ビルド全てのバージョンに対してのルールとする場合はこちらを選択
    • For any Component: build-nameに関わらずすべてのビルドに対してのルールとする場合はこちらを選択
  • Based on the Watch: 無視対象のWatch(Violationルールの一部)に対する設定です
    • Sample-watch : ルールに設定している"Sample-watch"に対してのルールとする場合はこちらを選択
    • For any Watch: すべてのWatchに対してのルールとする場合はこちらを選択
  • Add note(必須): 無視ルールの設定理由などの情報を記入するものです。(必須項目のため、指定しないとCreateボタンが活性化しません。)
  • The ignore rule will expire at: 無視ルールを期限付きにする場合はチェックを入れ、日付を設定します。

最後に「Create」ボタンを押下すると登録され、無視ルールに合致するものが「Violations」タブから削除されます。

Violationsタブの問題一覧 (無視ルール追加後)

なお、無視ルールを追加した場合でも、「Security」タブで検知された脆弱性を確認することができます。

Securityタブの脆弱性一覧

追加した無視ルールを編集・削除したい場合は、 管理者(Administration)メニューの「Xray」> 「Watches & Policies」の順に進み、「Ignore Rules」タブで対応できます。

Watches & Policies画面 (Ignore Rulesタブ)

まとめ

このブログでは、Artifactoryに登録したアーティファクト(ビルド)に対して Xrayがチェックを行うための設定と実際にチェックされた結果の表示がどのようになるか、 流れに従って説明しました。

今回はわかりやすい設定を中心に行いましたが、名前をパターンを使って指定することで汎化したりすることもできます。 また、画面を通して、細かい設定が可能であったり、チェック結果として 得られる情報が多くあることが感じていただければと思います。

Artifactoryへのアーティファクト登録を含めて是非お試しいただき、 不明点などがありましたら、弊社SNSや問い合わせフォームからお問合せください。

*1:Violationsに表示されているLog4jの問題4件は、「2.17.1」で解消(CVE-2021-44832のFixed Versionsによる)しており、記事執筆時点である2022年8月24日の最新バージョンである「2.17.2」にしました。