Amazon EKS上でTrendMicro DeepSecurity SmartCheckを試してイメージスキャンをやってみました

こんにちわ、札幌のヨシエです。
2019年ももうすぐ終わりに近づいてますが、振り返ってみるとコンテナに触る機会が多い一年だったと思います。
コンテナオーケストラレーションツールであるECSやEKSを始めとして、コンテナ用ツールも触ってきました。

その中でTrendMicro社が提供しているコンテナイメージの脆弱性スキャンツールとして提供されているTrend Micro Deep Security Smart Checkを触ってみたので使用方法と使った所感を書いてみます。

DeepSecurity Smart Checkはどういうものか?

冒頭で記載しているようにコンテナイメージの脆弱性スキャンを行ってくれるサービスとなります。

目玉機能として、EC2などのサーバーセキュリティで多くのユーザーに利用されているDeep Securityと同様にSmart Protection Networkから脆弱性情報を取得し、機械学習アルゴリズムを使用してコンテナイメージの脆弱性診断が行うことが出来ます。

Deep Security Smart Check receives up-to-date threat data from private Trend Micro endpoints. Smart Check obtains malware information from the Trend Micro Smart Protection Network™ and detects threats using Trend Micro XGen™ machine learning algorithms.

サポートしているレジストリサービス

サポートしているイメージレジストリとして以下のものをサポートしております。

事前準備

試用ライセンスを取得

Smart Checkを利用するためにはアクティベーションコードが必要となります。

検証作業のため以下URLの「体験版」から必要情報を入力することでアクティベーションコードがメール送信されます。

CI/CD パイプラインを保護 - Trend Micro Deep Security Smart Check | トレンドマイクロ

helmを使用してSmart Checkをデプロイする

k8sクラスターのリソース定義で使用するtillerをデプロイします。

kubectl create serviceaccount \
  --namespace kube-system \
  tiller

kubectl create clusterrolebinding tiller-cluster-role \
  --clusterrole=cluster-admin \
  --serviceaccount=kube-system:tiller

helm init --service-account tiller

以下のコマンドでtiller-deployがデプロイされていることを確認します。

% kubectl get deploy -n kube-system
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
coredns         2/2     2            2           7h45m
tiller-deploy   1/1     1            1           7h15m

次にSmart Checkをインストールするため、以下のコマンドを実行します。

helm install \
  --set auth.masterPassword={password} \
  --set activationCode={activation code} \
  --name deepsecurity-smartcheck \
  https://github.com/deep-security/smartcheck-helm/archive/master.tar.gz

コマンドが完了すると、初回ログイン情報を表示するコマンドとWebGUI URL情報を表示するコマンドが表示されるのでそれぞれ実行します。

初回ログイン情報コマンド

echo Username: $(kubectl get secrets -o jsonpath='{ .data.userName }' deepsecurity-smartcheck-auth | base64 --decode) ; 
echo Password: $(kubectl get secrets -o jsonpath='{ .data.password }' deepsecurity-smartcheck-auth | base64 --decode)
Username: administrator
Password: xxx

WebGUI URL表示コマンド

export SERVICE_IP=$(kubectl get svc proxy -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') ; echo https://$SERVICE_IP:443/
https://xxx.ap-northeast-1.elb.amazonaws.com:443/

上記、URLへアクセスすると以下のような画面が表示されるので、詳細設定を選択してログイン画面へ遷移します。

初回アクセス時に取得したログイン情報を使用して初回ログインを行い、初回パスワード変更を行います。

パスワード変更後、Smart Checkで脆弱性診断を行う対象レジストリサービスの登録画面へ遷移します。

以下の情報で初期設定を行いました。

  • Name:Smart Checkでの対象レジストリ管理名
    • 検証作業のため一時的にyoshie-ECRとしました
    • ここではどのレジストリサービスをチェックするか?であり、特定のリポジトリを指定するわけではありませんのでご注意ください。
  • Description:説明を記載
  • Registry Type:Amazon Elastic Container Registry(ECR)
  • Region:ap-northeast-1
  • Registry ID:対象レジストリが配置されているAWSアカウントID
  • Authentication Method:Instance Role
    • IAMユーザーとインスタンスに割り当てられているロールを選択できます
    • 便宜上、EKSクラスターに紐付いているノードインスタンスに割り当てられるロールがECRへのアクセス権限を使用していると考えられるため、Instance Roleを使用しております

上記を入力後にページ下部のNextを選択することで初期設定は完了です。

初回脆弱性スキャンを実施

初回脆弱性スキャンを実施してみます。

DashboardからRegistriesを選択します。

赤枠部分を選択して、スキャンを開始します。

ここではリポジトリが11つ見えていることになりますが、実際には登録されているイメージ全てをスキャンしますので多くのコンテナイメージが保存されているとスキャン完了まで時間がかかるので注意ください

スキャンが完了すると脅威に関する情報が表示され、各イメージ毎に脅威数のダイジェストが表示されます。

今回はこちらの記事でご紹介されているpiesecurity/apache-struts2-cve-2017-5638をテスト対象としてスキャンを行いました、上記の画面のsmartcheck-registry:latestを選択することで詳細なスキャン内容が確認出来ます。

以下の2点が表示され、上部はコンテナイメージのスキャン結果ダイジェストが表示、下部は各レイヤーごとの脆弱性情報が表示されます。

また、スキャン結果ダイジェストを選択することで検出された脆弱性情報の説明が表示されます。

最後に

事始めとしてk8s上にコンテナイメージスキャンまでをやってみました。

14つのイメージファイルはおおよそ3分程度でスキャンが出来たことスキャン結果からどのような脆弱性が存在するのかまでSmart Checkのみで確認することが出来ました。

今回は初期設定からスキャン完了までを行いましたがコンテナを利用する環境ではCI/CDに組み込んで使用することがあるのでもう少し調べてみたいと思います。