JFrog Japan Blog

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

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

JFrog Xrayを利用したオープンソースソフトウェア(OSS)脆弱性スキャン

はじめまして!2022年6月にDeveloper AdvocateとしてJFrogに入社しました、佐藤です。
「よしQ(よしきゅー)」として覚えていただければうれしいです。

日本ではまだまだ進んでいないと感じるDevOpsに関する発信を通して、
日本のエンジニアの皆さんが今よりもハッピーになれるような環境ができればいいなと思っています。
DevOpsを支えるJFrogのプロダクト共々、どうぞよろしくお願いします!

JFrog Xrayの脆弱性スキャン

このブログでは、「JFrog Xray」の機能である脆弱性スキャンを取り上げます。
JFrog Xrayの脆弱性スキャンは、簡単にいうと、

  • JFrog Artifactoryに保存されたアーティファクト(バイナリファイル)から
  • それに含まれるオープンソースソフトウェア(OSS)の脆弱性の有無
  • 一般に広く公開されている脆弱性情報(+JFrog独自の情報)に基づいて解析・診断をし
  • 検知結果を表示してくれる

といったものです。

また、JFrogの製品はユニバーサル性を意識しており、Xrayもさまざまな言語・パッケージマネージャに対応しています。
ユニバーサル性を含めたXrayの詳細は以下をご覧ください。 www.jfrog.com

この脆弱性スキャンの機能はJFrog Platform の無料版を用いて誰でも利用できます。
本記事では無料クラウド版を用いて、実際にどのように行われるのかをご覧いただきたいと思います。

サンプルコードを使ったシナリオ

2021年末、Java開発でよく用いられるOSSのロギングライブラリ「Apache Log4j」の脆弱性は非常に話題になりました。
現在はすでに脆弱性に対応されたものが配布されていますが、当時Java開発に関わられていた方の中にはこの対応に追われた方もいるのではないでしょうか。

この脆弱性に関して、今回の以下のシナリオでXrayを使ってみました。

  • Apache Log4j の脆弱性が含むライブラリ(2.14.1)を用いた状態で脆弱性を確認する
  • Apache Log4j の脆弱性対応が済んだ最新のライブラリを用いた状態で脆弱性を確認する

環境は以下の通りです。

  • Java 17.0.3
  • Maven 3.8.5
  • Spring Boot 2.7.0
  • JFrog CLI 2.18.2

JFrog CLIは、JFrog ArtifactoryやJFrog XrayといったJFrog製品に対して、
コマンドライン(jfコマンド)を用いて操作する際に使います。
インストール方法は以下を参照ください。 (お使いの環境に合わせた方法で、簡単に導入いただけます。) www.jfrog.com

なお、サンプルコードとして、以下を用いています。 github.com

実際にJFrog Xrayで脆弱性スキャンを行う

スキャンを行う前に

ローカル環境にサンプルコードをダウンロードし、 ArtifactoryとXray の設定をもろもろ行います。
Xrayを使うためには、ビルドで生成されたアーティファクト(この場合はJarファイル)をArtifactoryに登録する必要があり、
Xrayのスキャンにも、スキャンの対象や通知の対象とする「脆弱性のレベル」の設定があったりします。

詳細な設定方法は別のブログで紹介したいと思いますが、
ここでは 「脆弱性のレベルがMedium以上」 を表示するよう設定し、結果を確認します。

Xray設定(Policy設定)

脆弱性を含む場合

以下のコマンドを実行し、Artifactoryにアーティファクトを登録します。

# 1. targetディレクトリを削除
jf mvn clean

# 2. jarの生成&Artifactoryへ登録
jf mvn package --build-name=xraytest-build --build-number=sample1-001

# 3. Artifactoryに登録するbuild info(アーティファクトの詳細や依存関係、環境変数などの情報)を収集する
jf rt bce xraytest-build sample1-001 

# 4. Artifactoryにbuild infoを登録
jf rt bp xraytest-build sample1-001

上記の1.、2.はjfコマンドを使っているものの、その後に続くmvn cleanmvn packageは、
Mavenを利用している人には馴染みのあるコマンドが続いているかと思います。
(Mavenに関しては、普段使っているものをコマンドの形式で利用できるものが多くあります。)
特に2.ではbuild-namebuild-numberとオプションが続いていますが、
どのタイミングでのビルドかを記録しておくことができます。
この場合は、Xrayを行う対象をあらかじめ設定したビルドの名称(xraytest-build)をbuild-nameとして設定し、
ビルドタイミングの識別子としてbuild-numberを使っています。

