今日を知り、明日を変えるシステム運用メディア

GitHub ActionsにCheckovを組み込ませたCI/CDパイプラインを構築する方法

GitHub ActionsにCheckovを組み込ませたCI/CDパイプラインを構築する方法

近年、インフラコードIaCの普及に伴い、コードベースでの設定ミスがセキュリティインシデントの原因となるケースが増加しています。本記事では、GitHub Actionsを活用してCheckovを組み込み「セキュリティを重視したCI/CDパイプラインを構築する方法」を解説します。

本対応を行うと、セキュリティの自動化、開発プロセスの効率化、コンプライアンス対応、チームのスキル向上が同時に実現します。例えば、以下のようなシナリオで効果を発揮するでしょう。

  • 規制産業: 金融やヘルスケア分野で、厳格なコンプライアンス要件を満たす
  • スタートアップ: 少人数でセキュリティを確保し、迅速なプロダクト開発を維持
  • 大企業: 複数のチームやプロジェクトで統一されたセキュリティ基準を適用し、ガバナンスを強化

本記事では、Checkovの基本概要からGitHubリポジトリの準備、実際のワークフロー設定まで、実践的な手順も詳しく紹介します。セキュリティを犠牲にせず、迅速かつ安全なソフトウェアデリバリーを実現できますので、ぜひ効率的で安全な開発環境を目指しましょう。

前提知識

  • Gitの基本操作(git clone, git commit, git push)を理解している。
  • GitHubでリポジトリを作成した経験がある。
  • 基本的なCI/CDやインフラコード(IaC)の概念を知っている。
  • Checkovをインストール済み、またはインストール方法がわかる。

関連リンク:TerraformコードのセキュリティチェックができるCheckovとは

Checkovとは?

Checkovとは、TerraformやCloudFormation、Kubernetesマニフェストなどのインフラコード(IaC)を静的に解析し、セキュリティやコンプライアンスのリスクを検出するオープンソースのチェックツールです

AWS、Azure、Google Cloudといった主要クラウドプラットフォームに対応し、CISベンチマークやNISTなどの標準規格に基づいきチェックするため、コード品質の向上させる事ができます。

たとえば、S3バケットの公開アクセス設定ミスや、セキュリティグループの過剰な許可ルールなどを自動検出し、修正案を提案します。これにより、開発初期段階でセキュリティリスクを低減し、クラウド環境の安全性を確保できます。さらに、Checkovはカスタムルールの作成もサポートしており、組織固有のポリシーを柔軟に適用可能です。

Checkovの概要や使い方については、下記の記事を参考にしてください。

GitHub Actionsとは?

GitHub Actionsは、GitHub内でCI/CDパイプラインを構築するための自動化ツールです。コードの変更に応じてテストやデプロイなどを自動実行し、開発プロセスの効率化をサポートします。

GitHub Actionsの概要

GitHub Actionsは、GitHubリポジトリ内でCI/CD(継続的インテグレーション/デリバリー)のプロセスを実現するためのツールです。リポジトリに変更が加えられた際に自動でテストやビルド、デプロイなどを実行する仕組みを構築できます。

ワークフローはYAML形式で記述され、イベント(例:プルリクエストの作成やブランチへのプッシュ)がトリガーとなって動作します。

ワークフローは「ジョブ」(処理単位)と「ステップ」(各ジョブ内の具体的なタスク)に分かれ、柔軟にカスタマイズ可能です。GitHub Actionsはクラウドベースで稼働し、追加のサーバー設定など特別なセットアップ不要でGitHubリポジトリに統合できる点が特徴です。

事前準備:GitHubのリポジトリを作成する

GitHub Actionsを利用するには、まずリポジトリを用意し、ワークフローを配置する必要があります。ここでは、リポジトリの作成手順と、ブランチの管理について詳しく解説します。特に、mainブランチを保護し、プルリクエストを必須に設定する方法を説明します。

リポジトリ作成

GitHubでリポジトリを作成する手順は次の通りです。新規プロジェクトに適した環境を整えることができます。

