Dockerのコンテナイメージに含まれるPythonとかの脆弱性チェックは、クラウドが使えるならDockerHubや、クラウドベンダ提供のECRとかが提供する機能で実施するだろう。
オンプレだと、OSSのTrivyを使うのが多いんじゃないかと思う。が、OSSなので使おうと言ったお前がTrivyに関する責任をすべて負えとか言われても困る事態があり得る。
最近気が付いたのだが、RHEL 8.2以降の機能としてコンテナイメージの脆弱性チェックというのが可能になっており、エンプラならとりあえずこれ使うのが無難なのか?と思ったので試してみた。
結論から書くと、RHEL経由ではなく独自に導入したライブラリ等がスキャンされていないんじゃ?という点がいまいちではあるが、それなり。
RHEL8ならドキュメントは以下。
RHEL8ドキュメント - 9.10. コンテナーおよびコンテナーイメージの脆弱性スキャン
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/security_hardening/scanning-container-and-container-images-for-vulnerabilities_scanning-the-system-for-configuration-compliance-and-vulnerabilities
RHEL9なら以下。
RHEL9ドキュメント - 8.10. コンテナーおよびコンテナーイメージの脆弱性スキャン
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/security_hardening/scanning-container-and-container-images-for-vulnerabilities_scanning-the-system-for-configuration-compliance-and-vulnerabilities
とりあえず試して見た環境はRHEL 8.3。
1. 必要なパッケージのインストール
openscap-utils、bzip2はドキュメントにも書いてあるが、最小インストールならwgetと、当然podmanもインストールが必要だろう。
# yum install -y openscap-utils bzip2 wget podman
2. 最新の定義ファイルを入手する
何と呼べばいいのかわからないが、最新のRHSA OVAL 定義ファイル?というのをダウンロードする。
# wget -O - https://www.redhat.com/security/data/oval/v2/RHEL8/rhel-8.oval.xml.bz2 | bzip2 --decompress > rhel-8.oval.xml
上記は、RHEL8用の定義ファイルだが、RHEL9ならそれ用がある。つまり、UBIがRHEL8か9ベースでダウンロードする定義ファイルが変わるという事か。
ファイルの中身を軽く見てみると以下のような感じで、定義ファイルの生成日付が埋め込まれている。
残りはCVEの脆弱性情報と対応するパッケージのバージョンの一覧か。
定義ファイルの容量は15MBくらいだが、まあ、まともに使うなら何世代か保管しておくものだろう。
...
<generator>
<oval:product_name>Red Hat OVAL Patch Definition Merger</oval:product_name>
<oval:product_version>3</oval:product_version>
<oval:schema_version>5.10</oval:schema_version>
<oval:timestamp>2022-07-12T07:40:49</oval:timestamp>
<oval:content_version>1657611649</oval:content_version>
</generator>
<definitions>
<definition class="patch" id="oval:com.redhat.rhba:def:20191992" version="635">
<metadata>
<title>RHBA-2019:1992: cloud-init bug fix and enhancement update (Moderate)</title>
<affected family="unix">
<platform>Red Hat Enterprise Linux 8</platform>
</affected>
<reference ref_id="RHBA-2019:1992" ref_url="https://access.redhat.com/errata/RHBA-2019:1992" source="RHSA"/>
<reference ref_id="CVE-2019-0816" ref_url="https://access.redhat.com/security/cve/CVE-2019-0816" source="CVE"/>
...
3. スキャンするコンテナイメージをpullする
とりあえず、rhel8/python-36で試してみたい。
https://catalog.redhat.com/software/containers/rhel8/python-36/5ba244fc5a134643ef2f04ba
イメージのタグは、記事作成時点で最新の「1-184」と、古そうな「1-24」で。
# podman login registry.redhat.io
# podman pull registry.redhat.io/rhel8/python-36:1-24
# podman pull registry.redhat.io/rhel8/python-36:1-184
4. スキャンしてみる
oscap-podmanコマンドでスキャンする。イメージ名じゃなくイメージID指定なのが若干面倒。
# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.redhat.io/rhel8/python-36 1-184 671aeba29482 3 weeks ago 851 MB
registry.redhat.io/rhel8/python-36 1-24 5bac20a7ed49 3 years ago 766 MB
# oscap-podman 671aeba29482 oval eval --report vulnerability_python-36_1-184.html rhel-8.oval.xml
# oscap-podman 5bac20a7ed49 oval eval --report vulnerability_python-36_1-24.html rhel-8.oval.xml
5. レポートを見る
生成された vulnerability~.html(1MB弱)を手元のPCにダウンロードして、Webブラウザで開く。
表示されるレポートは以下の通りで、新しい1-184には脆弱性が少なく、古い1-24には脆弱性がたくさんある。期待通りで、悪くない。
その他
わざわざRHEL8用の定義ファイルをダウンロードさせているからには、ベースイメージがUbuntuとかのスキャンには対応していない。。というか、かなり古いイメージも脆弱性0個とレポートを出してきて分かりにくい。
(docker.io/library/ubuntu:jammy-20211029)
それに、httpdとかphpとか、RHELがOSの一部として提供しているパッケージはカバーしていると思うのだが、そうじゃなく自前で導入した野良/epelのパッケージはスキャンしてなさそう。
そこまでRHELのツールに対応を求めるのは酷だし、サポート無しのOSS利用に躊躇が無いならTrivy使えば良い話だが。