kakakakakku blog

Weekly Tech Blog: Keep on Learning!

tfsec: Terraform のセキュリティスキャンを活用しよう

Terraform コードを書きながらセキュリティ観点の警告を把握できるため tfsec を導入すると便利❗️

tfsec では AWS, Microsoft Azure, Google Cloud などさまざまなプロバイダをサポートしている👏 最近 AWS プロバイダを前提に tfsec を導入する機会があって,個人的に検証した作業ログをまとめる📝

aquasecurity.github.io

また tfsec は前に紹介した TFLint と一緒に導入しておくとさらに便利〜 \( 'ω')/

kakakakakku.hatenablog.com

tfsec をセットアップする

tfsec のセットアップは macOS だと Homebrew を使えば簡単〜

今回は tfsec v1.28.1 を前提にする.

$ brew install tfsec

$ tfsec --version
v1.28.1

tfsec を実行する

基本的には tfsec コマンドを実行すれば OK👌

該当するとだーっと表示される.1件も該当しないと統計情報と共に No problems detected! と表示される.

$ tfsec

No problems detected!

tfsec にどんなルールがあるのか

tfsec には多くの警告があってドキュメントにまとまっている.AWS 関連の警告は以下で確認できる.サービス的に網羅はされていないけど,よく使うサービスのセキュリティ観点で気を付けるべき設定は警告されるようになっている気がする💡

aquasecurity.github.io

最近改善を担当することになった Terraform プロジェクトに tfsec を実行してみたところ Warning が 400件 も出てきた🔥とは言え,半分以上の警告は Severity(重大度)が LOW になっているため,今後の改善案としてコツコツ修正していくのが良さそう.

以下に代表的な警告を紹介する📝

Severity(重大度): CRITICAL

🔗 aws-ec2-no-public-ingress-sgr

セキュリティグループ(インバウンド)で 0.0.0.0/0 は避けるべし!という警告🛑

Application Load Balancer (ALB) で API を公開する場合など,意図的に 0.0.0.0/0 を設定する場合もあるためそれは無視しつつ,意図せず公開されている場合に警告が出るので助かる👌

aquasecurity.github.io

🔗 aws-ec2-no-public-egress-sgr

セキュリティグループ(アウトバウンド)で 0.0.0.0/0 は避けるべし!という警告🛑

アウトバウンドはデフォルトで 0.0.0.0/0 になっていることもあってよく出る警告だと思う.個人的には CRITICAL でなくても良さそうに思うけど,何も考えず 0.0.0.0/0 のままになっていることを再考するきっかけになると思う.VPC エンドポイントなども活用しつつ,できる限り制限した CIDR レンジを設定するべし.

aquasecurity.github.io

Severity(重大度): HIGH

🔗 aws-iam-no-policy-wildcards

IAM ポリシーを記述するときにワイルドカード * は避けるべし!という警告🛑

最小権限の原則に従っていないと警告が出てしまう.ワイルドカードのまま本番環境に導入してしまうと後から直すコストが高くなってしまうけど,IAM Access Analyzer などを活用しながらワイルドカードを減らせると良さそう👌

aquasecurity.github.io

🔗 aws-ecr-enforce-immutable-repository

Amazon ECR リポジトリのイメージタグを上書きできないようにイミュータブル設定を有効化せよ!という警告🛑

latest タグすら使わずにイメージタグの運用をしっかり回せている前提にはなるけど有効化しておくと良さそう👌

aquasecurity.github.io

🔗 aws-ecr-enable-image-scans

Amazon ECR リポジトリのイメージスキャンを有効化せよ!という警告🛑

aquasecurity.github.io

基本的に有効化しておくと良さそう👌しかし現在は Basic scanning 以外に Amazon Inspector と統合された Enhanced scanning もあるので,そっちを使う場合は警告は無視しておけば良いかと.

docs.aws.amazon.com

🔗 aws-elb-drop-invalid-headers

