はじめに
昨今、IaC(Infrastructure_as_code)にてインフラストラクチャをコードにして管理することが多くなってきたと思います。
その際に直面する問題をSnykで解決しようというのが今回の記事です。
どんなことを解決したいか
IaC化したクラウドプラットフォームにおいて、リソース変更権限が付与されている開発者が設定変更した内容がIaCに落とし込めていないと
コード管理されていない作業とIaC管理されているリソースの設定の間で差分が発生してしまいます。
その変更履歴を管理する運用ができていないと、サーバ運用保守者がIaC再デプロイする際に手動の設定変更が消去されてしまうため、 IaCデプロイ前に差分を確認する手段を探していました。
Snykとは
ソフトウェア開発プロジェクトでのカスタムコード、オープンソースソフトウェア、コンテナ、IaCの脆弱性をリアルタイムで検知するセキュリティソリューションです。
Snykの脆弱性データベースはAWSにおいても採用されており、Amazon InspectorのテクノロジーもSnykを利用しています。
以下の4機能から構成されます。
-
脆弱性の検出
- アプリケーションの依存ライブラリやコンテナイメージ内に含まれるセキュリティ脆弱性をスキャンし検出します。
-
自動修正
- 検出した脆弱性を解決するためにパッチ適用や安全なバージョンへのアップデートを提案し場合によっては自動修正を実行します。
-
ライセンスリスクの管理
- アプリケーションで使用されるオープンソースライブラリのライセンスに関連するリスクをチェックします。
-
CI/CDパイプラインとの統合
- CI/CDツールに統合し、開発プロセス内でセキュリティチェックを自動化します。
-
コードのセキュリティ
- 自社のコードベースのセキュリティ上の問題点(コード脆弱性や悪用可能なコード)を分析します。
Snyk CLIコマンドとは
開発中のソフトウェアの脆弱性を自動的に検出し、修正するためのコマンドラインツールです。
今回はSnyk IaCを利用します。
-
Snyk Open Source
- オープンソースの脆弱性を検出し、自動的に修正します。
-
Snyk Code
- アプリケーション コードの脆弱性をリアルタイムで検出して修正します。
-
Snyk Container
- コンテナイメージとKubernetesアプリケーションの脆弱性を見つけて修正します。
-
Snyk IaC
- Terraform および Kubernetes コード内の安全でない構成を検出して修正します。
今回使用するSnyk IaC describeコマンドとは
IaC管理されていないインフラストラクチャ リソースを検出します。
Terraform 状態ファイル内のリソースとクラウド プロバイダー内の実際のリソースを比較しレポートを出力します。
Terraformのtfstate内のリソースとクラウドプロバイダーの実際のリソースを比較して検出します。
- Terraform 状態ファイル内のリソースは管理対象リソース
- 存在するが Terraform 状態ファイルに含まれていないリソースは管理されていないリソース
◆現在指定できるプロバイダー
- aws
- github
- azure
やってみた
前提条件
snyk iac describeコマンド実行
<前提>
tfstateファイルにはVPCの構成情報があります。
<実行例>
- AWSアカウント全体のアンマネージドリソースを検出
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にあるものを使用可能
- 指定できるサービス一覧
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出力のオプションを付与
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出力
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.
最後に
便利なオプションもあり、レポートにも活用できそうですね
次はCI/CDに組み込んでterrfrom plan実行時にsnyk iac describeコマンドを実施して差分がないか事前に確認する方法もやってみたいと考えています。
他にもsnykではCI/CDにインテグレーションし脆弱性の検出を可能にするので、やってみたいです。