Terraform コードを書きながらセキュリティ観点の警告を把握できるため tfsec を導入すると便利❗️
tfsec では AWS, Microsoft Azure, Google Cloud などさまざまなプロバイダをサポートしている👏 最近 AWS プロバイダを前提に tfsec を導入する機会があって,個人的に検証した作業ログをまとめる📝
また tfsec は前に紹介した TFLint と一緒に導入しておくとさらに便利〜 \( 'ω')/
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 関連の警告は以下で確認できる.サービス的に網羅はされていないけど,よく使うサービスのセキュリティ観点で気を付けるべき設定は警告されるようになっている気がする💡
最近改善を担当することになった 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
を設定する場合もあるためそれは無視しつつ,意図せず公開されている場合に警告が出るので助かる👌
🔗 aws-ec2-no-public-egress-sgr
セキュリティグループ(アウトバウンド)で 0.0.0.0/0
は避けるべし!という警告🛑
アウトバウンドはデフォルトで 0.0.0.0/0
になっていることもあってよく出る警告だと思う.個人的には CRITICAL でなくても良さそうに思うけど,何も考えず 0.0.0.0/0
のままになっていることを再考するきっかけになると思う.VPC エンドポイントなども活用しつつ,できる限り制限した CIDR レンジを設定するべし.
Severity(重大度): HIGH
🔗 aws-iam-no-policy-wildcards
IAM ポリシーを記述するときにワイルドカード *
は避けるべし!という警告🛑
最小権限の原則に従っていないと警告が出てしまう.ワイルドカードのまま本番環境に導入してしまうと後から直すコストが高くなってしまうけど,IAM Access Analyzer などを活用しながらワイルドカードを減らせると良さそう👌
🔗 aws-ecr-enforce-immutable-repository
Amazon ECR リポジトリのイメージタグを上書きできないようにイミュータブル設定を有効化せよ!という警告🛑
latest
タグすら使わずにイメージタグの運用をしっかり回せている前提にはなるけど有効化しておくと良さそう👌
🔗 aws-ecr-enable-image-scans
Amazon ECR リポジトリのイメージスキャンを有効化せよ!という警告🛑
基本的に有効化しておくと良さそう👌しかし現在は Basic scanning 以外に Amazon Inspector と統合された Enhanced scanning もあるので,そっちを使う場合は警告は無視しておけば良いかと.
🔗 aws-elb-drop-invalid-headers
Application Load Balancer (ALB) で 無効なヘッダーフィールドを削除
を有効化せよ!という警告🛑
動作確認は慎重に行いつつ有効化すると良さそう👌
無効なヘッダーフィールドを削除
に関しては前にブログにまとめてある📝
Severity(重大度): LOW
🔗 aws-ec2-add-description-to-security-group-rule
セキュリティグループの各エントリーに説明を設定せよ!という警告🛑
Severity(重大度)は LOW だし必須ではないと思うけど,運用を引き継いだ AWS 環境を調査していて「これは何だ〜?」というエントリーに出会うこともあるし,ちゃんと説明を設定しておくのはセキュリティ目的に限らず重要だと思う.
不要な警告を減らす
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 (中略)
また #tfsec:ignore:aws-elb-alb-not-public:exp:2023-12-31
のように書くと有効期限を設定できるのは最高❗️いつまでに直すぞ〜という意思表示に使えるし,有効期限を過ぎたら CI/CD で突然エラーになるのもイイ仕組みだと思う👏
tfsec を GitHub Actions で動かす
tfsec を GitHub Actions で動かす場合は「tfsec-action」を使えば簡単に導入できる❗️
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」を使えば実現できる👌
VS Code 拡張機能「tfsec」
もし tfsec を使うなら VS Code 拡張機能「tfsec」をインストールしておくと開発中にはかどる💡該当した警告をレベル別 (Critical, High, Medium, Low) に一覧できたり,コードジャンプできたり,右クリックメニューを使って ignore
コメントを自動挿入できたりする❗️
\( 'ω')/ 実際に使ってるけど VS Code 拡張機能は便利〜