Application Load Balancer (ALB) で 無効なヘッダーフィールドを削除 を有効化せよ!という警告🛑

動作確認は慎重に行いつつ有効化すると良さそう👌

aquasecurity.github.io

無効なヘッダーフィールドを削除 に関しては前にブログにまとめてある📝

kakakakakku.hatenablog.com

Severity(重大度): LOW

🔗 aws-ec2-add-description-to-security-group-rule

セキュリティグループの各エントリーに説明を設定せよ!という警告🛑

Severity(重大度)は LOW だし必須ではないと思うけど,運用を引き継いだ AWS 環境を調査していて「これは何だ〜?」というエントリーに出会うこともあるし,ちゃんと説明を設定しておくのはセキュリティ目的に限らず重要だと思う.

aquasecurity.github.io

不要な警告を減らす

tfsec の設定ファイル .tfsec/config.yml を活用すると tfsec で警告する Severity(重大度)の閾値や無視する警告を設定できる❗️以下の例だと閾値を HIGH 以上にして,いくつかの警告を無視することで大幅に減らせる👏

minimum_severity: HIGH

exclude:
  - aws-ec2-no-public-egress-sgr
  - aws-ec2-no-public-ingress-sgr
  - aws-ecr-enable-image-scans
  - aws-ecr-enforce-immutable-repository
  - aws-elb-alb-not-public
  - aws-iam-no-policy-wildcards

tfsec コマンドを実行すると自動的に .tfsec/config.yml を参照するけど,ファイル名を変えて複数種類の設定ファイルを活用するような場合は --config-file オプションで指定することもできる.

$ tfsec --config-file .tfsec/my-config.yml

また tfsec コマンドを実行したときに表示される統計情報の ignored で該当していた件数も確認できるため(以下の件数は例),運用中の Terraform プロジェクトに途中から tfsec を導入する場合は,一度無視してから段階的に ignored を減らしていく戦略もアリだと思う💡

$ tfsec

  timings
  ──────────────────────────────────────────
(中略)

  counts
  ──────────────────────────────────────────
(中略)

  results
  ──────────────────────────────────────────
  passed               150
  ignored              200
  critical             0
  high                 0
  medium               0
  low                  0


No problems detected!

個別に警告を無視する

Terraform コードに #tfsec:ignore:... と書けば個別に警告を無視できる.以下は例として aws-elb-alb-not-public の警告を無視するために #tfsec:ignore:aws-elb-alb-not-public と書いてある.書く場所も重要で今回だと internalの直前に書いている💨

resource "aws_lb" "alb" {
  name                       = "alb"
  load_balancer_type         = "application"
  #tfsec:ignore:aws-elb-alb-not-public
  internal                   = false
(中略)

aquasecurity.github.io

また #tfsec:ignore:aws-elb-alb-not-public:exp:2023-12-31 のように書くと有効期限を設定できるのは最高❗️いつまでに直すぞ〜という意思表示に使えるし,有効期限を過ぎたら CI/CD で突然エラーになるのもイイ仕組みだと思う👏

tfsec を GitHub Actions で動かす

tfsec を GitHub Actions で動かす場合は「tfsec-action」を使えば簡単に導入できる❗️

github.com

name: tfsec

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  tfsec:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run tfsec
        uses: aquasecurity/tfsec-action@v1.0.3

さらにプルリクエストに直接コメントをするように設定したかったら「tfsec-pr-commenter-action」を使えば実現できる👌

github.com

VS Code 拡張機能「tfsec」

もし tfsec を使うなら VS Code 拡張機能「tfsec」をインストールしておくと開発中にはかどる💡該当した警告をレベル別 (Critical, High, Medium, Low) に一覧できたり,コードジャンプできたり,右クリックメニューを使って ignore コメントを自動挿入できたりする❗️

\( 'ω')/ 実際に使ってるけど VS Code 拡張機能は便利〜

marketplace.visualstudio.com