コンテナレジストリ（AWS ECR / AzureContainerRegistry）のスキャン機能を比較

# はじめに

コンテナのベースイメージのスキャンがしたいなーと思いまして、Azure・AWS両方触ってみました。時間がない方は「AWSとAzureのコンテナレジストリの特徴」「両者の比較」「さいごに」という部分だけお読みください。

まずはそれぞれのスキャンの特徴から。

# AWS ECR

2019年10月28日[Amazon ECR のイメージスキャンの通知](https://aws.amazon.com/jp/about-aws/whats-new/2019/10/announcing-image-scanning-for-amazon-ecr/)ということでAWSから発表されました。

* イメージスキャンにかかる料金は**無料**
* ECRにすでにプッシュしてあるイメージに対するスキャンが可能。
* pushをhookしてスキャンすることが可能
* スキャンが終わったら通知することが可能
    * [Events&EventBridge](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-eventbridge.html)

サービスを組み合わせることですでにあるイメージに定期的にスキャンできるのでゼロデイの脆弱性にも有効ですね。

# Azure Container Registry

ContainerRegistryについては以前書いたこちらの記事をどうぞ

* [Qiita - AzureContainerRegistryにprivateイメージをpushしよう](https://qiita.com/uzresk/items/f6fa479186c51dccaba1)

これについに2019年11月にスキャンする機能がついたわけです。

* [Azure Security Center でコンテナー イメージの脆弱性をスキャン](https://azure.microsoft.com/ja-jp/updates/scan-container-images-for-vulnerabilities-in-azure-security-center/)

AzureではQualysを使ったスキャン機能になります。

* イメージスキャンにかかる料金は**有償**
    * SecurityCenterがStandardである必要があるのと、1イメージにつき16.24円（東日本 3/17現在）かかります。
    * [参考：Security Centerの料金](https://azure.microsoft.com/ja-jp/pricing/details/security-center/)
* Pushされたタイミングでスキャンさせることが可能
* 1日に1回SecurityCenterの機能を使って設定したメールアドレスに重大な脆弱性については通知を行うことが可能。

[Azure Container Registry と Security Center の統合](https://docs.microsoft.com/ja-jp/azure/security-center/azure-container-registry-integration)に記載がありますが定期的なスキャンを行うにはCI/CDと組み合わせる必要がありそうですね。


# 準備

診断対象とするのは私が3年前に作ってdockerhubにpushしたイメージです。
何もメンテナンスしていないので大量に引っかかると予想されます。。。。
dockerデーモンを起動して、脆弱性たっぷりのイメージを落としておきます。

```
docker pull uzresk/demo:ver1.0
```

# AWS ECRでのスキャン

pushして即スキャンしてみようと思います。まずはリポジトリを作ってみましょう。プッシュ時にスキャンを選択しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/b6c08449-890f-9bb3-dc31-661dfd323b1a.png)

docker loginします

```
`aws ecr get-login --region ap-northeast-1 --no-include-email`
```

tagを付けてpushしましょう

```
docker tag uzresk/demo:ver1.0 xxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/demo:latest

docker push xxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/demo:latest
```

pushするとなんと速攻スキャンが終わってました・・・その数なんと141個

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/8f1592d2-6447-8d2f-a2af-f3bc1b047bfe.png)

詳細も見てみましょう。リンク張っておくから読んどけよ。って感じですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/5f1696c2-5954-1931-f965-f7767a934f51.png)


# Azure Container Registryでのスキャン

Azure Cliを使ってログインし、タグをつけてpushします。

```
az login
az acr login --name xxxxxxxxx
docker tag docker.io/uzresk/demo:ver1.0 xxxxxxxxx.azurecr.io/demo:latest
docker push xxxxxxxxx.azurecr.io/demo:latest
```

10分後・・・・セキュリティセンターを開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/39aad83e-52ab-0f77-317b-849b1db7f73d.png)

75件の脆弱性が検知できたみたいです。一覧を見るとパッチの有無なんかがでてて親切ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/58442f9b-9de4-00a4-2460-2478998896f9.png)

詳細も見ることができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/4eac4099-ab00-bbce-4514-00b9486c8270.png)


# 両者を比べると・・・

料金が無料であったり、速攻スキャン結果が出てくるのはAWSの魅力ですね。
Azureのよい面はパッチあり・なしがわかったりする点でしょうか。
今回のイメージに関しては脆弱性が発見された数はAWSのほうが多かったのですが、それが常にそうかはわかりません。

定期的なスキャンの仕組みはLambdaとかを組み合わせるとAWSのほうが簡単に作れるんじゃないかなという気がしました。CI/CDの仕組みがすでにあるのであればAzureでもAWSでも簡単に使えるのではないかと思います。

# 終わりに

ホストの脆弱性についてはAWS FargateやECSであれば自動で検知しホストを入れ替えたりすることができますし、これはAzureも同じでWebApp for Containerも自動でホストにパッチを当てたりしてくれます。

コンテナレイヤはこんなに簡単にスキャンができるとは思いませんでした。
定期的なスキャンの仕組みをいれてゼロデイに対する対策もしておきたいところですね。

両者ともにOSの脆弱性までのようです。ですのでアプリケーションのレイヤに関してはこれまで通りWAFの導入や定期的なアプリケーション診断などの対策が必要になる点は勘違いしないようにしてください。