Syftを使ってDockerイメージの依存関係をインデックスする方法
Syftは、コンテナ画像のソフトウェア部品表(SBOM)を生成するCLIユーティリティです。SBOMは、画像で使用される依存関係のカタログです。これにより、画像のファイルシステムを構成する「材料」を可視化することができます。
SBOMを生成することで、依存関係の混乱攻撃のリスクをもたらす過度に複雑なパッケージ供給チェーンを特定するのに役立ちます。SBOMをイメージと共に配布することで、ユーザーは基盤に何があるかを知ることができます。これは供給チェーンのセキュリティを強化する際の有用な出発点となります。
SyftはAnchoreによって開発されており、完全なコンテナスキャンエンジンも提供しています。Syft CLIは、人気のオペレーティングシステムやプログラミング言語を使用してイメージからパッケージリストを抽出できます。DockerおよびOCIイメージの両方がサポートされています。
Syftをインストールする
最新のSyftバイナリをダウンロードし、パスに追加するためのインストールスクリプトが利用可能です。
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
Macユーザーは、anchore/syftリポジトリを追加し、syftパッケージをインストールすることでHomebrewからSyftを取得することもできます。
システムにSyftをインストールしたら、ターミナルでsyftを実行して利用可能なコマンドを表示します。syft completionを実行することでシェルの補完を生成できます。
syft versionを使用して、インストールされているバージョンを確認してください。GitHubのタグページを定期的にチェックして新しいリリースを確認し、インストールスクリプトを再利用して各アップデートをダウンロードしてください。
画像をスキャンする
Syftの機能は現在、単一のサブコマンドsyft packagesによって提供されています。イメージタグを渡すことで、次のSBOMを生成します:
syft packages alpine:latestSyftは画像をダウンロードし、その内容をスキャンして発見されたパッケージのカタログを生成します。出力はターミナルのテーブルとして表示されます。各結果には、検出されたパッケージ名、バージョン、種類が含まれます。
このイメージのパッケージリストは短いです。これはアルパインベースのイメージで、インストールされているパッケージはできるだけ小さな表面積を提供するために意図的に簡素化されています。より大きなイメージには、数百または数千のパッケージがさまざまな形式で含まれている可能性があります。探しているデータを抽出するために、Syftを既存のUnixターミナルツール(grepやawkなど)と組み合わせると役立ちます。
syft packages example-image:latest | grep example-package-to-findサポートされているパッケージタイプ
Syftは、主要なオペレーティングシステムおよびプログラミング言語全体で多くの人気パッケージ形式をサポートしています。リストには次のものが含まれています:
APK(Alpine)、DEB(Debian)、およびRPM(Fedora)OSパッケージ。- Alpine、CentOS、Debian、およびRHELのLinuxディストリビューションの特定が好まれます。
- Goモジュール
- Javaの
JAR、EAR、およびWARバリエーション - NPMおよびYarnパッケージ
- Pythonホイールと卵
- ルビー バンドル
すべての言語がカバーされているわけではありませんが、アプリケーションの選択されたスタックに関係なく、OSレベルのスキャンによって依然として利益を得ることができます。
出力形式を変更する
デフォルトの出力形式は table と呼ばれています。これは、検出されたパッケージごとに新しい行を作成し、ターミナルに結果の列ベースのテーブルをレンダリングします。代替の人間が読める形式は text であり、各セクションの下に Version と Type フィールドをネストして、パッケージのリストを提示します。
Syftは、いくつかのプログラム形式もサポートしています。
json- パッケージデータをJSON構造に保存します。cyclonedx- XML形式のCycloneDXレポート。spdxとspdx-json- タグ値またはJSON形式のSPDX互換レポート。
これらのレポートのいずれかを使用すると、後で参照するために結果をファイルにアーカイブできます。
syft packages alpine:latest -o json > alpine-packages.json標準化されたCycloneDXおよびSPDXフォーマットは、SyftスキャンをCI/CDパイプラインに統合するのに役立ちます。このデータは、パッケージリストやSBOM結果と連携する他のエコシステムツールにもアクセス可能です。
Syftは、Anchoreのスタンドアロンコンテナファイルシステム脆弱性ファインダーであるGrypeとも統合されています。Syftからのデータは、JSON出力形式を使用すればGrypeに直接入力することができます。
syft packages example-image:latest -o json > sbom.json
grype sbom:./sbom.jsonGrypeは、パッケージリストを既知の脆弱性のインデックスと比較します。問題を含むパッケージを強調表示し、セキュリティ姿勢を改善するための即座の出発点を提供します。
他の画像ソースを使用する
Syftは、公開Dockerレジストリ以外の他のソースから画像を使用できます。レジストリタグまたは保存された画像tarを介して、OCI準拠の画像を参照できます。画像アーカイブへのパスを直接Syftに渡すことができます:
docker image save my-image:latest > my-image.tar
syft packages ./my-image.tarSyftはプライベートDockerレジストリとも連携します。あなたの既存の資格情報を~/.docker/config.jsonファイルで使用します:
{
"auths": {
"registry.example.com": {
"username": "",
"password": ""
}
}
}
Syftはコンテナイメージスキャンに焦点を当てていますが、任意のファイルシステムパスに対してSBOMを作成することもできます。一般的にソフトウェアのバイナリやライブラリを含むディレクトリをスキャンすることで、ホストのパッケージをインデックス化するためにSyftを使用できます。
syft packages dir:/usr/bin作業ディレクトリの外のパスを参照する場合は、dir: スキームを明示的に追加する必要があります。そうしないと、Syftはそれをイメージタグの参照として解釈しようとします。
結論
Syftはコンテナイメージからパッケージリストを抽出します。生成されたデータはあなたのイメージに対するSBOMとして機能し、サプライチェーンの長さに対する認識を高めます。
Syftは、複数の異なる形式でレポートを生成する単一のバイナリとして配布されています。これは、CI/CDシステムに容易に統合でき、イメージビルドパイプラインの一部としてSBOMアーティファクトをアップロードすることができます。これにより、各イメージの生成時の完全なソフトウェアリストを記録することで、責任が明確になり、監査証跡が助けられます。
Syftスキャンをワークフローに追加することで、使用しているパッケージの情報を把握できます。この情報を得たら、各パッケージが本当に必要かどうかを評価し始めることができます。もし、ワークロードで使用されていないパッケージが多く見つかった場合は、最小限のベースイメージに切り替え、その上に必要なソフトウェアのみをレイヤーすることを検討してください。



