♾️

terraform の静的セキュリティスキャンツールの比較 tfsec chekcov snyk

2023/03/15に公開約11,900字

terraform の静的セキュリティスキャンツールの比較 tfsec chekcov snyk

私は普段AWS等のインフラの管理を行うときにはterraformを使ってその管理を行っています。
インフラを実装するにあたって、セキュリティのケアを行っていくことは大切であります[1]
今回は、設計実装段階[2]にCLI[3]からセキュリティのチェックを行うことのできる静的セキュリティスキャンツールについていくつか比較してみました。

この記事が参考になる人は

  • IaCをterraformでやっていてDevSecOpsをはじめてみようと思っている人
  • tfsec chekcov snykのcliやgithub actionsへの導入方法を知りたい人
  • tfsec chekcov snykの違いを知りたい人

対象のコード

下記の自作コードを今回のスキャン対象にしています。(TODO コンテナの例も入れ込みたい )
https://github.com/piroz/try-iac-scanner

tfsec

tfsecはAqua Security社の、オープンソースツールです。

https://github.com/aquasecurity/tfsec

tfsecはTerraformコードのセキュリティチェックを行うツールで、公式のTerraformセキュリティガイドラインに従って、潜在的な脆弱性を検出します。

tfsecの導入

導入はbrewから行えます

$ brew install tfsec

tfsecの実行

前述の下記レポジトリに対して実行すると

https://github.com/piroz/try-iac-scanner

下記のような結果に

Result #1 HIGH No public access block so not blocking public acls 
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 s3.tf:1-3
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1    resource "aws_s3_bucket" "main" {
   2        name = "my-bucket-name"
   3    }
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
         ID aws-s3-block-public-acls
     Impact PUT calls with public ACLs specified can make objects public
 Resolution Enable blocking any PUT calls with a public ACL specified

 More Information
 - https://aquasecurity.github.io/tfsec/v1.28.1/checks/aws/s3/block-public-acls/
 - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block#block_public_acls
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


Result #2 HIGH No public access block so not blocking public policies 
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 s3.tf:1-3
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1    resource "aws_s3_bucket" "main" {
   2        name = "my-bucket-name"
   3    }
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
         ID aws-s3-block-public-policy
     Impact Users could put a policy that allows public access
 Resolution Prevent policies that allow public access being PUT

 More Information
 - https://aquasecurity.github.io/tfsec/v1.28.1/checks/aws/s3/block-public-policy/
 - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block#block_public_policy
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


Result #3 HIGH Bucket does not have encryption enabled 
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 s3.tf:1-3
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1    resource "aws_s3_bucket" "main" {
   2        name = "my-bucket-name"
   3    }
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
         ID aws-s3-enable-bucket-encryption
     Impact The bucket objects could be read if compromised
 Resolution Configure bucket encryption

 More Information
 - https://aquasecurity.github.io/tfsec/v1.28.1/checks/aws/s3/enable-bucket-encryption/
 - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket#enable-default-server-side-encryption
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
# ...省略
 timings
 ──────────────────────────────────────────
 disk i/o             10.536µs
 parsing              114.543µs
 adaptation           64.899µs
 checks               5.613634ms
 total                5.803612ms

 counts
 ──────────────────────────────────────────
 modules downloaded   0
 modules processed    1
 blocks processed     1
 files read           1

 results
 ──────────────────────────────────────────
 passed               3
 ignored              0
 critical             0
 high                 6
 medium               2
 low                  1

 3 passed, 9 potential problem(s) detected.

結構ぞろぞろとでてきていますが

scan結果に下記のようなURLがあり
良いコード例と悪いコード例があり
それを参考に修正していくことになりそうです。

https://aquasecurity.github.io/tfsec/v1.28.1/checks/aws/s3/encryption-customer-key/

また、検出された問題について今回はわけあって対応しないみたいなときには
terraformのコード上に下記のようなコメントを書いておくと

# tfsec:ignore:aws-s3-specify-public-access-block
resource "aws_s3_bucket" "main" {

下記のようにtfsecの警告をignoredにすることはできます

$ tfsec --include-ignored
# ...省略
Result #9 IGNORED (LOW) Bucket does not have a corresponding public access block. 
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  s3.tf:2-4
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    2    resource "aws_s3_bucket" "main" {
    3        name = "my-bucket-name"
    4    }
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
          ID aws-s3-specify-public-access-block
      Impact Public access policies may be applied to sensitive data buckets
  Resolution Define a aws_s3_bucket_public_access_block for the given bucket to control public access policies

  More Information
  - https://aquasecurity.github.io/tfsec/v1.28.1/checks/aws/s3/specify-public-access-block/
  - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block#bucket
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


  timings
  ──────────────────────────────────────────
  disk i/o             9.706µs
  parsing              115.315µs
  adaptation           65.411µs
  checks               5.079941ms
  total                5.270373ms

  counts
  ──────────────────────────────────────────
  modules downloaded   0
  modules processed    1
  blocks processed     1
  files read           1

  results
  ──────────────────────────────────────────
  passed               3
  ignored              1
  critical             0
  high                 6
  medium               2
  low                  0

  3 passed, 1 ignored, 8 potential problem(s) detected.

ignoredしたものをcheck結果に表示したい場合--include-ignoredオプションつきでtfsecを起動する必要がありました。

また、ignoreの有効期限を設定することもできて下記のように記述すれば可能です

# tfsec:ignore:aws-s3-specify-public-access-block:exp:2022-01-02
resource "aws_s3_bucket" "main" {

ignoreについてのドキュメントは下記です

https://aquasecurity.github.io/tfsec/v1.0.11/getting-started/configuration/ignores/

tfsec GitHub Actions

GitHub Actionsへの追加は当該Github レポジトリのActionsタブからtfsecを検索してconfitgureボタンを押すと、yamlの編集画面になります。

下記のように編集して追加すればtfsecをGitHub Actionsへ組み込むことができます
(私は、schedule実行のeventをコメント化しました)

https://github.com/piroz/try-iac-scanner/commit/37b66d30cbe4a5ed1bb2f7bd9a6607b694988c24

checkcov

checkcovはBridgecrew社の、オープンソースツールです。

https://github.com/bridgecrewio/checkov

Terraformコードの静的分析を行い、セキュリティ、コスト、パフォーマンス、ベストプラクティスに関する問題を特定します。

checkcovの導入

導入はpipやhomebrew等から行えます。私はpython環境の整備はしていたのでpipでインストールしました

※python環境が必要です。私がubuntu22.04でのpython環境を構築した際の内容は下記で参照できます

https://zenn.dev/hiroshimraz/articles/2598456e4c94f9

$ pip install checkov

※もしhomebrewでinstallしたい場合は

$ brew install checkov

checkcovの実行

前述の下記レポジトリに対して実行すると

https://github.com/piroz/try-iac-scanner

下記のような結果に

checkov --file s3.tf 
[ terraform framework ]: 100%|████████████████████|[1/1], Current File Scanned=s
[ secrets framework ]: 100%|████████████████████|[1/1], Current File Scanned=s3.

       _               _              
   ___| |__   ___  ___| | _______   __
  / __| '_ \ / _ \/ __| |/ / _ \ \ / /
 | (__| | | |  __/ (__|   < (_) \ V / 
  \___|_| |_|\___|\___|_|\_\___/ \_/  
                                      
By bridgecrew.io | version: 2.3.124 

terraform scan results:

Passed checks: 4, Failed checks: 7, Skipped checks: 0
# ...省略
Check: CKV_AWS_145: "Ensure that S3 buckets are encrypted with KMS by default"
	FAILED for resource: aws_s3_bucket.main
	File: /s3.tf:1-3
	Guide: https://docs.bridgecrew.io/docs/ensure-that-s3-buckets-are-encrypted-with-kms-by-default

		1 | resource "aws_s3_bucket" "main" {
		2 |     name = "my-bucket-name"
		3 | }

tfsecの場合、passedなどの結果がコマンド実行結果の最終行にでてきていて、cliでの実行時は見やすいかもしれないと思いました。

checkovでもtfsec同様、scan結果に下記のようなURLがあり
それを参考に修正していくことになりそうです。

https://docs.bridgecrew.io/docs/ensure-that-s3-buckets-are-encrypted-with-kms-by-default

また、検出された問題について今回はわけあって対応しないみたいなときもcheckovでも
terraformのコード上に下記のようなコメントを書いておくと

resource "aws_s3_bucket" "main" {
  # checkov:skip=CKV2_AWS_6

下記のようにcheckovのcheckをSKIPPEDすることはできます

# ...省略
Passed checks: 4, Failed checks: 6, Skipped checks: 1
# ...省略
Check: CKV2_AWS_6: "Ensure that S3 bucket has a Public Access block"
	SKIPPED for resource: aws_s3_bucket.main
	Suppress comment: No comment provided
	File: /s3.tf:2-5
	Guide: https://docs.bridgecrew.io/docs/s3-bucket-should-have-public-access-blocks-defaults-to-false-if-the-public-access-block-is-not-attached

SKIPPEDされたものはCLIでの実行結果の最後に出力されます。

checkov GitHub Actions

checkov のgithub actionsは下記を参考にして導入できます

https://github.com/marketplace/actions/checkov-github-action

snyk

snykは、Terraformを含む多数のプログラミング言語やフレームワークに対応した、継続的なセキュリティ監視のための統合セキュリティプラットフォームです。Terraformに対応しており、Terraformのコードをスキャンし、潜在的なセキュリティ上の問題を特定することができます。

今回は以下のcliを使います

https://github.com/snyk/cli

todo

脚注
  1. 非常に手間のかかることでも ↩︎

  2. DevSecOpsの信条「シフト・レフト」を実践する際に ↩︎

  3. ubuntu 22.04環境で試しています ↩︎

Discussion

ログインするとコメントできます