3., 4.はArtifactoryに関するコマンドで、3. では、ビルドした際の環境の状況を収集し、4. でその情報をArtifactoryに送付します。
スキャンは4.が行われて後に実行されます。

スキャンが完了後、Build情報で以下のようにXrayのスキャン結果が確認できます。

脆弱性を含む場合のXray結果

"Violations"タブにルールに基づいて検知された脆弱性が一覧されます。
公開されている脆弱性のID(「CVE」から始まるコード)、脆弱性のレベルなどが表示されていることがわかります。
1〜4行目は今回意図した Apache Log4j の脆弱性が表示されており、IDをクリックするとその詳細を確認することができます。

脆弱性の詳細の確認

例えば、詳細に表示されている"Fix version"は、この脆弱性に対する対応が行われているバージョンが示されており、
脆弱性に対する参考情報も得ることができます。

脆弱性対応済みの場合

以下のように、pom.xml内で Log4j のバージョンをしているしている箇所をコメントアウトし、
最新の脆弱性対応が完了されているものを利用するよう変更します。

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

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

# 1. targetディレクトリを削除
jf mvn clean

# 2. jarの生成
jf mvn package --build-name=xraytest-build --build-number=sample1-002

# 3. Artifactoryに登録するbuild info(アーティファクトの詳細や依存関係、環境変数などの情報)を収集する
jf rt bce xraytest-build sample1-002

# 4. Artifactoryにbuild infoを登録
jf rt bp xraytest-build sample1-002

Xrayのスキャン結果は以下のようになり、Log4jの脆弱性は表示されなくなりました。

脆弱性対応済みの場合のXray結果

脆弱性スキャンから特定のものを無視する

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

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

Xray無視ルールの設定

ルールを追加した上で、スキャンを再実行してみます。

Xrayで再度実行

再スキャン結果では、「Violations」タブから脆弱性が削除されました。

無視ルール追加後のXrayスキャン結果

異常とは扱われませんが、スキャンの結果として「Security」タブには、 脆弱性が存在することを確認することができます。

無視ルール(Ignore Rule)で除外してもスキャン結果で出る

脆弱性スキャンを利用するメリット

ここまで、スキャンができること、どのように確認できるかを挙げてきましたが、
この脆弱性スキャンを利用することで、どんなメリットがあるでしょうか。

開発途中で発見するメリット

開発者は普段、効率よく開発を行うために外部リソースを活用します。
今回のシナリオで利用した Log4j は利用者が非常に多いものであったため、大きく報道されましたが、
全てのOSSの脆弱性が大きく取り上げられるかというと、そうではありません。

Xrayのスキャンのように、一般に公開されている情報をもとに機械的に解析するツールを用いることで、
開発者は意図していなかった脆弱性に対しても早期に認識することができます。
特に、ビルド工程が行われたバイナリファイルを作った後に行われることといえば、QA工程。
XrayのスキャンによってQA前に検知が可能となり、手戻りを最小に抑えることができるでしょう。

本番稼働時に発見するメリット

本番稼働しているということは、すでに開発側から運用側に渡っている状態です。
運用側にはどんなメリットがあるでしょうか。

例として本番稼働しているものを、定期的にスキャンを再実行する場合を考えます。
この際、もし脆弱性が検知された場合は、運用側も画面から確認することができます。
運用側は開発時にどんなOSSを利用しているかまで抑えていない場合も、
開発側に問い合わせずとも脆弱性の有無を早期に確認できます。
また、開発者にとっても同じ画面で課題が確認できるため、対応も素早く開始できるでしょう。 (なお、スキャンの定期実行はWeb UIからは設定はできません。
実際にはCronなどでJFrog CLIをコマンドを定期的に呼び出すことで実現できます。)

まとめ

JFrog Xrayによる脆弱性スキャンについて、サンプルコードを用いた例を含めてご説明しました。
このブログで説明できていない設定については、今後のブログのなかで紹介していきたいと思います。

JFrog Platform は DevOps をサポートするためのプラットフォームであり、今回挙げたのはほんの一部の機能です。
最後にメリットとして挙げたような、開発側・運用側共に負荷軽減になるような仕組みが存在しますので、
是非ご活用いただければと思います。