Snyk IaC で HashiCorp Terraform のクラウド設定ミスを防ぐ

本記事は 2021年3月13日にJim Armstrongが公開した英語ブログ [Prevent cloud misconfigurations in HashiCorp Terraform with Snyk IaC](https://snyk.io/blog/prevent-cloud-misconfigurations-hashicorp-terraform-snyk-iac/?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog) を日本語化した内容です。

[![logo-vertical-solid-background.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/dbece5e0-2af3-881d-2a48-c96f25d28d85.png)](https://snyk.io/jp?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog)

Terraform の設定ファイル作成、plan、 apply の実行をサポートするために設計された [Snyk Infrastructure as Code (Snyk IaC)](https://snyk.io/product/infrastructure-as-code-security/?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog) の新機能を紹介いたします。Snyk IaC を使うことで、設定をコーディングしながら、即座にセキュリティ設定に関するガイダンスが得られます。また、デプロイのパイプラインで  [Terraform の plan ファイル](https://www.terraform.io/docs/glossary.html#plan-file)をスキャンして、変更と設定全体が安全なことを確かめられます。さらに、何千ものファイルを扱う際の大幅なパフォーマンス改善、および、クレデンシャル情報などを守るためのセキュリティ改善も行いました。


## ライフサイクルを通じて Terraform の設定ミスを防止

これら Snyk IaC の新機能により、Terraform をその他の形式のコードのように扱って[シフトレフト](https://snyk.io/learn/shift-left-testing/?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog)することが可能になりました。 Terraform のライフサイクル全体に IaC のセキュリティを組み込むことができます。**Snyk IaC はコードが書かれた時点で、設定ミスを発見**します。また、クラウドや業界のベストプラクティスと組織のポリシーに基づいたフィードバック及びガイダンスをエンジニアに即提供します。Terraform モジュールがコミットされ、自動テストが開始されると、Snyk IaC は Terraform の plan ファイルをテストし、変更に関する総合的な一覧を表示します。また、デプロイ時に環境面の安全性確保を実現することで、デプロイ後のバグやリグレッションを防ぎます。

## クラウドの設定ミスに対して有効な Terraform の plan ファイルのスキャン

Snyk CLI では、Terraform や Kubernetes のファイルをローカルや CI/CD でスキャンし、構成を書く際、またコードリポジトリにおいて、即座にフィードバックを提供します。それは個々の変更に対してはうまく機能します。一方で、もしあなたがインクルード (include) したモジュールや変数の影響を含む、apply 予定のすべての変更をまとめて見たいのであれば、Terraform の plan ファイルをスキャンするとよいでしょう。

このリリースでは、Snyk CLI ワークフローが Terraform plan (tf-plan) ファイルのスキャンをサポートし、Plan結果が現在のクラウドインフラに新しいセキュリティ脆弱性をもたらすか検知可能になりました。Snyk IaC がどのように Terraform ワークフロー全体で使用可能かを示すために、Hashicorp の [Use Application Load Balancers for Blue-Green and Canary Deployments](https://learn.hashicorp.com/tutorials/terraform/blue-green-canary-tests-deployments?in=terraform/aws) チュートリアルのコードを使った例を実行し、Snyk IaC によるシンプルなローカル "write, test, plan, test, apply" ワークフロー を見てみたいと思います。

[ブルーグリーンデプロイメント戦略](https://snyk.io/learn/blue-green-deployment/?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog)についてもっと読むこともできます。

### <font color="DarkViolet">TERRAFORM のソースコードに含まれるクラウドの設定ミスに対するテスト</font>

テスト環境では、Terraformがインストール済みで、TerraformのコードはGitで管理されています。しかし、Snyk IaC を導入した以上、気になる問題がないか確認したいので、Snyk と GitHub リポジトリを連携し、その結果を Snyk コンソールで確認することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/e79e362c-eea9-1a41-aea3-4336230437f2.png)

深刻度が High (高) の問題はありません。しかし、`main.tf` をクリックすると、ロードバランサーが `HTTPS` ではなく `HTTP` を使用する設定となっていることに気がつきます。デフォルトではリスクが Medium (中) の問題ですが、私のセキュリティ チームは顔をしかめてしまいます。Snyk UI は、私のコードのどこに問題があるか、その影響、そしてその解決方法を示してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/4443c879-15d2-a838-786b-b0d254562855.png)

### <font color="DarkViolet">TERRAFORM のコード入力時におけるセキュリティスキャン</font>

Snyk IaC によって指摘された変更を Terraform ファイルに加え、ロードバランサーが HTTPS を使う設定としました。これには証明書の作成と使用も必要なので、さらに設定に追加しました。さて、変更をプッシュする前に、HTTPS の問題修正後に、新しい問題が発生しないことを確認するために、簡単なチェックを行いたいと思います。これはインターネット向けアプリケーションなので、私のチームと私は Snyk IaC から「ロードバランサーはインターネットへ公開されています」というアラートを見る必要がありません。 そのため、セキュリティ管理者に依頼して、設定をオフにしてもらいました。[Snyk IaC ならこの設定は簡単です。](https://support.snyk.io/hc/en-us/articles/360006402818-Configure-your-integration-to-find-security-issues-in-your-Kubernetes-configuration-files?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog)私の行う変更はすべて `main.tf` にあるので、変更をコミットする前にローカルでテストします。

``` shell
$ snyk iac test main.tf

Testing main.tf...


Infrastructure as code issues:

Organization:      purple-dobie
Type:              Terraform
Target file:       main.tf
Project name:      learn-terraform-advanced-deployments
Open source:       no
Project path:      main.tf

Tested main.tf for known issues, found 0 issues
```

完璧です。HTTPS の問題を修正し、セキュリティチームが「インターネットへ公開」チェックを無効にしたので、少なくとも `main.tf` では問題ゼロになりました。これで満足です。ついに、私の変更をデプロイする時が来ました。

### <font color="DarkViolet">パイプラインにある TERRAFORM の設定ミスをスキャン</font>

実際に変更を apply する前に、terraform plan を実行して変更内容を知る必要があります。Terraform の plan ファイルには全てのモジュールや変数の変更が含まれ、変更の影響をより詳しく把握できます。Snyk IaC を Terraform のライフサイクルに統合することで、実行した変更が他のモジュールの構成に影響を与えないことを確かめます。以下の例では、単純化するためにすべてをローカルで実行していますが、CI ツールにより自動化された plan とテストでの Snyk CLI 使用はとても簡単です。

``` shell
# generate a Terraform plan in JSON format:
$ terraform plan -out=tfplan.bin
$ terraform show --json tfplan.bin > tfplan.json

# And use Snyk to test the plan to see I caused any issues:
$ snyk iac test tfplan.json 

Testing tfplan.json...


Infrastructure as code issues:

Organization:      purple-dobie
Type:              Terraform
Target file:       tfplan.json
Project name:      learn-terraform-advanced-deployments
Open source:       no
Project path:      tfplan.json

Tested tfplan.json for known issues, found 0 issues
```

私の変更はうまくいっているようです。セキュリティに問題はありませんでした。ただし、 1 つだけ気になることがあります。私がテストしたのは[リソースの変更](https://www.terraform.io/docs/internals/json-format.html#plan-representation) (Snyk IaC のデフォルト) だけで、1つのファイル (`main.tf`) を編集しただけなので、この正常な結果は当然の結果です。しかし、Snyk IaC を使い始める前に、私の Terraform の設定はすでに apply 済みで有効化されていました。そのため、私はすべての [plan 結果](https://www.terraform.io/docs/internals/json-format.html#plan-representation)をチェックして、新しい変更だけでなく、Apply 済みの設定詳細も確認したいのです。

### <font color="DarkViolet">TERRAFORM の状態を取り込みクラウド設定ミスのチェックを拡充</font>

Snyk IaC の新機能 tf-plan には、plan 値をチェックする機能があります。 この機能を使うには、`-scan=planned-values` オプションで plan 値をスキャンするように指定するだけです。 CI で行うことを再びお勧めしますが、ここでは簡単のために CLI で行います。

``` shell
$ snyk iac test --scan=planned-values tfplan.json

Testing tfplan.json...

Infrastructure as code issues:
  ✗ Security Group allows open ingress [High Severity] [SNYK-CC-TF-1] in VPC
    introduced by resource > aws_security_group[this_name_prefix] > ingress[0]
.
.
.
  ✗ Non-Encrypted root block device [Medium Severity] [SNYK-CC-TF-53] in EC2
    introduced by aws_instance[blue] > root_block_device > encrypted
.
.
.

Organization:      purple-dobie
Type:              Terraform
Target file:       tfplan.json
Project name:      learn-terraform-advanced-deployments
Open source:       no
Project path:      tfplan.json

Tested tfplan.json for known issues, found 20 issues
```

おっと! 今回は 20 の問題があり、中には深刻度が High (高) の問題も混ざっています (上の出力では簡潔にするため、 High (高) の問題1つと medium (中) の問題1つを除いて省略してしています)。


### <font color="DarkViolet">モジュールと変数を含む TERRAFORM のスキャン</font>

この結果から、さらなる改善が可能ということが分かりますが、設定ファイルだけでなく tf-plan もスキャンした結果、他にも興味深いことがありました。この例における最初の git リポジトリのスキャンでは、これら深刻度 High (高) の問題は検出されなかった上、`main.tf` ファイルを編集した後に単体でスキャンしたときにも検出されませんでした。

これについて解説します。今回の構成では AWS プロバイダのモジュール と変数を複数使用しており、リポジトリや単一ファイルのスキャンではファイルを静的にチェックしています。そのため、ファイルで明示的に指定されているリソースについてのみ詳細がわかりますが、ファイル単体で見ただけでは、モジュールによってどのリソースが作成されるかはわからないのです。Terraform の plan ファイルでは、含まれるモジュールや変数からすべてのロジックを取り込んでくれるため、より完全な構成を把握することができます。

Terraform の plan ファイルをスキャンできるもう一つの利点は、Terraform のエコシステムツールも Snyk IaC と簡単に連携できるはずだということです。[Terraform Cloud](https://www.terraform.io/cloud)、[Terragrunt](https://terragrunt.gruntwork.io/docs/reference/cli-options/#all-terraform-built-in-commands)、[Atlantis](https://www.runatlantis.io/docs/using-atlantis.html#atlantis-plan) などのツールを使っているお客様がいますが、これらのツールは全て標準の Terraform の plan ファイルを出力しているので、Snyk IaC でスキャンすることができます。これらのエコシステムツールの例については、今後の投稿で取り上げる予定です。


## プライベートインフラのデータの機密を保持し、パフォーマンスを向上

上記の簡単な例でもわかるように、Terraform の plan ファイルをスキャンすることで、IaC の通常のライフサイクルで発生する多くの追加設定ミスのリスクをカバーできます。しかし、この段階でのスキャンは、あなたがネットワーク内に留めておきたい機密データに対して実行することにもなります。そこで、今回のリリースでは、Snyk CLI がローカルで IaC テストを実行し、Snyk 認証情報と CLI が生成したメタデータのみが Snyk に送信されるようになりました。この動作のために特別な手順や設定は必要ありません。これは Snyk IaC に組み込まれており、IaC 用の Snyk CLI の既定の動作です。

ローカルのスキャンによる利点がもうひとつあります。それは、速度が大幅に向上することです。これは、1 つの Terraform リポジトリに数百、場合によっては数千のファイルを持つお客様にとって特にインパクトのあるものです。私たち自身のテストでは、このような巨大なディレクトリをスキャンした場合、20 倍もの速度向上が見られます。

## Snyk IaC を無料で使う

これらの新機能は、無料の Free plan のユーザーを含め、誰でも試していただけます。また、簡単に使い始めることができます。

1. Snyk のアカウントをまだお持ちでない場合は、無料で[サインアップ](https://snyk.io/sign-up?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog)してください。

2. [Snyk CLI をインストール](https://support.snyk.io/hc/en-us/articles/360003812538-Install-the-Snyk-CLI#UUID-b346a6dc-682a-471f-bdc2-a82d8e5f8b6e?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog)します。すでに Snyk CLI をインストールしている場合は、これらの機能を利用するために CLI **1.594.0** 以降のバージョンをご利用ください。

3. Terraform と Kubernetes のファイルをスキャンします。
- 新機能使って IaC をスキャンするための主なコマンドは以下の通りです。
`snyk iac test <path-to-file-or-folder>`

  Snykがサポートする様々なスキャンオプションについては、[私たちのドキュメント](https://support.snyk.io/hc/en-us/categories/360001342678-Infrastructure-as-code?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog)、または CLI ドキュメントの実行 (`snyk iac --help`) で知ることができます。

- Terraform の plan ファイルをスキャンするには、上記の例や [Terraform のドキュメント](https://www.terraform.io/docs/cli/commands/show.html)にあるように、`terraform show` で取得できるJSONフォーマットの出力を生成する必要があります。

お客様のご意見をお聞かせください。すでに Snyk のお客様であれば、カスタマー・サクセス・チームが製品に関する良いフィードバック先となりますが、 [Snyk コミュニティ・フォーラムでのコメント](https://community.snyk.io/snyk/announcement-new-snyk-iac-features-for-terraform-4mdp-temp-slug-3134270?preview=5eccadfbdbc2c7ab9cf883127ac3482988f34698c2c6b7ebedbfdc0b32a6fb27d4b37dc569b217aa05f01cc9799fd913f95d0d0b0a9b728ae7f5fa28?utm_source=Qiita&utm_medium=Referral&utm_campaign=QiitaBlog)も歓迎します。

:::note info
ブログを読んで、Snykを使ってみたい！と思われた方は、ぜひ[無料トライアル](https://snyk.co/qiita)をお試しください。トライアル中の技術的なご質問は、[サポート](https://support.snyk.io/hc/en-us)に日本語でお寄せください。
:::

:::note info 
[Snyk](https://snyk.io/jp)では、セキュアなコーディングのための情報や脆弱性の最新情報などを発信しています。ぜひ[Twitter](https://twitter.com/snykjp)や[Facebook](https://www.facebook.com/snykJP/)や[ブログ](https://qiita.com/organizations/snyk)のフォローをお願いします。 
:::