Snyk IaC で AWS CDK はスキャンできる?

2022.08.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

結論:現時点では出来ません。しかし、間接的に行う方法はあります。

こんにちは、新規事業統括部 Profllyチームのおーしろです。

「デベロッパーファーストのセキュリティプラットフォーム Snyk」を利用したことはありますか?

Snykには現在 Snyk Open Source Snyk Code Snyk Container Snyk IaC Snyk Cloudなどのプロダクトがあり主にセキュリティに関する診断をすることが出来ます。

今回利用するSnyk IaCはInfrastructure as Codeをスキャンして修正アドバイスをしてくれるツールです。

現時点での対象のIaCツールは下記のようです。

  • HashiCorp Terraform
  • AWS CloudFormation
  • Kubernetes
  • Azure Resource Manager(ARM)

具体的には上記IaCツールのconfiguration filesがスキャン対象です。 そのため、TypeScriptなどで書かれたAWS CDKはスキャンすることは出来ません。

このように、IaCにAWS CloudFormationを利用しているけど、AWS CDKで構成管理しているというプロダクトは意外と多いのではないでしょうか。

Snyk IaCを利用したいけどAWS CDKを利用している、また、CloudFormationテンプレートをコード上に保持していない、といった場合にどのようにSnyk IaCを利用するかの一例を紹介したいと思います。

あらためてSnyk IaCとは

IaCの設定ファイルをスキャンし、設定ミスやセキュリティ上の問題点の修正アドバイスをしてくれるツールです。

公式ユーザーガイドは下記です。

https://docs.snyk.io/products/snyk-infrastructure-as-code

方法

今回は下記の手順で行ってみました。

  1. CloudFormationテンプレートを取得
  2. 取得したCloudFormationテンプレートをSnyk IaCでスキャン

1. CloudFormationテンプレートを取得

下記のシェルスクリプトは、AWS CLIを利用して、CloudFormationテンプレートを取得しています。 取得する対象のテンプレートをgrep 'voyager-'を利用してテンプレート名で絞り込みしています。

ちなみなvoyagerとはProfllyの開発コードネームです。

取得したテンプレートはmkdir $WORKING_DIRで作成したディレクトリcloudformation-templatesにダウンロードしています。

WORKING_DIR=cloudformation-templates
mkdir $WORKING_DIR
aws cloudformation describe-stacks --query 'Stacks[].StackName[]' | grep 'voyager-' | sed 's/    "//g' | sed 's/"//g' | sed 's/,//g' > stack_name_list.txt
cat stack_name_list.txt | while read STACK_NAME
do
  aws cloudformation get-template --stack-name ${STACK_NAME} --query 'TemplateBody' > $WORKING_DIR/${STACK_NAME}.json
done

2. 取得したCloudFormationテンプレートをSnyk IaCでスキャン

上記でCloudFormationテンプレートを取得できたので、あとはSnyk IaCでスキャンします。

今回、Snyk IaCはSnyk CLIで利用します。

Snyk CLIのインストール手順に関しては下記の公式手順をご参照ください。

https://docs.snyk.io/snyk-cli/install-the-snyk-cli

テンプレートをスキャンするためのコマンドは下記のようになっています。

snyk iac test

これを先程のシェルスクリプトに記載して下記のようになります。

WORKING_DIR=cloudformation-templates
mkdir $WORKING_DIR

aws cloudformation describe-stacks --query 'Stacks[].StackName[]' | grep 'voyager-' | sed 's/    "//g' | sed 's/"//g' | sed 's/,//g' > stack_name_list.txt

cat stack_name_list.txt | while read STACK_NAME
do
  aws cloudformation get-template --stack-name ${STACK_NAME} --query 'TemplateBody' > $WORKING_DIR/${STACK_NAME}.json
done

snyk iac test $WORKING_DIR

更に、スキャン結果をSnyk Web UI(SnykのWeb管理画面)に送信する場合は下記のオプションを利用します。

--report Snyk Web UIにスキャン結果を送信するオプション。

--target-name={プロジェクト名} Snyk Web UIでのプロジェクトの名称を設定できます。

その他のオプションは下記の公式ドキュメントをご参照ください。

https://docs.snyk.io/snyk-cli/commands/iac-test#options

snyk iac test --target-name={プロジェクト名} --report

留意点

Snyk Web UIでSnyk IaCを利用した場合はこちらのように修正の提案箇所をハイライト表示で確認できるのですが、Snyk CLIでSnyk IaCを利用しSnyk Web UIにスキャン結果を送信した場合は、Snyk Web UIでSnyk IaCを利用した場合のように修正の提案箇所を確認することは現時点で出来ません。

これは、公式ドキュメントにも記載があり、スキャン対象のファイル内容をネットワークを介して共有することが出来ないためとのことです。

そのため、AWS CDKを利用しており、CloudFormationテンプレートGit管理していない、という条件下でこちらのように修正の提案箇所をハイライト表示で確認したい場合は、他の方法で行う必要があります。

また、今回の方法ではすでにデプロイされているCloudFormationをスキャンすることになるので、シフトレフトは出来ていません。 cdk synthなどを利用してローカル開発環境やプルリクエスト時にスキャンを実施する方法も良いかもしれません。

おわりに

今回はプロダクトでAWS CDKを利用していて、CloudFormationテンプレートはGitなどで管理していない、それでもSnyk IaCを利用したい、という場合の一例を上げてみました。

作成したシェルスクリプトをGitHub Actionsなどと連携しCI/CDに組み込むことで継続的にセキュリティスキャンできる環境を構築できるかもしれません。