【リポジトリ作成手順】

  1. GitHubのアカウントにログインし「New repository」を選択します。

  2. 必要な情報を入力します。
    ・Repository name: リポジトリ名(例:checkov-ci-cd-demo)。
    ・Description: 任意でリポジトリの説明を記載します。
    ・Visibility: 「Public(公開)」または「Private(非公開)」を選択します。
  3. 「Initialize this repository with a README」にチェックを入れると、初期状態でREADME.mdが作成されます。

  4. 「Create repository」ボタンをクリックしてリポジトリを作成します。

GitHub上にリポジトリが新規作成されます。

ブランチの管理

mainブランチへの直接の変更を防ぐため、プルリクエストを必須にするルールを設定します。これにより、レビューを経てコードがマージされるため、安全性が向上します。

【ブランチの保護ルール設定手順】

  1. 作成したリポジトリの「Settings」タブをクリックします。

  2. サイドバーから「Branches」を選択し、Branch protection rulesセクションにある「Add branch ruleset」をクリックします。

  3. Ruleset Nameに「main」を入力します。

  4. TargetsセクションTarget branchesで「Include default branch」を設定します。

  5. 以下のオプションにチェックを入れます。
    ・「Require a pull request before merging」
    ・「Require status checks to pass before merging」

  6. 「Create」または「Save changes」をクリックして設定を保存します。

featureブランチは、特定の機能や修正を実装するためにmainブランチから分岐して作成します。この仕組みにより、作業中の変更を安全に管理できます。

【featureブランチ作成手順】

  1. リポジトリのメインページの「Code」タブを開き「Branch」をクリックします。

  2. 画面右上の「New branch」をクリックします。

  3. 新しいブランチ名を入力(例:feature/add-checkov-workflow)し、「Create branch」をクリックします。

  4. 新しく作成されたfeatureブランチに切り替えられます。

【実践】GitHub ActionsでCheckovを組み込むCI/CDパイプラインを構築する

以下の手順に沿って、GitHub ActionsにCheckovを組み込むワークフローを構築します。セキュリティチェックをCI/CDの一部として組み込み、コードの安全性を確保しましょう。

※mainブランチを修正する場合は、ブランチの保護ルールを解除してください。

ワークフローを設定する

まずは、GitHub ActionsでCheckovを利用するためのワークフローを設定します。ワークフローとは、GitHubリポジトリ内のイベント(例:コードのプッシュやプルリクエストの作成)をトリガーに、定義された一連の処理を自動実行する仕組みです。

今回は、プルリクエストやmainブランチへのプッシュをトリガーにしてCheckovを実行し、セキュリティチェックを行う仕組みを構築します。

このワークフローは、TerraformやCloudFormationなどのインフラコードを対象にスキャンを実行し、問題が検出されるとプルリクエストのマージが拒否されるように設定します。

【手順】

  1. リポジトリの準備
    ・.github/workflows/ ディレクトリを作成します。

・ディレクトリ内に新しいYAMLファイルを作成し、名前を checkov.yml に設定します。

  1. ワークフローの内容を設定
    下記の内容をYAMLファイルにコピーします
name: Infrastructure Code Security Scan with Checkov

on:
  pull_request:
    branches:
      – main
  push:
    branches:
      – main

permissions:
  contents: read

jobs:
  check-security:
    runs-on: ubuntu-22.04
    steps:
      – name: Checkout code
        uses: actions/checkout@v3

      – name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: ‘3.x’

      – name: Install Checkov
        run: pip install checkov

      – name: Run Checkov
        run: checkov -d . –quiet


  1. ファイルを保存

ワークフローをリポジトリに追加する

設定したワークフローをリポジトリに反映させることで、GitHub Actionsが有効になります。このプロセスにより、プルリクエストやプッシュ時にCheckovによるセキュリティチェックが自動で実行されます。

特に、mainブランチの保護ルールを適用している場合、この設定が正しく反映されているかを確認することが重要です。

【手順】

  1. ファイルをリポジトリに追加
    コミットメッセージを記述(例:Add Checkov workflow)し、checkov.ymlをリポジトリにプッシュします。

  2. ワークフローの動作を確認
    featureブランチに切り替えプルリクエストを作成し、GitHub Actionsがトリガーされることを確認します。
    「Actions」タブに移動し、ワークフローが開始されたことを確認。

