Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions example/actions/github/checkov.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Checkov Security Scan

on:
pull_request:
branches: [ main ]

jobs:
checkov:
runs-on: ubuntu-latest
name: checkov-action
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Get changed Terraform directories
id: changed-dirs
run: |
# Get changed .tf files in the PR
changed_files=$(git diff --name-only origin/main...HEAD | grep '\.tf$' || true)

if [ -z "$changed_files" ]; then
echo "No Terraform files changed"
echo "has_changes=false" >> $GITHUB_OUTPUT
exit 0
fi

# Extract unique directories containing .tf files
directories=$(echo "$changed_files" | xargs dirname | sort -u | tr '\n' ',' | sed 's/,$//')
echo "directories=$directories" >> $GITHUB_OUTPUT
echo "has_changes=true" >> $GITHUB_OUTPUT
echo "Changed Terraform directories: $directories"

- name: Run Checkov action
if: steps.changed-dirs.outputs.has_changes == 'true'
id: checkov
uses: bridgecrewio/checkov-action@master
with:
directory: ${{ steps.changed-dirs.outputs.directories }}
framework: terraform
check: CUSTOM_*
external_checks_dirs: ./example/checkov/
20 changes: 20 additions & 0 deletions example/checkov/terraform-base-rule.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
metadata:
id: "CUSTOM_AWS_PROVIDER_CHECK"
name: "Check the tags and regions"
category: "CONVENTION"
scope:
provider: "AWS"
definition:
and:
- cond_type: "attribute"
resource_types:
- "provider"
attribute: "default_tags.tags.owner"
operator: exists
- cond_type: "attribute"
resource_types:
- "provider"
attribute: "region"
operator: "equals"
value: "ap-northeast-2"
99 changes: 96 additions & 3 deletions scripts/operations.yaml
Original file line number Diff line number Diff line change
@@ -1,10 +1,103 @@
issues:
- title: checkovによるポリシーチェック
body: |
hoge
- title: trivyによるセキュリティスキャン
プロジェクト独自のルールや規約(命名規則、タグ付けルール、リージョン制約など)を自動的に検査し、遵守を確保することは重要です。ポリシーチェックツールを使用することで、これらのプロジェクト固有のルールとセキュリティベストプラクティスの両方を自動検査し、コードの品質とセキュリティを向上させることができます。

# ポリシーチェックの必要性
- プロジェクト固有のルール(命名規則、タグ付け、リージョン制約)の遵守確認が必要
- 複数開発者による一貫した設定の維持とコードの統一性の確保
- 手動によるルール確認は時間がかかり、見落としやヒューマンエラーが発生しやすい

# 解決策
- **Checkov**: YAMLベースの直感的なカスタムポリシー定義、TerraformとKubernetes両対応(本プラクティス採用)
- **Trivy**: 高速実行、統合セキュリティスキャナー、カスタムポリシーはOPA/Regoが必要
- **Terrascan**: OPA/Regoベース、柔軟だが学習コストが高い
- **KICS**: 独自のクエリ言語、カスタムポリシー作成が複雑

本プラクティスではYAMLでのカスタムポリシー定義が容易で、TerraformとKubernetesの両方に対して統一的なポリシー管理が可能なCheckovを採用します。

# Checkovによるポリシーチェック
- Checkovは1000以上のセキュリティ・コンプライアンスチェックを内蔵
- Terraform、Kubernetes、Docker、CloudFormationなど多様な形式をサポート
- カスタムポリシーの作成により組織固有のルールを適用可能
- JSON、SARIF、JUnit形式での結果出力によりCI/CD統合が容易

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

- [Quick Start - checkov](https://www.checkov.io/1.Welcome/Quick%20Start.html)

## 主要なチェック項目

- [kubernetes resource scans - checkov](https://www.checkov.io/5.Policy%20Index/kubernetes.html)
- [terraform resource scans - checkov](https://www.checkov.io/5.Policy%20Index/terraform.html)

## カスタムポリシーの作成

[Custom Policies Overview - checkov](https://www.checkov.io/3.Custom%20Policies/Custom%20Policies%20Overview.html)

# プラクティス

## 基本的なCheckovスキャン
- checkovをローカル端末にインストール
- カスタムポリシーを定義し、プロジェクトのルールを自動検査
- 今回はあえてチェックに`失敗`するようなポリシーを定義(作成したポリシーを別のissueで使います。)
- codes/checkovディレクトリを作成
- ディレクトリ内にカスタムポリシーのYAMLを作成
- ポリシーのIDは`CUSTOM_AWS_PROVIDER_CHECK`にする
- TerraformのAWSプロバイダーにdefault_regionが`us-west-1`である事を確認
- 作成したポリシーを使いcheckovを実行しカスタムポリシーの確認結果が`FAILED`になることを確認
- 対象は`codes/actions/terraform`ディレクトリなど任意
- `--chekc "CUSTOM_*"`を付けるとカスタムポリシーのみチェックできる
- title: CheckovによるポリシーチェックをCIに組み込む
body: |
hoge
CI/CDパイプラインにポリシーチェックを統合することで、開発者が変更をプッシュする度に自動的にセキュリティとコンプライアンスの検証を行い、問題のあるコードが本番環境にデプロイされることを防げます。

# CI統合の必要性
- 開発者の手動実行に依存すると、ポリシーチェックが忘れられる可能性がある
- プルリクエスト時点での自動検証により、早期に問題を発見・修正できる
- 継続的なセキュリティとコンプライアンスの維持が可能になる
- チーム全体での一貫したポリシー適用の強制ができる

# 解決策
- **GitHub Actions**: 無料プラン利用可能、Checkovの公式アクションあり、設定が簡単(本プラクティス採用)
- **GitLab CI**: GitLab利用時の選択肢、Dockerイメージでの実行
- **Jenkins**: 自前構築が必要、柔軟性が高い
- **CircleCI**: 有料プラン必要、高性能な実行環境

本プラクティスではGitHub Actionsを使用し、プルリクエスト時に自動的にCheckovスキャンを実行する仕組みを構築します。

# GitHub ActionsでのCheckov統合
- Checkovには公式のGitHub Actionが提供されている
- プルリクエスト作成時およびコードプッシュ時に自動実行
- 結果をプルリクエストのコメントに表示可能
- 失敗時のワークフロー停止により問題のあるマージを防止

# プラクティス

## 前提

- checkovによるポリシーチェック のissueを完了していること

## CI統合のためのワークフロー作成
- `.github/workflows/`ディレクトリに`checkov.yml`ワークフローファイルを作成
- mainへのプルリクエストをトリガーとしてワークフローを実行
- [checkov-action](https://github.com/bridgecrewio/checkov-action)を参考にcheckovを実行
- Terraformディレクトリ(`codes/actions/terraform`等)をスキャン
- フレームワークは`terraform`
- カスタムポリシー(`codes/checkov/`)を使用
- チェックは`CUSTOM_*`のみ

## ワークフローのテスト
- 作業ブランチをリモートにプッシュしPRを作成
- GitHub Actionsでチェックが自動で行われ**失敗**することを確認
- `codes/checkov`配下のポリシーを修正しリモートに再プッシュ
- GitHub Actionsでチェックが自動で行われ**成功**することを確認

## 更に発展的なプラクティス
このプラクティスは余裕がなければやらなくてもいいです。

- 対象ディレクトリをハードコードではなく変更のあったTerraformディレクトリにする

- title: AtlantisによるPRベースのterraform plan/apply
body: |
hoge
Expand Down