Docker公式イメージのセキュリティレビュー:何に気をつけるべきか #aqua #コンテナ #セキュリティ #dockerhub #イメージ管理
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本ブログは「Aqua Security」社の技術ブログで2021年8月24日に公開された「 A Security Review of Docker Official Images: Which Do You Trust? 」の日本語翻訳です。
Docker公式イメージのセキュリティレビュー:何に気をつけるべきか
安全なコンテナアプリケーションを構築するための重要な要素は、使用するベースイメージが適切にメンテナンスがされていて、安全であることを確認することです。一般的なアドバイスとして、Docker 公式イメージを使用することが挙げられます。しかし、一部のイメージは適切にメンチナンスがされていないためこれらのイメージを使用する際には注意が必要です。
Docker公式イメージとは
Docker 公式イメージは、Docker 社がホストするベースイメージのセットで、docker library プロジェクトと関連する上流組織によって維持されています。Docker CLI では、公式イメージはリストに OFFICIAL と表示され、Docker Hub 上では以下の rails コンテナイメージのページに示されるように、ステータスを示すバッジが表示されます。
また、Docker Hub の公式イメージセットは、pull する際にユーザ名を指定する必要がないため、簡単に見分けることができます。例えば、以下のコマンドは、Ubuntu の公式イメージに基づいてコンテナを作成します。
docker run -it ubuntu:20.04 /bin/bash
Docker公式イメージのスキャン
Docker Hub API を使って、167 個の公式イメージの説明文を取得しました。次に、Aqua の Trivy スキャナーを使って、セキュリティ上の脆弱性を分析しました。対象としたのは"latest"タグが付与されているもの、もしくは最終更新されたものです。
最初に気づいたことは、多くのイメージが古いバージョンの Debian や Alpine などの、サポートされていない OS を実行していることでした。これらを Docker Hub のページで確認したところ、公式イメージがサポートされなくなっているケースがありました。
これらの非推奨通知は、イメージの詳細ページでは確認できます。しかし、公式イメージのリスト上では通知がなく、非推奨のイメージが実際には更新されていないにもかかわらず、「最終更新日」の日付のみが変更されていることに注意する必要があります。例えば、非推奨の Django コンテナイメージは、リスト上では以下のように表示されています。
しかし、Django コンテナイメージの詳細ページを見ると、現在はメンテナンスされていないことがわかります。
非推奨の公式コンテナイメージの全リストは、この記事の最後に掲載していますので、参考にしてください。正式な非推奨通知があるコンテナイメージに加えて、大量の未対応の脆弱性があるにもかかわらず、正式な非推奨情報がないコンテナイメージも見つかりました。
以下の公式コンテナイメージは、Trivy の ignore-unfixed オプションでスキャンしたところ、50 個以上の未対応の脆弱性がありました。
- nuxeo:latest - 186個
- backdrop:latest - 173個
- kaazing-gateway:latest - 95個
- centos:latest - 86個
この中でも最も興味深いのは、一般的に使用されているベースイメージである CentOS イメージにも未対応の脆弱性が多く見つかった点です。
これはどの程度の問題なのか
この問題に対しての疑問は、これらの非推奨または脆弱なイメージがどの程度使用されているか、ということです。明らかに誰もイメージを pull していなければ、それが良いかは別として、大きな問題とはならないでしょう。
Docker Hub の API はダウンロード数を提供しているので、公式イメージの確認の際に pull 数を確認することで、どれだけのダウンロード数があったかを確認できます。7月29日から8月10日までの期間を見ると、非推奨か脆弱性のあるイメージのダウンロード数は以下のような結果でした。
これらのダウンロード数には自動化されたボットによるものもあるでしょうが、これらのコンテナイメージの一部は比較的頻繁に使用されているものであることは明らかです。
まとめ
今回の調査では、Docker Hub の公式イメージが永続的にメンテナンスされているとは思わず、使用するコンテナイメージを追跡することの重要性が示されました。
またコンテナセキュリティのベストプラクティスの1つとして、自分の組織のベースイメージのセットを、自分が管理するコンテナレジストリに保管し、組織のリスク許容度に応じて更新プロセスを管理することも大事です。
Appendix-Docker Hub公式上の非推奨イメージ
Image |
Notes |
java |
On Docker Hub, this redirects to the OpenJDK page, but in the docker CLI it pulls an outdated image. |
Django |
There is a deprecation notice pointing to the standard Python image. |
iojs |
There is a deprecation notice pointing to the node image. |
opensuse |
There is a deprecation notice pointing to opensuse/leap or opensuse/tumbleweed. |
ubuntu-debootstrap |
There is a deprecation notice pointing to the Ubuntu image. |
rails |
There is a deprecation notice pointing to the ruby image. |
celery |
There is a deprecation notice pointing to the Python image. |
glassfish |
There is a deprecation notice pointing to the glassfish/server image. |
hipache |
There is a deprecation notice but not a specific image noted as being correct. |
owncloud |
There is a deprecation notice pointing to owncloud/server. |
piwik |
There is a deprecation notice pointing to the matomo image. |
known |
There is a deprecation notice but not a specific image noted as being correct. |
sentry |
There is a deprecation notice pointing to getsentry/docker-sentry. |
jenkins |
There is a deprecation notice pointing to Jenkins/Jenkins:lts. |