Snyk IaCコマンドを使用してTerraformのIaC環境を管理してみた

# はじめに
昨今、IaC（Infrastructure_as_code）にてインフラストラクチャをコードにして管理することが多くなってきたと思います。
その際に直面する問題をSnykで解決しようというのが今回の記事です。

## どんなことを解決したいか
IaC化したクラウドプラットフォームにおいて、リソース変更権限が付与されている開発者が設定変更した内容がIaCに落とし込めていないと
**コード管理されていない作業**と**IaC管理されているリソースの設定**の間で差分が発生してしまいます。
その変更履歴を管理する運用ができていないと、サーバ運用保守者がIaC再デプロイする際に手動の設定変更が消去されてしまうため、　IaCデプロイ前に差分を確認する手段を探していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612700/b5f3358d-e0c6-70b0-9422-6f11c44a08d6.png)



## [Snyk](https://docs.snyk.io/what-is-snyk)とは
ソフトウェア開発プロジェクトでのカスタムコード、オープンソースソフトウェア、コンテナ、IaCの脆弱性をリアルタイムで検知するセキュリティソリューションです。
Snykの脆弱性データベースはAWSにおいても採用されており、[Amazon Inspector](https://aws.amazon.com/jp/inspector/partners/)のテクノロジーもSnykを利用しています。
以下の4機能から構成されます。


* **脆弱性の検出**
    * アプリケーションの依存ライブラリやコンテナイメージ内に含まれるセキュリティ脆弱性をスキャンし検出します。

* **自動修正**
    * 検出した脆弱性を解決するためにパッチ適用や安全なバージョンへのアップデートを提案し場合によっては自動修正を実行します。

* **ライセンスリスクの管理**
    * アプリケーションで使用されるオープンソースライブラリのライセンスに関連するリスクをチェックします。

* **CI/CDパイプラインとの統合**
    * CI/CDツールに統合し、開発プロセス内でセキュリティチェックを自動化します。

* **コードのセキュリティ**
    * 自社のコードベースのセキュリティ上の問題点（コード脆弱性や悪用可能なコード）を分析します。


### [Snyk CLI](https://docs.snyk.io/snyk-cli/getting-started-with-the-snyk-cli)コマンドとは
開発中のソフトウェアの脆弱性を自動的に検出し、修正するためのコマンドラインツールです。
今回はSnyk IaCを利用します。
* **Snyk Open Source** 
    * オープンソースの脆弱性を検出し、自動的に修正します。

* **Snyk Code**
    *  アプリケーション コードの脆弱性をリアルタイムで検出して修正します。

* **Snyk Container**
    * コンテナイメージとKubernetesアプリケーションの脆弱性を見つけて修正します。

* **Snyk IaC**
    * Terraform および Kubernetes コード内の安全でない構成を検出して修正します。 

### 今回使用する[Snyk IaC describe](https://docs.snyk.io/snyk-cli/commands/iac-describe)コマンドとは
IaC管理されていないインフラストラクチャ リソースを検出します。
Terraform 状態ファイル内のリソースとクラウド プロバイダー内の実際のリソースを比較しレポートを出力します。
Terraformのtfstate内のリソースとクラウドプロバイダーの実際のリソースを比較して検出します。
* Terraform 状態ファイル内のリソースは**管理対象リソース**
* 存在するが Terraform 状態ファイルに含まれていないリソースは**管理されていないリソース**

◆現在指定できるプロバイダー
-  aws
-  github
-  google
-  azure


## やってみた
#### 前提条件
* SnykCLIコマンドのインストールはSnyk社の[記事](https://qiita.com/SnykSec/items/aa80a976eb17299fff62)を参考にします。

* AWSプロバイダーで必要な[認証](https://docs.snyk.io/scan-with-snyk/snyk-iac/iac+-code-to-cloud-capabilities/detect-drift-and-manually-created-resources/configure-cloud-providers/configure-aws-provider)をします。

#### snyk iac describeコマンド実行
<前提>
tfstateファイルにはVPCの構成情報があります。

<実行例>
* AWSアカウント全体のアンマネージドリソースを検出

```bash
teru1:work teru$ snyk iac describe --to="aws+tf" --from="tfstate://terraform.tfstate"
Scanned states (1)
Scan duration: 1m54s
Provider version used to scan: . Use --tf-provider-version to use another version.
Snyk Scanning Infrastructure As Code Discrepancies...

  Info:    Resources under IaC, but different to terraform states.
  Resolve: Reapply IaC resources or update into terraform.

Unmanaged resources: 755

Service: Unidentified [ Unmanaged Resources: 590 ]

  Resource Type: aws_appautoscaling_policy
    ID: ***
~~~~

  Managed Resources: 1
  Unmanaged Resources: 755

  IaC Coverage: 0%
```

* AWS VPCのみのリソース選択し、tfstateファイルはs3にあるものを使用可能
    * 指定できる[サービス一覧](https://docs.snyk.io/snyk-cli/commands/iac-describe#service-less-than-service-greater-than-less-than-service-greater-than)

```bash
teru1:work teru$ snyk iac describe --filter="Type=='aws_vpc'"
Using Terraform state tfstate+s3://terraform-cloudshell-demo/snyk_iac/terraform.tfstate found in main.tf. Use the --from flag to specify another state file.


Unmanaged resources: 74
Service: aws_vpc [ Unmanaged Resources: 74 ]
  Resource Type: aws_vpc
    ID: vpc-***
    ID: vpc-***
    ID: vpc-***
~~~~

Service: aws_vpc [ Unmanaged Resources: 74 ]
  Managed Resources: 1
  Unmanaged Resources: 74

  IaC Coverage: 1%
  Info: To reach full coverage, remove resources or move it to Terraform.
```
#### 他にも便利なオプションもあります。
* json出力のオプションを付与

```bash
teru1:work teru$ snyk iac describe --filter="Type=='aws_vpc'" --json > 20241122scan.json
	"summary": {
		"total_resources": 75,
		"total_unmanaged": 74,
		"total_missing": 0,
		"total_managed": 1,
		"total_iac_source_count": 1
	},
	"managed": [
		{
			"id": "vpc-***",
			"type": "aws_vpc",
			"source": {
				"source": "tfstate+s3://terraform-cloudshell-demo/snyk_iac/terraform.tfstate",
				"namespace": "",
				"internal_name": "vpc"
			}
		}
	],
	"unmanaged": [
		{
			"id": "vpc-***",
			"type": "aws_vpc"
```
* html出力
```bash
teru1:work teru$ snyk iac describe --filter="Type=='aws_vpc'" --from="tfstate://terraform.tfstate" --html-file-output=snyk.html 
Scanned states (1)
Scan duration: 1m49s
Provider version used to scan: . Use --tf-provider-version to use another version.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612700/d795658f-cae6-a27c-b325-a6b518178dcf.png)



## 最後に
便利なオプションもあり、レポートにも活用できそうですね
次はCI/CDに組み込んでterrfrom plan実行時にsnyk iac describeコマンドを実施して差分がないか事前に確認する方法もやってみたいと考えています。
他にもsnykではCI/CDにインテグレーションし脆弱性の検出を可能にするので、やってみたいです。