DockerHubで公開されているコンテナが安全か確かめてみた結果【人気のコンテナ上位800個】

# はじめに

Docker Hubに公開されているイメージはどの程度安全なのか、 [Dockle](https://github.com/goodwithtech/dockle) [![stars](https://img.shields.io/github/stars/goodwithtech/dockle.svg)](https://github.com/goodwithtech/dockle) と [Trivy](https://github.com/knqyf263/trivy) [![stars](https://img.shields.io/github/stars/knqyf263/trivy.svg)](https://github.com/knqyf263/trivy) を利用して検証しました。
検証結果は、 https://containers.goodwith.tech/ に公開しています。

![screencast24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/acf70181-514b-2029-ce01-63fc845edb5b.gif)

# 結論

基本的にどのコンテナにも脆弱性はある！
人気が高いコンテナ/最近ビルドされているコンテナでも関係ない！

ただ、Docker公式が用意しているコンテナは今のところ大丈夫。
より詳しいことを知りたい人は [操作方法](https://qiita.com/tomoyamachi/items/e0e69da521505e73237b#%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95) を見て、 https://containers.goodwith.tech/ を操作してみてください。

# 操作方法
![page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/f8668eab-200d-e242-2b19-ec0d8b18d975.png)

### ① ソートやフィルタが簡単にできます
![header-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/b11e337f-bc4b-e8e3-542c-82e76959fa3a.png)

※ Scoreは脆弱性のCVSSスコアなどを元にした参考値です。指標を一つに統一したかったので作りました。
ガチ勢の方々、怒らないでください & よりよい指標をつくるためのアドバイスをください。

### ② Dockle, Trivy というカラムを選択すると、JSON形式で詳細な情報が表示されます
![clickable-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/4c06fc5f-3a58-f2a2-d9dc-3d28284d2f6f.png)

### ③ JSONのロードが遅いときは｢JSON Detail｣のリンクからダウンロードできます
<img width="600" alt="jsondetail-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/0434a85f-962a-5d8d-2d5f-d5d3e5133b8d.png">

~~※ netlifyを利用してるんですが、特に大きいJSONファイルの取得が遅いので、解決方法を知りたいです~~
2019/8/19 now.sh利用に変更しました。大きいJSONファイルでの遅延も少なくなりました。

# 何がチェックできるの?

[CISベンチマーク](https://www.cisecurity.org/cis-benchmarks/)に沿っているかチェックできます。CIS(The Center for Internet Security)のセキュリティ専門家たちが発行している資料です。

![slide17](https://speakerd.s3.amazonaws.com/presentations/5dd14e96b7214a3aa099794a2899fe23/preview_slide_17.jpg?523478)

簡単に言うと、Dockleの列ではイメージの設計が正しくされているか、Trivyの列では脆弱性のあるパッケージが使われていないかをチェックできます。

その他にも、パスワードが設定されていないユーザのチェックなど、Linuxの基礎的なセキュリティもチェックします。
![original-checkpoint-comparison.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/305b4a39-6aa5-fcae-194f-e301c6989c08.png)

ただし、すべてのコンテナで警告が出てしまうので、｢latestタグはやめよう｣｢Content Trustを有効にしよう｣の2項目は無視しています。


# データの作り方

過去に記事にした [Dockle](https://github.com/goodwithtech/dockle) [![stars](https://img.shields.io/github/stars/goodwithtech/dockle.svg)](https://github.com/goodwithtech/dockle) と [Trivy](https://github.com/knqyf263/trivy) [![stars](https://img.shields.io/github/stars/knqyf263/trivy.svg)](https://github.com/knqyf263/trivy) を利用しています。
対象のコンテナイメージに対してそれぞれスキャンしていき、結果を集計しました。なお800個のコンテナを平行処理して1時間掛かりませんでした。


- Dockle関連記事
    - [3分でできる！最高のDockerfileを書いたあとにやるべき1つのこと](https://qiita.com/tomoyamachi/items/2397457f5d516a1fbc85)
    - [人を震えさせるツール｢Dockle｣の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に](https://qiita.com/tomoyamachi/items/8e042e4269427bb3b326)
- Trivy関連記事
    - [CIで使えるコンテナの脆弱性スキャナ](https://qiita.com/knqyf263/items/dc179f9223fc31b5a51c)
    - [フロントエンドでもTrivyを使って脆弱性対策したい！](https://qiita.com/tomoyamachi/items/e0394e9bcfeb90543e97)

なお、私はDockleの作者で、Trivyのメインコミッタの一人です。GitHub Starが増えると喜びます。

# フロントエンドやホスト環境は?
![reactnetlify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/a0612fdf-2d87-7b5a-0df7-87ec4770bc4b.png)
→現在は React + now.sh を利用してます。

メインで使っているライブラリは以下のものです。 
[Docker Meetup Tokyo #31](https://dockerjp.connpass.com/event/135043/)のLTに間に合わせるべく、画面のベース作成1日というギリギリのスケジュールだったためCreate React Appを利用しました。

- [Create React App](https://github.com/facebook/create-react-app)
- [ag-Grid](https://github.com/ag-grid/ag-grid) : テーブル

```
├── public : JSONや画像など
├── src : ソースコード
└── yarn.lock
```

~~フォルダ構成は現在このようになっており、すべてnetlifyでホストされています。
ただ、ファイルサイズが大きくなるとnetlifyだと極端に遅くなります。
特に脆弱性の数が多いJSONデータのロードで顕著です。解決策があれば教えてください。~~
2019/8/19 now.sh利用に変更しました。大きいJSONファイルでの遅延も少なくなりました。


# 脆弱性対策はどうすればいい?

[ここ](https://qiita.com/tomoyamachi/items/e0394e9bcfeb90543e97#trivy%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E9%81%8B%E7%94%A8%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB)や、[この記事の後半](https://qiita.com/tomoyamachi/items/2397457f5d516a1fbc85#%E7%B5%90%E6%9E%9C)でお伝えしたとおり、どのように向き合うかは、そのサービスの用途や求めるレベルによります。

ただ、Trivyで検出された脆弱性については、新しいOSにして新しいバージョンのパッケージを入れたら脆弱性は減るので、公開されているDockerfileを元に自らの手で書き直すことをおすすめします。

脆弱性についてより詳しいことが気になった人は、私も参加しているプロジェクト Vulsのチームが主催する ｢[既知の脆弱性はこう捌け！](https://futurevuls.connpass.com/)｣系の勉強会に参加すると、体系的に学ぶ事ができます。

# 最後に

最初に、Docker公式が用意しているイメージが今のところ大丈夫と伝えました。
しかし、いつ脆弱性が入るのかはわからないので、ビルドごとにイメージのチェックすることをおすすめします。実例として、今年の5月まで公式が用意したAlpine LinuxのイメージにRootユーザのパスワードが設定されていないという脆弱性がありました。

ローカルビルドの際に、すでにあるイメージを毎回参照していて、過去の脆弱性をそのまま使い続けている状況もありえます。ローカルでイメージを作成している人/コンテナのイメージをキャッシュから作成されている方は、特に一度スキャンすることをおすすめします。

なお、今後も https://containers.goodwith.tech/ に、ユーザーの入力したイメージ名からスキャンをするなど、機能追加していく予定です。 フッターにシェアボタン付けたので、シェアお願いします🙏