経験則:
- イメージに適切なセキュリティ更新用のソースが設定されていることを確認します。これにより、
apt-get upgrade(または同等のコマンド)が何も行わない事態を防げます。 - Dockerfile に
RUN apt-get update && apt-get upgrade -y(または同等のコマンド)を含めます。 - 静的リンクされた Go 製プログラムが関係するまれなケースでは、
docker buildの一環として、そのプログラムを削除するかソースから再ビルドします。 - 独自の再ビルドを毎週または毎月実行するようスケジュールします。
背景 #
- Docker 公式イメージ(DOI)の信頼できる唯一の情報源は、https://github.com/docker-library/official-images の master ブランチです。ここでは「Library definition files」と呼ばれる形式を用いて、どのリポジトリのどのタグを継続的に再ビルドするか、およびその Dockerfile の場所(Git リポジトリの URL とコミット ID)を定義しています。これらの
repo:tagは、現在メンテナンスされているものと呼ばれます。- 参照先の Dockerfile の Git リポジトリは、すべてではありませんが大部分が Docker Inc. 自身によってメンテナンスされています。一例を参照してください。
- https://doi-janky.infosiftr.net/ の Jenkins ジョブが、すべての DOI の Dockerfile を解析して DOI 間の最新の依存関係を生成し、https://github.com/docker-library/meta に永続化します。
- このメタデータを使用し、DOI の Dockerfile に対してマージされた各 PR は、https://doi-janky.infosiftr.net/ 上で、その下流にあるすべての DOI(その DOI を
FROMしているもの)の再ビルドと Docker Hub へのプッシュをトリガーします。- スケジュールされた無条件の再ビルドは保証されていません。
観察結果 #
- Docker Inc. の 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 または同等のコマンドを実行しないもの)では、何も修正されません。
参考資料:
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)