のぴぴのメモ

自分用のLinuxとかの技術メモ

TerraformコードのセキュリティチェックでCheckovをGitHub Actionsに組み込んでみた

はじめに

Terraformコードのセキュリティーチェックを行う必要があり、IaC用の静的コード解析ツールであるcheckovをGitHub ActionsのCIに組み込んでみた時のメモです。
最初にcheckovをローカルで実行する場合のやりかたを説明して、最後にActionsへの組み込み方法を説明します。

Checkovとは

Checkovは、Infrastracture as code(IaC)コード用の静的コード解析ツールです。Checkovを利用することで、セキュリティやコンプライアンスの問題につながる可能性のある箇所を摘出することができます。解析可能なIaCは以下の通りです(2022/5現在)

  • Terraform (for AWS, GCP, Azure and OCI)
  • CloudFormation (including AWS SAM)
  • Azure Resource Manager (ARM)
  • Serverless framework
  • Helm charts
  • Kubernetes
  • Docker

ローカルPCでの使い方

インストール

インストール方法は、checkovドキュメントのinstalling Checkovを参照ください。

たとえばpip3を利用してインストールする場合は以下のようになります。

pip3 install checkov

インストール後、下記のようにコマンドを打って実行可能なことを確認します。

checkov --version
2.0.1211

(留意事項)レベルアップ

なお、引数なしで実行すると下記のような画面で「追加機能を使えるようレベルアップするか?」という質問が出ます。このレベルアップをするためにyを選択すると、レベルアップに必須となるhttps://www.bridgecrew.cloud/gettingStartedのアカウント作成に必要な情報を対話形式で入力する流れになります。

この設定をすると、checkovの実行結果がbridgecrew.cloudのサイトにアップされることになるようなので、アップされるのを回避したい場合はnを選択して終了するようにしてください。

もしレベルアップを選択してbridgecrew.cloudのサイトにアップされるようになった後に解除する場合ですが、~/.bridgecrew/credentialsにサイトに接続するためのトークンがあるので、このファイルを削除してしまうことで接続されないようになります。

静的解析のやりかた

静的解析の実行方法

たとえばTerraformの実行ディレクトリが/data/HogeHogeSystem/envs/development/の場合、以下のコマンドで静的解析を実施することができます。

checkov --quiet -d /data/HogeHogeSystem/envs/development/
  • --quiet: FAILEDになったものだけ表示されます。(quietをつけない場合は、PASSした結果も表示されます)

実行結果の例です。

指摘事項のスキップ方法(Terraformのオブジェクト単位)

上記の例では、セキュリティーグループを作成しているけど使用されていないよというエラーになります。
ここで指摘内容が正しければコード修正しますが、問題ない場合は該当モジュールにcheckov:skip=check_id:suppression_commentの形式でコメントを追加すると、checkovでチェックをスキップすることができます。

# SG for EC2 instances
resource "aws_security_group" "ec2" {
   #checkov:skip=CKV2_AWS_5:There is no problem because it will be used in the EC2 instance to be added later.
   name        = "${var.vpcname}-ec2"
   description = "For EC2"
   vpc_id      = aws_vpc.this.id
   egress {
     description = "Allow all traffic."
     from_port   = 0
     to_port     = 0
     protocol    = "-1"
     cidr_blocks = ["0.0.0.0/0"]
   }
   tags = {
     Name = "${var.vpcname}-sg-ec2"
   }
}

詳しい内容は、Suppressing and Skipping Policies - checkovを参照ください。

指摘事項のスキップ方法(ルール単位)

また、--skip-checkで指定することで、チェック全体から特定のルールを除外することができます。
たとえばcheckovでは、LOWMEDIUMHIGHCRITICALの4つのseverity区分があります。またルールには、CKV_123のような番号が振られています。
severityがLOWのものと、CKV_123をチェックから除外する場合は、以下のように実行します。

checkov --quiet --skip-check LOW,CKV_123 -d /data/HogeHogeSystem/envs/development/

GitHub ActionsへのCheckovの組み込み

GitHub Actionsのワークフローに、checkovを組み込むことができます。詳細については以下のドキュメントを確認ください。

具体的にはGitHub Actionsに以下のような記載をすることで、Actionsでcheckovを実行することができます。この場合FAILEDになるルールが発生した場合はcheckovコマンドのリターン値が0ではないので、その時点でエラーでフローがアベンドします。
またcheckovの前提でpythonが必要になるため、 actions/setup-python@v4を利用しPythonをセットアップします。

      - name: Terraform Format
        run: terraform fmt -recursive -check -diff

      - name: Set up Python 3.9
        uses: actions/setup-python@v4
        with:
          python-version: 3.9
      - name: Test with Checkov
        id: checkov
        uses: bridgecrewio/checkov-action@master
        with:
          directory: .
          framework: terraform
          quiet: true
          skip_check: LOW

      - name: Terraform Init
        run: terraform init -no-color

エラーが発生した時のスキップ方法など運用方法は、ローカルPCの時と同じになります。
運用としては、このcheckovをmainブランチへのPull Request & Push時のフローに組み込み、セキュリティチェックが通過しないとmainブランチにマージできないようにするなどが考えられます。