IBM Cloud Container Registryの脆弱性アドバイザーによるチェック

# IBM Cloud Container Registryの概要

IBM Cloudでは、コンテナイメージの格納のサービスとして「IBM Cloud Container Registry」(以降、Container Registry）を提供しています。

Container Registryでは「無料」プランと「標準」プランが用意されています。「無料」プランでは、ストレージ：500MB、月あたりのpullトラフィック：5GBという制約はあるものの、文字通り無料で利用できることが特徴です。IBM Cloud Kubernetes Serviceをお試しで利用する場合に、ともに無料で利用できるのがよいですね。

一方、「標準」プランは完全な従量課金制で、利用したストレージ、pullトラフィックに応じて課金されます。1ヶ月あたり、ストレージ：500MB、pullトラフィック：5GBの無料枠が設定されており、それを超過した分に対して課金されるという形態です。


# Container Registryの脆弱性チェック機能

Container Registryには「脆弱性アドバイザー」(Vulnerability Advisor）という、コンテナイメージの脆弱性をチェックする機能が付いています。

脆弱性アドバイザーは、Container Registryにイメージがpushされたなどのタイミングで脆弱性のチェックを行い、コンテナイメージ内で脆弱性のあるパッケージが使用されていないかをチェックしたり、MySQL/nginx/Apacheが含まれる場合にその構成設定に問題がないかを検査します。

また、脆弱性アドバイザーで脆弱性が検知された場合に、IBM Cloud Kubernetes Serviceなどへのデプロイを自動的に却下するContainer Image Security Enforcementと連携することができます。

当記事では、Container Registryの脆弱性アドバイザーを実際に使ってみたいと思います。


# 脆弱性アドバイザー

Container Registryにイメージをpushし、どのような脆弱性が検出されるかを見ていきます。

IBM Cloud CLI、および、Container Registryプラグインを使用しますので、未導入の場合は [IBM Cloud CLIの概説](https://cloud.ibm.com/docs/cli?topic=cli-getting-started&locale=ja) を参照し導入してください。


IBM Cloudにログインします。

```
ibmcloud login -a cloud.ibm.com -r jp-tok
```

Container Registryのリージョンをセットし、ログインします。

```
# リージョンを設定
❯ ibmcloud cr region-set ap-north
地域は「ap-north」に設定されました。地域は「jp.icr.io」です。

OK

# ログイン
❯ ibmcloud cr login
「jp.icr.io」にログインしています...
「jp.icr.io」にログインしました。

OK
```

Container Registryに名前空間を作成します。作成済みの場合は、名前空間名を確認します。

```
# 名前空間の作成
ibmcloud cr namespace-add <名前空間名>

# 名前空間の一覧
ibmcloud cr namespaces
```


それでは最初は、IBM製のJavaアプリケーションサーバであるWebSphere Libertyのイメージを検査してみます。

```
# イメージをDocker Hubからpull
docker pull websphere-liberty

# Container Registryにpushするためタグを設定
# <Container Registryのホスト名>/<名前空間名>/<イメージ名>:<タグ>
docker tag websphere-liberty:latest jp.icr.io/<名前空間名>/websphere-liberty:1.0

# イメージをContainer Registryにpush
docker push jp.icr.io/<名前空間名>/websphere-liberty:1.0
```

脆弱性チェックの結果を見てみます。
[Container Registryのイメージ一覧のページ](https://cloud.ibm.com/kubernetes/registry/main/images)にアクセスします。

先ほどpushしたWebSphere Libertyは「問題なし」と表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/654656d4-5cf9-c0ed-609d-23c9537bde63.png)


それでは次に、nginxのイメージを検査してみましょう。

```
# イメージをDocker Hubからpull
docker pull nginx

# Container Registryにpushするためタグを設定
# <Container Registryのホスト名>/<名前空間名>/<イメージ名>:<タグ>
docker tag nginx:latest jp.icr.io/<名前空間名>/nginx:1.0

# イメージをContainer Registryにpush
docker push jp.icr.io/<名前空間名>/nginx:1.0
```

再度、[Container Registryのイメージ一覧のページ](https://cloud.ibm.com/kubernetes/registry/main/images)にアクセスします。
nginxの検査結果を見ると、7件の問題ありと表示されています。
詳細を確認するために、「7件の問題」の部分をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/e6cd5b41-b447-4fa3-b123-5da9e639d72b.png)

そうすると、以下のようなページで、イメージの検査結果の詳細を参照できます。
脆弱性は0件で、構成上の問題が7件あるという結果になっています。
nginxの設定の内容をチェックし、問題箇所を指摘してくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/602ae81e-5dd7-3b6c-7f1d-0e23ab6d997b.png)



なお、Web画面と同様の結果をCLIでも確認することができます。

```
❯ ibmcloud cr va registry.jp.icr.io/<名前空間名>/nginx:1.0
「registry.jp.icr.io/<名前空間名>/nginx:1.0」のセキュリティー問題を確認中...

イメージ「registry.jp.icr.io/<名前空間名>/nginx:1.0」の最終スキャン時刻は Sun Aug 16 15:03:02 UTC 2020 です。
 スキャン結果は、イメージに 7 件の問題が検出されたことを示しています。

検出された構成の問題
==============================

構成の問題 ID                                               ポリシー状況   セキュリティー対策                                  解決方法   
application_configuration:nginx.ssl_protocols               アクティブ     Enables the specified protocols.                    ssl_protocols is not present in   
                                                                                                                               /etc/nginx/nginx.conf or   
                                                                                                                               /etc/nginx/sites-enabled/default.   
application_configuration:nginx.ssl_certificate             アクティブ     Specifies a file with the certificate in the PEM    ssl_certificate is not present in   
                                                                           format for the given virtual server.                /etc/nginx/nginx.conf or   
                                                                                                                               /etc/nginx/sites-enabled/default.   
application_configuration:nginx.listen                      アクティブ     The listen port and protocol.                       The site does not use SSL since listen parameter   
                                                                                                                               does not contain ssl keyword.   
                                                                                                                               File: /etc/nginx/conf.d/default.conf   
application_configuration:nginx.ssl_certificate_key         アクティブ     Specifies the private key file for server cert.     ssl_certificate_key is not present in   
                                                                                                                               /etc/nginx/nginx.conf or   
                                                                                                                               /etc/nginx/sites-enabled/default.   
application_configuration:nginx.ssl_ciphers                 アクティブ     Specifies ciphers used in TLS.                      ssl_ciphers is not present in   
                                                                                                                               /etc/nginx/nginx.conf or   
                                                                                                                               /etc/nginx/sites-enabled/default. Defaults may not   
                                                                                                                               be secure.   
application_configuration:nginx.ssl_prefer_server_ciphers   アクティブ     Specifies that server ciphers should be preferred   ssl_prefer_server_ciphers is not present in   
                                                                           over client ciphers when using the SSLv3 and TLS    /etc/nginx/nginx.conf or   
                                                                           protocols.                                          /etc/nginx/sites-enabled/default. The strong   
                                                                                                                               ciphers preferred by server may not be selected.   
application_configuration:nginx.server_tokens               アクティブ     Enables or disables emitting nginx version in       server_tokens is not present. Default value is   
                                                                           error messages and in the Server response header    off. nginx will send its version in HTTP responses   
                                                                           field.                                              which can be used by attackers for   
                                                                                                                               version-specific attacks at this nginx server.   

OK
```

以上のように、Container Registryを利用することで、イメージの脆弱性も併せてチェックすることが可能になります。