Dockerコンテナの脆弱性を検知するClairを試す

2016.05.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。今回もDockerネタです。

DockerHubにCVEをベースにした脆弱性スキャン機能が追加されています。これをプライベート環境のコンテナレジストリでも実行したい!ということで、プライベート環境でも利用できるClairを試してみました。

Clairとは?

Clair はCoreOS社にて開発が行われている脆弱性スキャンができるツールです。スキャンはCVEを元に実施され、appcdockerコンテナ内に脆弱性がないかを静的スキャンを実施します。Clair自体もDockerコンテナで提供されます。

利用ケース1 - 手動での監査 -

インターネット上のサードパーティのコンテナ利用するとします。このとき、脆弱性を持ち込まないために脆弱性スキャンが可能となります。開発マシンにコンテナをpullしたタイミングで、Clairインスタンスを起動させます。local image analysis toolを使って解析します。解析した結果、選択したサードパーティコンテナには重要な脆弱性が含まれていたので別のイメージを利用するということができます。

利用ケース2 - 継続的インテグレーション -

継続的インテグレーションのプロセスにコンテナの脆弱性スキャン入れ、コンテナに危険な脆弱性があったらwebhookを送りデプロイを中止します。

アーキテクチャ

出典元

  • Clair自体は、Clairアプリ(コンテナ)とDBにはPostgresを利用
  • Clairは、CVEデータソースから脆弱性情報を取得する
  • スキャン結果をエンドポイントへ送信できる
  • スキャン対象はコンテナレジストリ。プライベートレジストリや、ECRを利用できる

Clairを初回起動時に、データソース(CVE)から脆弱性情報を取得しDBに書き込みます。脆弱性データを読み込むまで数分かかることもあります。初回起動以降は定期的に脆弱性データのアップデートが行われます。

やってみた

では、やってみます。

Clairを起動方法は複数あります。

  • Dockerコンテナ+PostgreSQL
  • ソースコードをビルドして利用
  • Kubernetes
  • Docker Compose(Clairコンテナ、PostgreSQLコンテナ)

今回は、お手軽なDocker Composeを利用してみます。

$ curl -L https://raw.githubusercontent.com/coreos/clair/master/docker-compose.yml -o $HOME/docker-compose.yml
$ mkdir $HOME/clair_config
$ curl -L https://raw.githubusercontent.com/coreos/clair/master/config.example.yaml -o $HOME/clair_config/config.yaml
$ vi $HOME/clair_config/config.yaml # database sourceに以下を指定 postgresql://postgres:password@postgres:5432?sslmode=disable
$ docker-compose -f $HOME/docker-compose.yml up -d

ClairとPostgreSQLコンテナが起動してきます。スキャンにはAnalyze local imagesを利用します。

インストール(Macの場合)

$ brew install go
$ mkdir /tmp/analyze
$ export GOPATH=/tmp/analyze
$ export PATH=$PATH:/tmp/analyze/bin
$ go get -u github.com/coreos/clair/contrib/analyze-local-images

スキャンする場合は、こんな感じで指定します。

docker images
analyze-local-images -endpoint "http://<CLAIR-IP-ADDRESS>:6060" -my-address "<MY-IP-ADDRESS>" <Docker Image ID>

今回は、boot2dockerを利用しているのでこんな感じで実行します。

$ local$ analyze-local-images -endpoint "http://192.168.99.100:6060" -my-address "192.168.99.1" "d0a31e3494fe"
2016-05-20 11:46:55.147595 I | Saving d0a31e3494fe to local disk (this may take some time)
2016-05-20 11:47:07.325546 I | Retrieving image history
2016-05-20 11:47:07.326316 I | Setting up HTTP server (allowing: 192.168.99.100)
2016-05-20 11:47:07.430074 I | Analyzing 4 layers...
2016-05-20 11:47:07.430111 I | Analyzing 768d4f50f65f00831244703e57f64134771289e3de919a576441c9140e037ea2
2016-05-20 11:47:07.466032 I | Analyzing 15de2499df739f6e6ddc165ab3616643c7ab16028d993b2106aee2f5ac5b72f9
2016-05-20 11:47:10.257210 I | Analyzing d73772fb2381ce6fccf595ed078527405bad04cc2036f476c3cab95854c02a26
2016-05-20 11:47:10.268528 I | Analyzing 9bc64297535bd68a7ff5f4022290d82bba8214f28c803c1b1c7e0bcf5b8b1205
2016-05-20 11:47:10.276559 I | Retrieving image's vulnerabilities
Clair report for image d0a31e3494fe (2016-05-20 02:47:10.286485008 +0000 UTC)
Success! No vulnerabilities were detected in your image

このイメージは問題ないようです。(今回は脆弱性があるコンテナに対していため試していないので、挙動に関しては要検証です。)

最後に

AWSでも、Inspectorがありますがコンテナレベルでもスキャンできるようになってきました。これからは、DevOpsにどんどんセキュリティも加わっていって、運用自動化+セキュリティ強化な時代がやってくると考えられます。手間をかけず、脆弱性の担保!!

参考