CIで簡単につかえるコンテナのセキュリティ診断｢Dockle｣

# はじめに

コンテナイメージのセキュリティ診断ツール｢[Dockle](https://github.com/goodwithtech/dockle)｣を正式にリリースしました。コンテナイメージから特に危険な項目をチェックするとともに、イメージに保存されているコマンド履歴をもとに[ベストプラクティスに沿ったコンテナイメージ](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)が作れているかも確認できます。

<img width="400" alt="docklelogo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/75066dfc-e467-677c-0bb8-82f078d1087e.png">
https://github.com/goodwithtech/dockle


# 導入まで
インストールしたら、あとはイメージ名を指定すればOKです。
他には何も用意する必要がありません。そう、Dockerすら不要です。

```
$ brew install goodwithtech/dockle/dockle
$ dockle [IMAGE_NAME]
```

[各OSでのインストール手順はこちら。](https://github.com/goodwithtech/dockle#installation)

プライベートレジストリにも対応してます。プライベートレジストリのイメージを利用する方法は[こちら。](https://github.com/goodwithtech/dockle#authorization-for-private-docker-registry)

`Dockle`の[公式イメージ](https://cloud.docker.com/repository/docker/goodwithtech/dockle/general)も用意してます。利用方法は[こちら](https://github.com/goodwithtech/dockle#docker)をご確認ください。

実行結果は、以下のようにでます。
問題なければ ｢PASS｣が表示されます。
![usage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14275/9294b50f-d1b3-90a3-2cc0-f924f8ca6270.png)

# 特徴

Dockleの特徴は以下のものです。

- 必要十分なチェック項目
    - CISベンチマークの項目に対応
    - ベストプラクティスの中でも重要なものに絞ってチェック
- シンプル
    - イメージ名指定するだけで良い
    - インストールするだけですぐに利用可能
- DevSecOps
    - CI/CDで利用しやすい

# チェックする項目

The Center for Internet Security(CIS)が提供している[CIS Benchmarks](https://www.cisecurity.org/cis-benchmarks/)のDockerに関する項目の中にある`Container Images and Build File`を主に利用しています。 これは、専門家により精査された、セキュリティでチェックすべき項目です。

その他にも、[Best practices for writing Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)の項目もチェック対象に入ります。

上の2つのどちらにもないけど、チェックしてくれるものもあります。

たとえば、先月Alpineのオフィシャルイメージで発見されたような、パスワードがないユーザがいると検知してくれる、などその他にもセキュリティで気になる項目をチェックします。
[CVE-2019-5021: Alpine Docker Image ‘null root password’ Vulnerability](https://blog.aquasec.com/cve-2019-5021-alpine-docker-image-vulnerability)

# 他ツールとの比較

類似ツールとして、セキュリティ診断ができる[Docker Bench for Security](https://github.com/docker/docker-bench-security) が、Dockerfileのベストプラクティスをチェックするツールとして[Hadolint](https://github.com/hadolint/hadolint)があります。

それぞれのツールでチェックできるCISベンチマークの項目は以下の通りで、Dockleがもっとも多くの範囲をカバーしています。

|  | [Dockle](https://github.com/goodwithtech/dockle) | [Docker Bench for Security](https://github.com/docker/docker-bench-security) | [Hadolint](https://github.com/hadolint/hadolint) | 
|---|:---:|:---:|:---:|
| 1.  Create a user for the container | ✅ | ✅ | ✅ |
| 2.  Use trusted base images for containers | - | – | - |
| 3.  Do not install unnecessary packages in the container | - | - | - | 
| 4.  Scan and rebuild the images to include security patches | - | - | - | 
| 5.  Enable Content trust for Docker | ✅ | ✅ | - |
| 6.  Add HEALTHCHECK instruction to the container image | ✅ | ✅ | - |
| 7.  Do not use update instructions alone in the Dockerfile | ✅ | ✅ | ✅|
| 8.  Remove setuid and setgid permissions in the images |✅ | - | - |
| 9.  Use COPY instead of ADD in Dockerfile | ✅ | ✅ | ✅|
| 10. Do not store secrets in Dockerfiles | ✅ | - | - |
| 11. Install verified packages only | -  |  - | - |


Dockleでカバーしていない、パッケージまわりの検知については、[Trivy](https://github.com/knqyf263/trivy)を利用することでカバーできます。 こちらもコミッタとして深く関わってます。

# DevSecOps

もともとCIでも手軽にチェックできるツールがほしいという出発点なので、CIで利用して、簡単にDevSecOpsを組むこともできます。

[Travis CIの設定はこちら](https://github.com/goodwithtech/dockle#travis-ci)
[Circle CIの設定はこちら](https://github.com/goodwithtech/dockle#circleci)

CIで利用する場合は、`dockle --exit-code 1 [IMAGE_NAME]` で問題があれば異常終了するようにしつつ、 `.dockleignore` で無視したい項目を設定することを想定しています。

# 最後に

今回ツールを作成するにあたり、類似のツールを大量に試しましたが、導入の簡単さも、チェックできる項目の範囲も、Dockleが一番だと自負しています。
ぜひお使いいただき、すてきなDockerLifeを送ってください。


気になる点があれば、Qiita上でコメントするか、[GitHub](https://github.com/tomoyamachi)や[Twitter](https://twitter.com/tomoyamachi)でコメントください。