Snyk IaC で AWS CDK はスキャンできる?
結論:現時点では出来ません。しかし、間接的に行う方法はあります。
こんにちは、新規事業統括部 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
方法
今回は下記の手順で行ってみました。
- CloudFormationテンプレートを取得
- 取得した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に組み込むことで継続的にセキュリティスキャンできる環境を構築できるかもしれません。