Docker Security Scanningについて

こんにちは、Pythonエンジニア見習いです。
Docker HubのPythonの公式イメージのTagsを見ていたら、すべてのtagにおいて This image has vulnerabilities と書かれていることを発見しました。そのことについて調べたのでこのブログにまとめます。

なぜThis image has vulnerabilitiesとなっているのか

以下のリンクを見ると

How do I know the Official Repositories are secure?

Docker Security ScanningなるものによってDocker Hub上のOfficialリポジトリがセキュリティスキャンされていることがわかります。つまりそこで脆弱性があると判断された場合、This image has vulnerabilitiesと書かれることになります。

Docker Security Scanningの仕組み

registryにイメージがpushされた時にそのイメージの各レイヤー内のコンポーネント(特定のバージョンのパッケージ、例:glibc 2.19-18+deb8u7, bash 4.3-11+deb8u1)に対して、既知の脆弱性があるかどうかを検査します。その時、そのコンポーネントはバイナリレベルで確認され、そのレイヤー内でスキャンされたコンポーネントの情報は保存されます。WebUI上ではコンポーネントはgrid状になっている部分で表現されています。新たな脆弱性が発見された場合は該当するコンポーネントがどのレイヤーに含まれているかがわかるのでそのレイヤーを持っているイメージに脆弱性が含まれていることが再度全体をスキャンすること無くわかります。

詳細は以下のリンクを見てください。

Docker Security Scanning
[和訳]Docker Security Scanningを使いコンテナ内のライフサイクルを保護するには #docker

どうすればよいのか

stackoverflowにはすでにこれについて回答があります。ここでは脆弱性のある部分を使用しないようにするといった対策が挙げられています。例えば、library/pythonのコンポーネントの中にはcurl 7.38.0-4+deb8u5がありますが、そもそもそれを使用しなければ脆弱性を回避できるということです。つまりイメージを使用しようとした時、脆弱性の有無を確認し、脆弱性があるのであればその脆弱性のある部分を使用しないようなアプリケーションの設計にしなければならないでしょう。

Docker Hub内のOfficialイメージにはどの程度脆弱性があるのか

基本的にはほぼすべてのイメージに脆弱性があると思ってよいでしょう。これはほとんどのイメージがベースイメージにしているdebianのイメージに脆弱性がありそれが影響していることが原因の一つとして挙げられます。また脆弱性の含まれていないtagを見つける方法として

This image has no known vulnerabilities

と検索してみるといった方法があります。

この方法により、Docker Hub内の脆弱性の含まれていないタグのあるイメージを探してみました。調査結果(2017年5月5日現在)の一例を以下に示します。

ベースイメージにalpineを使っていることやホスト元がDockerだったりすることが脆弱性の含まれていないイメージの全体的な傾向です。

結論

Docker Hub内のOfficialイメージはDocker Security Scanningによってセキュリティスキャンが行われています。また、かなりの数のイメージに脆弱性が含まれていることもわかりました。対策方法としては脆弱性のあるコンポーネントを使用しないようにすることなどが挙げられます。