依存性を識別するためのネイティブ実行可能ファイルへのSBOMの埋込み

ネイティブ・イメージは、ソフトウェア部品表(SBOM)を埋め込むことができます。SBOMは、アプリケーションを構成するすべてのコンポーネント、ライブラリおよびモジュールのインベントリです。これは、アプリケーションで使用されるすべてのオープンソース・ライブラリおよび独自ライブラリとそのバージョンに関する詳細情報を提供します。--enable-sbomオプションを使用して、SBOMをネイティブ実行可能ファイルに組み込みます。デフォルトでは、CycloneDX形式がサポートされています。(GraalVM Community Editionでは使用できません。)

前提条件

ビルド時にSBOMを生成

デモ・アプリケーションでは、jwebserverツールを使用して、埋込みSBOMを含むネイティブ実行可能ファイルとしてパッケージ化します。

jwebserverは、単一のディレクトリ階層から静的ファイルを提供するための最小限のHTTPサーバーで、JDKに含まれています。これは、Java 18で追加されました

  1. 次のコードをindex.htmlという名前のファイルに保存して、Webサーバーがコンテンツを提供できるようにします:
     <!DOCTYPE html>
     <html>
         <head>
             <title>jwebserver</title>
         </head>
         <body>
         <h2>Hello, GraalVM user!<p>
         </body>
     </html>
    
  2. index.htmlを保存したディレクトリから、次のコマンドを実行してネイティブ実行可能ファイルを作成し、SBOMを埋め込みます:
     native-image --enable-sbom=cyclonedx -m jdk.httpserver -o jwebserver
    

    -mオプションを渡すことで、ネイティブ・イメージは、JDKで提供されているjdk.httpserverモジュールからjwebserverをコンパイルします。これにより、GZIP形式の圧縮されたSBOMを含むネイティブ実行可能ファイルが生成されます。

  3. (オプション)コンパイルされたjwebserver実行可能ファイルを実行し、ブラウザでlocalhost:8000に移動します:
     ./jwebserver
    

埋込みSBOMの抽出

圧縮されたSBOMの内容を判読可能な形式に抽出するには、次の2つの方法があります:

Syft

Syft (syft)は、Anchoreによって管理されているオープン・ソース・ツールです。Syftは、ネイティブSyft形式またはCycloneDXの両方で表現可能な埋込みSBOMを抽出できます。GraalVMチームの貢献により、syftは、Linux、macOSまたはWindows用にビルドされたネイティブ実行可能ファイル内で指定されたSBOMを抽出できるようになりました。

ネイティブ実行可能ファイルでsyftを実行して、そのSBOMの内容を読み取ります:

syft jwebserver

これにより、含まれているすべてのJavaライブラリがリストされます。

ネイティブ・イメージ検査ツール

GraalVMネイティブ・イメージには、ネイティブ実行可能ファイルに埋め込まれたSBOMを取得するための検査ツールがあります。syftをインストールしない場合、検査ツールは使用可能な代替手段です。

次のコマンドを実行し、検査ツールを使用してSBOMの内容を読み取ります:

native-image-inspect --sbom jwebserver

これをさらに進めて、使用可能な脆弱性スキャナにSBOMを送信し、記録されたライブラリに既知のセキュリティ脆弱性があるかどうかを確認できます。脆弱性スキャナは、脆弱性データベース内のCVEを使用してSBOMにリストされているコンポーネントを相互参照します。

このガイドでは、サードパーティの依存関係に関連するリスクの評価に役立つように、アプリケーション・サプライ・チェーンに対するインサイトを取得する方法を示しました。ネイティブ・イメージは、ビルド時にSBOMをネイティブ実行可能ファイルまたは共有ライブラリに埋め込むことができます。