🔖

GitLab CIでKICSを実行する

2023/12/10に公開

やること

KICSの実行

  • $ kics scan --config kics.yaml
kics.yaml
path: "." # 解析するTerraformの場所
output-path: "." # 結果の出力先
report-formats: json # 結果をjsonにする
no-progress: true # 進捗を出さない
no-color: true # 色を付けない
minimal-ui: true # 標準出力における結果を最小限にする
ignore-on-exit: results # 指摘事項があってもエラーにしない。KICS自体のエラーは無視しない
type: # Terraformに限定
  - Terraform
exclude-severities: # 除外するseverity
  - "low"
  - "info"
exclude-queries: # 除外するクエリ
  # S3 Bucket Without Enabled MFA Delete
  # https://docs.kics.io/latest/queries/terraform-queries/aws/c5b31ab9-0f26-4a49-b8aa-4cc064392f4d/
  - c5b31ab9-0f26-4a49-b8aa-4cc064392f4d

gitlab-comment

  • minimal-ui: trueにしてもロゴは非表示にできなかったので、sed -n '/Files scanned:/,$p'で非表示にする
  • コードにすべくsed -n -e '1i ```' -e '$a ```'を実行し```で囲む
.gitlab-ci.yaml
kics:
  image:
    name: checkmarx/kics:v1.7.11
  variables:
    GITLAB_COMMENT_VERSION: 0.2.5
  only:
    refs:
      - merge_requests
  before_script:
    - apk --no-cache add curl
    - curl -sSfL https://github.com/yuyaban/gitlab-comment/releases/download/v${GITLAB_COMMENT_VERSION}/gitlab-comment_${GITLAB_COMMENT_VERSION}_linux_amd64.tar.gz -o gitlab-comment_${GITLAB_COMMENT_VERSION}_linux_amd64.tar.gz
    - tar zxvf gitlab-comment_${GITLAB_COMMENT_VERSION}_linux_amd64.tar.gz
  script:
    - kics scan --config kics.yaml | sed -n -e '/Files scanned:/,$p' -e '1i ```' -e '$a ```' | ./gitlab-comment post --stdin-template

Reviewdog

KICSの結果をrdjsonに変換する

rdjson: Reviewdog Diagnostic Formatという汎用的な診断フォーマット

  • Severity, Query name, URL, Description, Expected value, Actual valueをMRにコメントする
  • URLは結果にないので、https://docs.kics.io/latest/queries/terraform-queries/" + (.query.cloud_provider | ascii_downcase) + "/" + .query.query_idで自分で組み立てる
jq.json
{
  "source": {
    "name": "Checkmarx/kics",
    "url": "https://github.com/Checkmarx/kics"
  },
  "severity": "WARNING",
  "diagnostics": [$kics[0].queries[] | {query: ., file: .files[]} | {
    "message": ("**Severity**: " + .query.severity + "<br> **Name**: " + .query.query_name  +  "<br> **URL**: https://docs.kics.io/latest/queries/terraform-queries/" + (.query.cloud_provider | ascii_downcase) + "/" + .query.query_id +  "<br> **Description**: " + .query.description + "<br> **Expected value**: " + .file.expected_value + "<br> **Actual value**" + .file.actual_value),
    "location": {
      "path": .file.file_name,
      "range": {
        "start": {
          "line": .file.line
        }
      }
    }
  }]
}
  • $ jq -n --slurpfile kics results.json -f jq.json | reviewdog -f=rdjson ...
    • -f jq.json
      • ファイルからフィルターを読み込む
    • --slurpfile kics results.json
      • results.jsonをkicsという名前で変数にあてがう

GitLab CI

kics:
  image:
    name: checkmarx/kics:v1.7.11
  only:
    refs:
      - merge_requests
  before_script:
    - apk --no-cache add jq
  script:
    - kics scan --config kics.yaml
    - jq -n --slurpfile kics results.json -f jq.json | reviewdog -f=rdjson -reporter=gitlab-mr-discussion # -filter-mode=nofilter

エラーでmerge-base commitが取得できない場合

  • GIT_DEPTHを設定して範囲を広げる
variables:
  GIT_DEPTH: 0

Discussion