Mirai Translate TECH BLOG

株式会社みらい翻訳のテックブログ

tfsecを試してみる

みらい翻訳のバックエンドエンジニアのtoshと申します。

弊社ではインフラの構築にterraformを利用しています。

今回はterraformのセキュリティスキャンツールを紹介します。

tfsecとは

Aqua Securityという会社が開発しているオープンソースのterraformの静的解析ツールで、セキュリティスキャンをしてくれます。

特徴として、非常に高速に動作することと、ローカルはもちろんCI/CDパイプラインで動作させることが想定されています。

以下はgithubリポジトリからの抜粋です。

GitHub - aquasecurity/tfsec: Security scanner for your Terraform code

tfsec uses static analysis of your terraform code to spot potential misconfigurations.

tfsecは、Terraformコードの静的分析を使用して、潜在的な構成ミスを見つけます。

また、technology radarではAdoptになっていました。 Tools | Thoughtworks

For our projects using Terraform, tfsec has quickly become a default static analysis tool to detect potential security risks. It's easy to integrate into a CI pipeline and has a growing library of checks against all of the major cloud providers and platforms like Kubernetes. Given its ease of use, we believe tfsec could be a good addition to any Terraform project.

Terraformを使用するプロジェクトでは、tfsecはすぐに、潜在的なセキュリティリスクを検出する既定の静的分析ツールになりました。
CIパイプラインに簡単に統合でき、Kubernetesのような主要なクラウドプロバイダーやプラットフォームすべてに対するチェックのライブラリが増えています。
使いやすさを考えると、tfsecはTerraformプロジェクトに追加するのに適していると思います。

ローカルで試してみる

インストール

brew install tfsec

実行

tfsec実行のために、以下のようなセキュリティグループを作成するtfファイルを作成しておきました。

resource "aws_security_group" "test" {
  name        = "test-security-group"
  description = "For test"
  vpc_id      = "vpc-xxxxxx"
}

resource "aws_security_group_rule" "api_ingress" {
  security_group_id = aws_security_group.test.id
  type              = "ingress"
  from_port         = 443
  to_port           = 443
  protocol          = "tcp"
  cidr_blocks       = ["0.0.0.0/0"]
}

resource "aws_security_group_rule" "egress_all" {
  security_group_id = aws_security_group.test.id
  type              = "egress"
  description       = "Allow all"
  from_port         = 0
  to_port           = 0
  protocol          = "-1"
  cidr_blocks       = ["0.0.0.0/0"]
}

実行の仕方は以下の通りです。

# tfファイルがあるディレクトリで
tfsec

# パスを指定する場合
tfsec ${terraformファイルがあるディレクトリ}

実行結果

実行結果は下記の通りです。実行結果の中に実行にかかった時間が記載されていますが、非常に高速に動作したことがわかると思います。

また、指摘の詳細と一緒にterraformのドキュメントのリンクを一緒に吐いてくれるのは便利だと思いました。

$ tfsec

Result #1 CRITICAL Security group rule allows ingress from public internet. 
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  main.tf:13
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    7    resource "aws_security_group_rule" "api_ingress" {
    8      security_group_id = aws_security_group.test.id
    9      type              = "ingress"
   10      from_port         = 443
   11      to_port           = 443
   12      protocol          = "tcp"
   13  [   cidr_blocks       = ["0.0.0.0/0"]
   14    }
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
          ID aws-ec2-no-public-ingress-sgr
      Impact Your port exposed to the internet
  Resolution Set a more restrictive cidr range

  More Information
  - https://aquasecurity.github.io/tfsec/v1.27.1/checks/aws/ec2/no-public-ingress-sgr/
  - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group_rule#cidr_blocks
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


Result #2 CRITICAL Security group rule allows egress to multiple public internet addresses. 
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  main.tf:23
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   16    resource "aws_security_group_rule" "egress_all" {
   17      security_group_id = aws_security_group.test.id
   18      type              = "egress"
   19      description       = "Allow all"
   20      from_port         = 0
   21      to_port           = 0
   22      protocol          = "-1"
   23  [   cidr_blocks       = ["0.0.0.0/0"]
   24    }
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
          ID aws-ec2-no-public-egress-sgr
      Impact Your port is egressing data to the internet
  Resolution Set a more restrictive cidr range

  More Information
  - https://aquasecurity.github.io/tfsec/v1.27.1/checks/aws/ec2/no-public-egress-sgr/
  - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


Result #3 LOW Security group rule does not have a description. 
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  main.tf:7-14
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    7    resource "aws_security_group_rule" "api_ingress" {
    8      security_group_id = aws_security_group.test.id
    9      type              = "ingress"
   10      from_port         = 443
   11      to_port           = 443
   12      protocol          = "tcp"
   13      cidr_blocks       = ["0.0.0.0/0"]
   14    }
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
          ID aws-ec2-add-description-to-security-group-rule
      Impact Descriptions provide context for the firewall rule reasons
  Resolution Add descriptions for all security groups rules

  More Information
  - https://aquasecurity.github.io/tfsec/v1.27.1/checks/aws/ec2/add-description-to-security-group-rule/
  - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
  - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group_rule
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


  timings
  ──────────────────────────────────────────
  disk i/o             116.642µs
  parsing              870.418µs
  adaptation           4.862873ms
  checks               25.687667ms
  total                31.5376ms

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

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

  2 passed, 3 potential problem(s) detected.

CIで動作させる

https://github.com/aquasecurity/tfsec-action

こちらを参考に以下のコードを作成しました。

name: tfsec
on:
  workflow_dispatch:

jobs:
  tfsec:
    name: tfsec sarif report
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write
    steps:
      - name: Clone repo
        uses: actions/checkout@v2
        with:
          persist-credentials: false

      - name: tfsec
        uses: aquasecurity/tfsec-action@v1.0.0
        with:
          working_directory: ./tosh/test_tfsec

実行結果

まとめ

セキュアなterraformコードを書くお供としてtfsec使ってみては良いのではないでしょうか。 インストールも簡単で非常に高速に動作するのでおすすめです!