Checkov — Terraformコードの静的解析ツール入門

1. 概要

  • Checkovとは何か(Bridgecrewが開発する静的解析ツール)
  • Checkovの特徴とtfsecとの違い
  • インストールと基本的な使い方
  • GitHub ActionsへのCI統合
  • よく使うチェックと抑制方法

CheckovはBridgecrew(Palo Alto Networks)が開発するIaC静的解析ツールです。Terraform / CloudFormation / Kubernetes / Helmなど多様なIaCをサポートしています。


2. Checkovのインストールと基本的な使い方

# pipでインストール
pip install checkov

# バージョン確認
checkov --version

# カレントディレクトリのTerraformをスキャン
checkov -d .

# 特定ディレクトリ
checkov -d ./environments/production

# JSON出力
checkov -d . -o json > checkov_results.json

# 重要度でフィルタ
checkov -d . --check CKV_AWS_8    # 特定チェックのみ
checkov -d . --skip-check CKV_AWS_8  # 特定チェックをスキップ

3. スキャン対象コード例

terraform {
  required_version = ">= 1.9"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

variable "environment" {
  description = "環境名"
  type        = string
  default     = "dev"
}

data "aws_ami" "amazon_linux_2023" {
  most_recent = true
  owners      = ["amazon"]
  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

# ✅ CheckovがPASSするコード
resource "aws_instance" "web" {
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = "t3.micro"
  # CKV_AWS_135: EC2に詳細モニタリング(任意)
  # CKV_AWS_126: 終了保護(任意)

  root_block_device {
    volume_size = 20
    volume_type = "gp3"
    encrypted   = true  # CKV_AWS_8: EBS暗号化 → PASS
  }

  metadata_options {
    http_tokens = "required"  # CKV_AWS_79: IMDSv2必須 → PASS
  }

  tags = {
    Name        = "${var.environment}-web"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

4. Checkovのよくチェック項目

チェックID対象内容
CKV_AWS_8aws_instanceEBSのencrypted=trueか
CKV_AWS_79aws_instanceIMDSv2が必須(http_tokens=required)か
CKV_AWS_18aws_s3_bucketS3のアクセスログ有効化
CKV_AWS_19aws_s3_bucketS3のサーバーサイド暗号化
CKV_AWS_16aws_db_instanceRDSのstorage_encrypted=true
CKV_AWS_23aws_security_groupSGがSSH(22)/RDP(3389)を全開放していないか
CKV2_AWS_62aws_s3_bucketS3のEvent Notificationsの設定

5. GitHub ActionsへのCI統合

# .github/workflows/checkov.yml
name: Checkov Security Scan

on:
  pull_request:
    branches: [main]

permissions:
  contents: read
  security-events: write

jobs:
  checkov:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run Checkov
        uses: bridgecrewio/checkov-action@master
        with:
          directory: .
          framework: terraform
          output_format: sarif
          output_file_path: checkov_results.sarif
          soft_fail: true   # 段階的導入時はtrueにしてパイプラインを止めない

      - name: Upload SARIF results
        uses: github/codeql-action/upload-sarif@v3
        if: always()
        with:
          sarif_file: checkov_results.sarif

SARIFフォーマットで出力するとGitHub Security Alertsと連携できます。


6. チェックの抑制

# コード内でチェックを抑制
#checkov:skip=CKV_AWS_135: 詳細モニタリングは開発環境では不要
resource "aws_instance" "web" {
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = "t3.micro"
  # ...
}

.checkov.yaml設定ファイルでプロジェクト全体のスキップを設定することもできます。


7. tfsecとの違い

比較軸tfsecCheckov
対応IaCTerraform専用Terraform / CloudFormation / k8s等
チェック数約400+約1,000+
SARIF出力
GitHub Actions連携
カスタムポリシーPython / RegoPython / Rego
管理元Aqua SecurityPalo Alto(Bridgecrew)

8. 関連記事


9. まとめ

  • CheckovはTerraformを含む多様なIaCを静的解析するツール。tfsecよりチェック数が多い
  • よく検出される問題: EBS暗号化・IMDSv2・S3暗号化・RDS暗号化・SG全開放
  • SARIFフォーマットでGitHub Security Alertsと連携できる
  • tfsecかCheckovか迷ったら: Terraform専用ならtfsec、多様なIaCを横断するならCheckov

対象バージョン: Checkov >= 3.0 / Terraform >= 1.9 公式ドキュメント: https://www.checkov.io/