はじめに
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では、LOW
、MEDIUM
、HIGH
、CRITICAL
の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 - checkov
- GitHub - bridgecrewio/checkov-action: A Github Action to run Checkov against an Infrastructure-as-Code repository. Checkov does static security analysis of Terraform, CloudFormation, Kubernetes, serverless framework and ARM templates
具体的には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ブランチにマージできないようにするなどが考えられます。