わざと危ない設定にしたTerraformの不備をSnykで検出してみる【IaCセキュリティスキャン】

# はじめに
この記事は[Qiita Engineer Festa 2022 「Snykを使って開発者セキュリティに関する記事を投稿しよう！」](https://qiita.com/official-events/786b978e4a1a28fad312)というテーマに沿って投稿しています。

突然ですが、みなさんはインフラのセキュリティをどう管理していますか？インフラ監視ツールを使ったり、クラウドのセキュリティツールを使ってますか？

実際のインフラに対してこのようなモニタリング・セキュリティを実施するのもいいですが、実インフラへのスキャンはどれも時間がかかるものが多いです。しかしながら、Infrastructure as Code（IaC）でインフラ定義を行っている場合、もっといい方法があります。

それは静的にインフラ定義ファイルをセキュリティスキャンする方法です。これによって、コードをスキャンするのと同じ時間で、インフラをデプロイする前に問題が分かります。また、新しい脆弱性についてもすぐに判明するため、修正・デプロイのし直しを行うことができます。

そこで、今回はIaCとSnykのあわせ技でインフラを静的スキャンでセキュアにする方法をご紹介します。また、よろしければSnykによるコンテナセキュリティについて書いた[私の過去記事](https://qiita.com/cilto/items/c706c6064029cfeb2d62)についてもご覧いただければ嬉しいです。

# Infrastructure as Codeとは
その名の通り、Infrastructure as Codeとは、コードでインフラを定義すること、それによって実際にITインフラをコントロールすることです。

クラウドを使ったとしても、インフラの管理は非常に面倒な作業で、人の手で一個一個作ってしまうと、どの設定で何を作ったのか、どう管理するべきなのかという情報が抜け落ちてしまい、なかなかスケールしづらいものになってしまいます。

この一方で、IaCツールを使うと、インフラの管理が自動化ができ、その設定をコードで見ることができるため、再現性があるインフラを少ないコストで作ることができます。

その便利さの反面で、、誤った設定をIaCのコードで書いてしまうと、脆弱なインフラを作ってしまう事になってしまいます。何が難しいかというと、こういった誤った設定のコードはバグではないため、簡単には検出ができないということです。

実際にIaCのツールとしては、各クラウドベンダーがリリースしているCloud Formationなどがあるのですが、クラウドベンダーに関わらずに設定ができるTerraformというデファクトスタンダードとなるツールが存在し、本記事ではこのTerraformを使ったIaCをご紹介します。

## Terraformとは
HashiCorp社が提供するTerraformでは、様々なインフラ・クラウドベンダーに対応したモジュールを提供しており、IaCにおけるデファクトスタンダードのツールになりつつあります。

.tfという拡張子でコードを書き、その記述通りのインフラを作り、管理することができます。

また、オープンソースでGo言語で書かれているため、ベンダーロックインされるリスクがないことも魅力的です。

このTerraformを使用して、**わざと脆弱なインフラを作成**し、それをSnykで検知できるのかどうかを検証してみましょう。

# SnykでTerraformをセキュリティスキャン

Terraformの脆弱性についての一覧のスキャンリストは[こちらのリンク](https://snyk.io/security-rules/tags/Terraform)から見ることができます。かなり多くの脆弱性がカバーされていることがわかるかと思います。
特にクラウドベンダーにデプロイする場合には、該当のサービスの部分だけでも見ると参考になると思います。

## Githubとつなげて自動スキャンを行う

今回、わざと脆弱にしたIaCファイルとして、以下のTerraformファイルをGitHubにアップロードし、スキャンさせてみます。

```
resource "aws_lb_listener" "app" {
  load_balancer_arn = aws_lb.app.arn
  port = "80"
  protocol = "HTTP"

  default_action {
    type = "forward"
    target_group_arn = aws_lb_target_group.blue.arn
  }
}
```

このファイルの`protocol="HTTP"`の部分が[SNYK-CC-TF-47](https://snyk.io/security-rules/SNYK-CC-TF-47)に違反しており、HTTPによる通信を許可してしまうという、Mediumレベルの脆弱性があります。

そのため、Snykによるスキャンで引っかかるはずです。早速このファイルをスキャンするように設定してみましょう。

## ウェブUIでIaCスキャン設定
Terraformファイルをスキャンするには、設定からInfrastructure as codeの設定をオンにしている必要があります。まずはSnykの設定ギアアイコンをクリックして、「Infrastructure as code」設定を確認しましょう。
![Screen Shot 2022-06-19 at 13.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62311/10940920-b895-86a5-56a6-f8bd077e5845.png)


## プロジェクトを追加する
1. SnykのGUIにて、GitHubを接続します。こちらのステップは、[私の以前の記事](https://qiita.com/cilto/items/c706c6064029cfeb2d62)にて詳細に解説しています。
1. Terraformを含むレポジトリを「Add Project」から追加します。
![Screen Shot 2022-06-19 at 15.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62311/79a135e5-4c2f-906c-4daf-900ac9d59fad.png)

これでスキャン設定は完了です。レポジトリにPushがされるたびにスキャンが自動で走るようになります。
注意点として、無料で使用する場合には、レポジトリはPublicなものでないといけません。

## スキャン結果
それでは、レポジトリにコードをPushして、スキャン結果を見てみましょう。

実際に行った結果、１０秒ほどで以下のような画面になりました。
![Screen Shot 2022-06-19 at 15.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62311/9db67bdf-2962-59f5-8d13-94b6bcec630b.png)

しっかりと[SNYK-CC-TF-47](https://snyk.io/security-rules/SNYK-CC-TF-47)が検出できていました！該当コードまで分析できていることがわかります。
![Screen Shot 2022-06-19 at 15.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62311/78a3c401-2705-209a-bd47-9881e10152ce.png)

このように、Terraformによる設定不備についてしっかりとSnykでスキャン・検出ができることがわかります。また、どう修正すればいいかも指定してくれているので、かなり容易にIaCのコードをセキュアにすることができます。

# 最後に

インフラの設定不備というのは、なかなか分析・検出がしにくい、時間がかかる中、TerraformでIaC化されていれば非常に簡単に検出できるというのは、やはりいいですね！
IaCをどんどん進めようというモチベーションにもなりますし、修正も簡単なので導入コストもかなり低いので、開発者としてセキュリティに対する体験が劇的に変わっています。

ちなみに、今回はTerraformで行いましたが、AWSのCloud Formation等他のIaCツールにも対応しているため、幅広いツールに使えるようです。


# 参考文献
- [Snykの脆弱性データベース（全体）](https://security.snyk.io/)
- [SnykのTerraform脆弱性データベース](https://snyk.io/security-rules/tags/Terraform)
- [Snyk IaCの2022年に向けた方針](https://qiita.com/SnykSec/items/403e6d49e5f0927fccbb)
- [Snyk IaC で HashiCorp Terraform のクラウド設定ミスを防ぐ](https://qiita.com/SnykSec/items/d9f3d44c83c233446b2b)