🔖
GitLab CIでKICSを実行する
やること
- Terraformの静的解析を行う
- KICSの結果をgitlab-commentでMRに出力する
- KICSの結果を基にMRにReviewdogで指摘する
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という名前で変数にあてがう
- -f jq.json
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