プルリクエストでCheckovを実行する

ワークフローが正しく設定されると、プルリクエストを作成した際にCheckovが自動的に実行されます。このプロセスにより、インフラコードに潜在的なセキュリティ問題がないか確認できます。問題が検出されると、プルリクエストのマージが拒否される仕組みです。

以下の手順で動作確認を行いましょう。

【手順】

  1. featureブランチで変更を加える
    サンプルのTerraformファイルを追加します。

このファイルをリポジトリ内にterraform/main.tfとして保存し、Checkovスキャンを実行する際に使用します。

# provider設定
provider “aws” {
  region = “ap-northeast-1”
}

# S3バケットの作成
resource “aws_s3_bucket” “example” {
  bucket = “example-bucket-name”
  acl    = “private”

  # サーバーサイド暗号化設定
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = “AES256”
      }
    }
  }

  tags = {
    Name        = “example-bucket”
    Environment = “dev”
  }
}
  1. プルリクエストを作成
    featureブランチからmainブランチへのプルリクエストを作成します。

  2. セキュリティチェックの実行結果を確認

「Actions」タブでCheckovのスキャン結果を確認します。

問題が検出されるとプルリクエスト画面から詳細へ移動できます。

Checkovのカスタムルール作成方法

Checkovではデフォルトのルールセットだけでなく、独自のカスタムルールを作成することも可能です。これにより、プロジェクト固有のセキュリティ要件やベストプラクティスを反映したチェックを追加できます。

カスタムルールはPythonで記述され、Checkovのルールセットに組み込まれます。以下の手順に従って設定を行いましょう。

【手順】

  1. カスタムルールのPythonファイルを作成
    リポジトリ内に新しいファイルを作成(例:/custom_checks/custom_check.py)
  2. 以下のような簡単なカスタムルールを追加します
from checkov.common.models.enums import CheckResult, CheckCategories
from checkov.terraform.checks.resource.base_resource_check import BaseResourceCheck

class CustomRule(BaseResourceCheck):
    def __init__(self):
        name = “Ensure S3 buckets have encryption enabled”
        id = “CUSTOM_001”
        categories = [CheckCategories.SECURITY]
        supported_resources = [“aws_s3_bucket”]
        super().__init__(name=name, id=id, categories=categories, supported_resources=supported_resources)

    def scan_resource_conf(self, conf):
        if “server_side_encryption_configuration” in conf:
            return CheckResult.PASSED
        return CheckResult.FAILED

scanner = CustomRule()
  1. .github/workflows/checkov.ymlにカスタムルールを追記します。
name: Infrastructure Code Security Scan with Checkov

on:
  pull_request:
    branches:
      – main
  push:
    branches:
      – main

permissions:
  contents: read

jobs:
  check-security:
    runs-on: ubuntu-22.04
    steps:
      – name: Checkout code
        uses: actions/checkout@v3

      – name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: ‘3.x’

      – name: Install Checkov
        run: pip install checkov

      – name: Export custom check directory
        run: export BC_CUSTOM_CHECK_DIR=./custom_checks

      – name: Run Checkov
        run: checkov -d . –check CUSTOM_001
  1. プルリクエストをトリガーにCheckovが起動します。
    「Actions」タブより結果を確認します。

  2. Checkovが成功した場合はmainブランチへマージが可能です。

まとめ

本記事では、GitHub ActionsとCheckovを活用し、セキュアなCI/CDパイプラインを構築する方法を解説しました。Checkovを利用することで、TerraformやCloudFormationなどのインフラコードを自動的にチェックし、セキュリティリスクや設定ミスを早期に発見できます。

また、GitHubリポジトリのブランチ保護ルールやカスタムルールを導入することで、プロジェクト固有の要件にも対応可能です。GitHub Actionsを活用した自動化により、チームの開発スピードを維持しながら品質を向上できます。

この記事を参考に、効率的で安全な開発環境を実現してください。

現在クラウドエンジニアとして勤務。AWS(SAP、DOP)とAzure(AZ-305)の資格を保有しており、ネットワークやセキュリティに関する業務を主に行っています。

人気の記事

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録