そのコンテナは本当に安全？　GCP Container Registry のコンテナ脆弱性スキャンを試す

Google Cloud Platform の Container Registry はその名の通り、Docker イメージのレポジトリのサービスです。このサービスではイメージの脆弱性をスキャンする機能を利用することができます（ただし、この記事を執筆した時点では α 版です）。

セキュリティは様々な観点から守らなければなりませんが、こういったツールを適材適所で使っていくことでセキュリテイリスクを軽減できます。

ここでは、簡単な Flask の Web アプリのコンテナイメージを作成します。脆弱性があるかどうかを確認するまでの一連の流れを説明します。

### Container Registry の脆弱性スキャン機能を有効化する

以下の二つの設定を有効化する必要があります。

* Container Analysis API
* 脆弱性スキャン

設定方法は、公式ドキュメントの[Container Registry 脆弱性スキャン](https://cloud.google.com/container-registry/docs/vulnerability-scanning?hl=ja)をご参照ください。


### Docker イメージのビルド

ここからは Cloud Shell で作業します。Cloud Shell は管理コンソールの右上のアイコンから起動できます。Cloud Shell を使うことでブラウザ上のターミナルで各種作業ができるようになります。

![スクリーンショット 2018-08-15 22.27.06.png](https://qiita-image-store.s3.amazonaws.com/0/48133/93b568d3-966d-5a40-60fd-6b30446a7334.png)


「app.py」「Dockerfile」を以下の通り作成します。

```app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"
```

```Dockerfile:Dockerfile
FROM debian
RUN apt-get -qq update; \
    apt-get -qq -y upgrade; \
    apt-get -qq -y install \
        python \
        python-pip; \
    pip install flask
WORKDIR /src
EXPOSE 8080
COPY app.py /src
ENV FLASK_APP=app.py
CMD ["flask", "run", "--host=0.0.0.0", "--port=8080"]
```

イメージをビルドします。

```
$ docker build -t vulnerabilities-test .
```

### イメージの動作確認

イメージの動作確認をするために、コンテナを起動します。


```
$ docker run -d -p 8080:8080 vulnerabilities-test
```

Cloud Shell のターミナルの右上に「ウェブでプレビュー」ボタンがあります。

![スクリーンショット 2018-08-15 22.04.06.png](https://qiita-image-store.s3.amazonaws.com/0/48133/9874ca34-61e8-70f0-a872-59178f47afcc.png)

クリックし表示された Web ページで「Hello World!」と表示されていれば、イメージのビルドは成功です。

### イメージを Container Registry に push

次の流れでイメージを Container Registry に push します。

```shell
# 環境変数にプロジェクトIDを格納
$ export PROJECT_ID=$(gcloud config list project --format "value(core.project)")

# イメージに所定の命名規則で別名をつける
$ docker tag vulnerabilities-test gcr.io/$PROJECT_ID/vulnerabilities-test

# Container Registry に push
$ gcloud docker -- push gcr.io/$PROJECT_ID/vulnerabilities-test
```

### スキャン結果の確認

[Container Registry] → [イメージ名] と遷移すると、次の画面になります。脆弱性の列がスキャン結果のサマリです。なんか、いっぱいありますね・・

![スクリーンショット 2018-08-15 22.13.18.png](https://qiita-image-store.s3.amazonaws.com/0/48133/b76d9ba1-84f5-628a-7241-dd53b59049ec.png)

脆弱性の列（4 重大 + 246 その他と書かれているところ）をクリックすると、脆弱性ごとに一行ずつ表示され、概要を確認できます。

![スクリーンショット 2018-08-15 22.16.33.png](https://qiita-image-store.s3.amazonaws.com/0/48133/ae5adcc0-e82f-fa53-92d1-aa3a27987c3b.png)

### 最後に

脆弱性のスキャン自体は機能を有効化するだけなので簡単でした。そして、思った以上に脆弱性が検出されて驚きました。

セキュリティへの対応は計画的に開発、運用プロセスに組み込む必要がありますが、こういったツールもあるよということでご紹介させていただきました。ご参考までに。

### その他参考になりそうな文献へのリンク

コンテナのセキュリティに関しては、様々な文献があります。勝手ながら有用だと思ったものを紹介させていただきます。

・Google Cloud Platform Japan Blog
[コンテナのセキュリティ（第 1 回）: 3 つの主要領域](https://cloudplatform-jp.googleblog.com/2018/05/exploring-container-security-an-overview.html)
[コンテナのセキュリティ（第 2 回）: ノード イメージとコンテナ イメージ](https://cloudplatform-jp.googleblog.com/2018/05/exploring-container-security-Node-and-container-operating-systems.html)
[コンテナのセキュリティ（第 3 回）: Grafeas で管理するコンテナ イメージのメタデータ](https://cloudplatform-jp.googleblog.com/2018/06/exploring-container-security-digging-into-Grafeas-container-image-metadata.html)

・JAWS Days に登壇された方の資料
[コンテナを守る技術](https://speakerdeck.com/pottava/container-security-20180310)