要約: ベースイメージがどれだけ権威あるものであっても、次の 3 点は必須です。
- イメージで利用する上流のセキュリティ更新リポジトリが、正しく設定され有効化されていることを常に確認する。
- 最終的な業務用イメージには、
RUN apt-get update && apt-get upgrade -y(または同等の処理)を必ず含める。 - 自分たちで週次または月次の再ビルドを必ず定期実行する。
背景 #
- Docker 公式イメージ(DOI)の単一の正本は、https://github.com/docker-library/official-images の master ブランチです。ここでは「Library definition files」という形式で、どのリポジトリのどのタグを積極的に再ビルドするか、そして Dockerfile の所在(git リポジトリ URL と commit ID)を定義しています。これらの
repo:tagは現在メンテナンス中と呼ばれます。- 参照される Dockerfile の git リポジトリは、大半は Docker 社自身 が管理していますが、すべてではありません。例えば こちら。
- https://doi-janky.infosiftr.net/ の Jenkins ジョブは、すべての DOI の Dockerfile を解析し、DOI 間の最新依存関係を生成して https://github.com/docker-library/meta に保存します。
- これらのメタデータに基づき、DOI Dockerfile への PR がマージされるたびに、https://doi-janky.infosiftr.net/ でその下流 DOI(
FROMしているもの)すべてが再ビルドされ、Docker Hub へ push されます。- ただし、定期的な無条件再ビルドは保証されません。
観察 #
- Docker 社の DOI は Dockerfile に
RUN apt upgrade(または同等処理)を含めておらず、他の DOI ベンダーにもそれは必須化されていません。 - DOI ベンダーが Dockerfile に OS 更新ステップを入れていても、定期的な無条件再ビルドがなければ、セキュリティパッチ(存在する場合)は適用されません。
- DOI の中には、セキュリティ更新元がデフォルトで無効なディストリビューションを使うものがあります。例:
docker run --rm mysql:9.6.0 tail /etc/yum.repos.d/oracle-linux-ol9.repo。
したがって、現在メンテナンス中の DOI であっても、ビルド時点で CVE がないことは保証されません。よって、RUN apt upgrade(または同等処理)を含まない「実質 no-op の再ビルド」では何も修正されません。
参考: