tfsecでconfigファイルを使ってルールを除外する

2022.08.08

「tfsecで毎回コメントアウトせずに、特定ルールを除外したい」

tfsecのルール除外はコメントを追加するだけで良いので、とても簡単です。

しかし、「このルールは今回のプロジェクトでは無効にしたい。だけど、1個1個コメント書いていくのが面倒」ということがあるかと思います。

今回は、configファイルを使ったルールの除外方法を紹介します。

結論から、configファイルを用意しァイルを指定してtfsecを実行することで実現できます。 (以下の例では、aws-s3-encryption-customer-keyのルールが除外されます。)

tfsec.yml

---
exclude:
  - aws-s3-encryption-customer-key
$ tfsec --config-file tfsec.yml

Config File - tfsec

やってみた

s3.tf

resource "aws_s3_bucket" "test" {
  bucket = "test-220806"
}

resource "aws_s3_bucket_acl" "test" {
  bucket = aws_s3_bucket.test.bucket
  acl    = "private"
}

resource "aws_s3_bucket_public_access_block" "test" {
  bucket = aws_s3_bucket.test.id

  block_public_acls       = true
  ignore_public_acls      = true
  block_public_policy     = true
  restrict_public_buckets = true
}

resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
  bucket = aws_s3_bucket.test.bucket

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

上記のtfファイルを例にして、それぞれの動作を試します。

tfsecを実行すると、highでaws-s3-encryption-customer-keyのルールに引っ掛かっていることがわかります。

$ tfsec
Result #1 HIGH Bucket does not encrypt data with a customer managed key. 
────────────────────────────────────────────────────────────────
  s3.tf:18-26
────────────────────────────────────────────────────────────────
   18    resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
   19      bucket = aws_s3_bucket.test.bucket
   20    
   21      rule {
   22        apply_server_side_encryption_by_default {
   23          sse_algorithm = "AES256"
   24        }
   25      }
   26    }
────────────────────────────────────────────────────────────────
          ID aws-s3-encryption-customer-key
      Impact Using AWS managed keys does not allow for fine grained control
  Resolution Enable encryption using customer managed keys

ルールの除外(コメント)

以下のように、コメントで除外することもできます。

s3.tf

resource "aws_s3_bucket" "test" {
  bucket = "test-220806"
}

resource "aws_s3_bucket_acl" "test" {
  bucket = aws_s3_bucket.test.bucket
  acl    = "private"
}
resource "aws_s3_bucket_public_access_block" "test" {
  bucket = aws_s3_bucket.test.id

  block_public_acls       = true
  ignore_public_acls      = true
  block_public_policy     = true
  restrict_public_buckets = true
}

#tfsec:ignore:aws-s3-encryption-customer-key
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
  bucket = aws_s3_bucket.test.bucket

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

手軽にできてとてもいいですね。

ただ、S3バケットを大量に作成し全てにルールの除外を適用したい場合は、ルールを複数回書く必要があります。

ルールの除外(configファイル)

以下の内容で、tfsec.ymlを作成します。

tfsec.yml

---
exclude:
  - aws-s3-encryption-customer-key

ファイルを用意したらconfigファイルを指定して実行することで、ルールが除外した上でtfsecを実行できます。 (ちなみに、.tfsec/config.yml という形でファイル配置すると指定しなくても自動的に読み込まれます。)

$ tfsec --config-file tfsec.yml

Config File - tfsec

pre-commit-terrformでconfigファイルを指定する

フォルダで環境を分けている場合は少し注意が必要です。

例えば、以下のようにルートにtfsecのconfigファイルがあって全環境に適用したいパターンです。

├── tfsec.yml
└── envs
    └── stg
    └── prd

ファイル名だけ指定すると、各環境フォルダ配下のtfsec.yamlを参照するため絶対パスで指定する必要があります。

.pre-commit-config.yaml

default_stages: [commit]
repos:
    - repo: https://github.com/antonbabenko/pre-commit-terraform
      rev: v1.74.1
      hooks:
          - id: terraform_tfsec
            args:
#              - --args=--config-file=tfsec.yaml # 各フォルダ配下のtfsec.yamlを参照 ex envs/stg/tfsec.yaml
              - --args=--config-file=__GIT_WORKING_DIR__/.tfsec.yml # ルートのtfsec.ymlを参照

antonbabenko/pre-commit-terraform: pre-commit git hooks to take care of Terraform configurations 🇺🇦

おわりに

configファイルを使用した tfsec のルールの除外についてでした。

今回紹介できていませんでしたが、configファイルを指定してルールの重大度の上書きなども可能です。

運用していくにあたりルールの除外など必要になってくるかと思うため、うまく活用していきたいです。

以上、AWS事業本部の佐藤(@chari7311)でした。