【実務・中級編】Terraformでコンプライアンス自動監査:Checkovとtfsecを活用したIaCセキュリティシフトレフトの実践 – インフラ構成管理(IaC)活用バイブル

IaCの「守り」を自動化せよ:Checkovとtfsecによるセキュリティ・シフトレフトの極意

「Terraformを書いた。計画通りにデプロイされた。しかし、セキュリティグループが全開放されていた。」

こんな惨劇を未然に防ぐのが、現代のSREの必須スキルである「セキュリティ・シフトレフト」だ。コードをコミットした瞬間に脆弱性を検知し、CIを落とす。このフィードバックループを回さなければ、大規模なクラウド環境は一瞬で崩壊する。

今回は、数々の現場で「IaCの品質」を定義してきた私が、Checkovとtfsecを使いこなし、開発速度を落とさずに鉄壁のガードを実現する現場の知見を授ける。

—

1. Checkov vs tfsec:どちらを「メインエンジン」に据えるべきか

両者とも素晴らしいツールだが、設計思想が異なる。

  • Checkov (Bridgecrew): Pythonベース。IaCだけでなく、KubernetesマニフェストやDockerfile、さらにはCloudFormationまで網羅する「統合型」だ。特にカスタムポリシー(Checkov Check)の記述が容易で、社内基準をコード化しやすい。
  • tfsec (Aqua Security): Goベース。圧倒的に高速である。静的解析のアルゴリズムが非常に洗練されており、Terraformの文脈理解において誤検知が少ない。

結論: 大規模なマルチクラウド環境ならCheckov。圧倒的な速度で開発者の体験を損なわず、Terraform特化で運用するならtfsecだ。私の推奨は「tfsecをローカルの高速チェックに、CheckovをCIでの厳格なガバナンス監査に」という二段構えである。

—

2. 開発体験を極限まで高める:神設定とプラグイン

生産性を落とすセキュリティは、誰も守らなくなる。以下を導入し、エディタ上で「気づかせる」環境を作れ。

VS Code必須プラグイン

  • [Checkov](https://marketplace.visualstudio.com/items?itemName=bridgecrew.checkov): VS Code上でリアルタイムに診断結果が出る。エディタが赤線を引いてくれるだけで、エンジニアの意識は変わる。
  • [Terraform (HashiCorp公式)](https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform): `terraform validate` を保存時に自動実行する設定は必須だ。

隠れたキーボードショートカット(VS Code)

  • `Ctrl + Shift + P` -> `Checkov: Scan` を叩く癖をつけろ。ファイル単位の監査をショートカット一つで行えるようにすれば、巨大なコードベースを読み込むストレスから解放される。

—

3. 実践:CI/CDマージブロックの構成ベストプラクティス

GitHub Actionsで、ポリシー違反があれば容赦なくマージをブロックする構成例だ。

.github/workflows/iac-security.yml
name: IaC Security Scan

on: [pull_request]

jobs:
security-scan:
runs-on: ubuntu-latest
steps:

  • uses: actions/checkout@v3

# tfsecによる高速スキャン(失敗時は即終了)

  • name: tfsec

uses: aquasecurity/tfsec-action@v1.0.0
with:
soft_fail: false # ここをfalseにすることで、違反があればCIを落とす

# Checkovによる詳細監査

  • name: Checkov

uses: bridgecrewio/checkov-action@master
with:
framework: terraform
# 致命的なエラーのみでブロックし、警告は通知に留める運用もアリ
soft_fail: false
skip_check: CKV_AWS_1,CKV_AWS_2 # どうしても例外が必要な場合のみ記述

—

4. 現場で震えるほど役立つ:カスタムポリシーの活用

標準ルールだけで満足してはいけない。「弊社ではS3バケットの暗号化はKMSの特定キーを使う」といったビジネス固有の要件をコード化せよ。

Checkovのカスタムポリシー(Python)例:
特定のタグがついていないリソースを弾くルールだ。

check_tag_existence.py
from checkov.terraform.checks.resource.base_resource_check import BaseResourceCheck
from checkov.common.models.enums import CheckResult, CheckCategories

class S3MustHaveOwnerTag(BaseResourceCheck):
def __init__(self):
name = “Ensure S3 bucket has Owner tag”
id = “CKV_CUSTOM_1”
supported_resources = (‘aws_s3_bucket’,)
super().__init__(name=name, id=id, categories=(CheckCategories.TAGGING,), supported_resources=supported_resources)

def scan_resource_conf(self, conf):
if ‘tags’ in conf:
return CheckResult.PASSED
return CheckResult.FAILED

これを配布し、チーム全員のローカル環境で読み込ませることで、「レビューで何度も同じ指摘をする」という無駄な儀式がこの世から消滅する。

—

5. チーム開発の「鉄の掟」:設定ファイル共有のルール

  • `.tfsec/config.yml` をリポジトリルートに配置せよ: ツール設定をコードとしてコミットし、全メンバーで共通の閾値を共有すること。
  • 例外は「なぜ」をコメントせよ: `tfsec:ignore:aws-s3-enable-bucket-encryption` のようにコメントを添えること。理由なき除外は、セキュリティホールを放置する許可証ではない。
  • 警告(Warning)は放置するな: 「あとで直す」は嘘だ。警告を放置するチームは、いずれ重大な脆弱性を踏む。

最後に:ツールは魔法ではない

Checkovもtfsecも、あくまで「ガードレール」だ。最強の武器は、エンジニア一人ひとりの「コードを書く際、インフラの暗黙的な安全を疑う姿勢」である。

自動化ツールは、人間の思考の時間を、より高度な設計や最適化に捧げるために存在する。さあ、この設定を今すぐあなたのパイプラインに流し込み、コードの品質を一段階上の次元へと引き上げてほしい。健闘を祈る。

タイトルとURLをコピーしました