セキュアなDockerイメージを支援するClair

Clairは先日CoreOSがリリースした,オープンソースのコンテナ脆弱性スキャナだ。Dockerイメージのオペレーティングシステムと,それがインストールされたパッケージのどちらかが,セキュアでない既知のバージョンと一致しているかどうかをクロスチェックする。脆弱性情報は,各OSのCVE(Common Vulnerabilities and Exposures)データベースから取得する。現時点ではRed Hat, Ubuntu, Debianがサポート対象だ。

Clairはイメージのファイルシステムから静的情報を取得し,そのイメージを構成するさまざまなレイヤ間の差分リストを保持することによって,分析時間を大幅に削減すると同時に,潜在的脆弱性を持ったコンテナを実際に動作させる必要をなくしている。また,グラフストレージを使用することで,イメージを再度解析する必要なく,脆弱性を持った低レベルレイヤに依存するすべてのイメージについて,脆弱性の適切な識別を行なうことができる。

CoreOSでは,DockerHubと同じようなコンテナレジストリのQuay.ioにおいて,ユーザがアップロードするDockerイメージをClairで解析している。結果として,Quay.ioにあるイメージの大部分に脆弱性が発見されている。その中には,Heartbleed(80%)やGhost(67%)といったハイプロファイルのエクスプロイトも含まれていた。今年初めのDocker Hubの報告によれば,少なくとも公式イメージの30%,アップロードされたイメージの40%に,緊急度の高い脆弱性が含まれていた。一方でDockerはDockerCon EU 2015で,独自のイメージスキャンと脆弱性検出機能であるProject Nautilusおよびその他のセキュリティ関連機能を発表している。Nautilusはオープンソースではなく,Docker Hub内でのみ実行することができる。

マーケットにはその他にも,IBMのVulnerability AdvisorFlawCheckといったコンテナ用の脆弱性スキャナがある。主な違いは,それらがプロプライエタリであることだ。IBMの場合,同社のBluemixクラウドサービスにホストされたイメージのみが適用対象になる。IBMのソリューションでは基本的なセキュリティポリシ(“パスワードの有効期限は90日”といったような)もサポートされていて,静的なコード解析ツールと同じような方法で警告が行なわれる。

当然ながらこれらのツールは,悪用される可能性のあるパッケージの存在を特定するのであって,実際に悪用されていることを検証するのではない。また,実行時に脆弱性のあるパッケージをインストールするといったような,稼働中のインスタンスの動的な振る舞いを検出することもできない。

ClairはJSON APIを提供しているので,継続的インテグレーションや継続的デリバリのパイプラインの一部としてコンテナイメージを検査するために,ローカルで実行することが可能だ。

以下のスニペットでは,ローカルサービスとしてClairの初期化(デフォルト構成)を行なう。

$ git clone https://github.com/coreos/clair.git       
# clone the Clair repo from Github

$ cp clair/config.example.yaml clair/config/config.yaml  
# create an initial config file with default settings

$ docker pull quay.io/coreos/clair:latest         
# download a CoreOs container image with Clair installed

$ docker run -p 6060:6060 -p 6061:6061 -v clair:$PWD/clair/config:ro quay.io/coreos/clair:latest --config=/config/config.yaml 
# start service - make sure to wait for the initial list 
# of vulnerabilities to be fetched (message "updater: update finished")                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

パイプラインがデプロイ用にイミュータブルなDockerイメージを生成する場合,同じステージのセキュリティテストの一環として脆弱性スキャンが含めることで,パイプラインの停止が可能になる。“tmpimage”という名のDockerイメージの解析であれば,次のようになる。

$ go get -u github.com/coreos/clair/contrib/analyze-local-images 
# you need to have go installed

$ $GOPATH/bin/analyze-local-images tmpimage                      
# analyze-local-images is a wrapper script that analyzes 
# all layers in the image

上のスニペットは,イメージの任意のレベルにある高度(high)あるいは緊急(critical)レベルの脆弱性を検出する。各レイヤを抽出して個別にClairのAPIに送信することで,他の重要度レベルを指定することも可能になる。

次の処理を実行すれば,ひとつのレイヤに対するすべての脆弱性(無視可能/Negligibleから緊急/Criticalまで)をリストアップして,その内容を別途分析することが可能になる。

$ curl -s -H "Content-Type: application/json" -X POST -d \
'{
    "ID": "39bb80489af75406073b5364c9c326134015140e1f7976a370a8bd446889e6f8",
    "Path": "/tmp/docker/layers/39bb80489af75406073b5364c9c326134015140e1f7976a370a8bd446889e6f8.tar"
}' \
127.0.0.1:6060/v1/layers
# submit layer for Clair to analyze and store in DB

$ curl -s "127.0.0.1:6060/v1/layers/39bb80489af75406073b5364c9c326134015140e1f7976a370a8bd446889e6f8/vulnerabilities?minimumPriority=Negligible" | python -m json.tool > all_vulnerabilities.json
# retrieve all vulnerabilities found in the layer

CoreOSも先日,同社のコンテナ・アズ・ア・サービスであるTectonic用として,DTC(Distributed Trusted Computing)を発表している。DTCはアプリケーションレイヤからコンテナ,オペレーティングシステム,ハードウェアに至るまで,フルスタックの暗号化チェーンを確立する。