-
Notifications
You must be signed in to change notification settings - Fork 978
Expand file tree
/
Copy pathcheck-bomutils-vulnerabilities.yml
More file actions
133 lines (119 loc) · 5.36 KB
/
Copy pathcheck-bomutils-vulnerabilities.yml
File metadata and controls
133 lines (119 loc) · 5.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
name: Check fleetdm/bomutils for vulnerabilities
on:
workflow_dispatch:
inputs:
build_image:
description: "Scan locally-built image instead of published image"
type: boolean
default: false
schedule:
- cron: "0 6 * * *"
# This allows a subsequently queued workflow run to interrupt previous runs
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id}}
cancel-in-progress: true
defaults:
run:
# fail-fast using bash -eo pipefail. See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#exit-codes-and-error-action-preference
shell: bash
permissions:
contents: read
jobs:
check-published:
runs-on: ubuntu-22.04
environment: Docker Hub
permissions:
id-token: write # for aws-actions/configure-aws-credentials
steps:
- name: Harden Runner
uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
with:
egress-policy: audit
- name: Checkout
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
with:
persist-credentials: false
- name: Login to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
- name: Set up Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: "go.mod"
- name: Build fleetdm/bomutils
if: ${{ github.event_name == 'workflow_dispatch' && inputs.build_image }}
run: make bomutils-docker
- name: Clean up Docker build cache
if: ${{ github.event_name == 'workflow_dispatch' && inputs.build_image }}
run: docker builder prune -af
- name: List VEX files
id: generate_vex_files
run: |
echo "VEX_FILES=$(ls -1 ./security/vex/bomutils/ | while IFS= read -r line; do echo "./security/vex/bomutils/$line"; done | tr '\n' ',' | sed 's/.$//')" >> $GITHUB_OUTPUT
# We use the trivy command and not the github action because it doesn't support loading VEX files yet.
- name: Run Trivy vulnerability scanner on fleetdm/bomutils
env:
TRIVY_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-db
TRIVY_JAVA_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-java-db
run: |
mkdir trivy-download
cd trivy-download
curl -L https://github.com/aquasecurity/trivy/releases/download/v0.69.2/trivy_0.69.2_Linux-64bit.tar.gz --output trivy_0.69.2_Linux-64bit.tar.gz
tar -xf trivy_0.69.2_Linux-64bit.tar.gz
mv trivy ..
cd ..
chmod +x ./trivy
./trivy image \
--exit-code=1 \
--ignore-unfixed \
--pkg-types=os,library \
--severity=HIGH,CRITICAL \
--vex="${{ steps.generate_vex_files.outputs.VEX_FILES }}" \
--format=json \
--output=trivy-results.json \
fleetdm/bomutils || trivy_exit_code=$?
# Print a human-readable table to the job log for debugging.
./trivy convert --format table trivy-results.json
exit "${trivy_exit_code:-0}"
- name: Extract CVE list for Slack notification
id: extract_cves
if: failure()
run: |
if [ -f trivy-results.json ]; then
# `safe` JSON-escapes string fields so they can be embedded inline in
# the Slack payload JSON (titles can contain quotes, backslashes, etc.).
# `\\n` (literal backslash-n) is used as the separator so the value
# stays on a single line in $GITHUB_OUTPUT and Slack renders it as a
# newline when parsing the JSON payload.
cve_list=$(jq -r '
def safe(s): (s // "") | tojson | .[1:-1];
[.Results[]?.Vulnerabilities[]?]
| unique_by(.VulnerabilityID + "|" + (.PkgName // ""))
| sort_by(.Severity, .VulnerabilityID)
| map("• *\(.VulnerabilityID)* (\(.Severity // "UNKNOWN")) — \(safe(.PkgName // "?")) \(safe(.InstalledVersion // "?")) → \(safe(.FixedVersion // "?"))\\n _\(safe(.Title // "(no title)"))_")
| join("\\n")
' trivy-results.json)
fi
echo "cve_list=${cve_list:-(no CVE list available — check job logs)}" >> "$GITHUB_OUTPUT"
- name: Slack notification
if: github.event.schedule == '0 6 * * *' && failure()
uses: slackapi/slack-github-action@e28cf165c92ffef168d23c5c9000cffc8a25e117 # v1.24.0
with:
payload: |
{
"text": "${{ job.status }}\n${{ github.event.pull_request.html_url || github.event.head.html_url }}",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "⚠️ Build fleetdm/bomutils and check vulnerabilities failed.\nhttps://github.com/fleetdm/fleet/actions/runs/${{ github.run_id }}\n\n*Detected CVEs:*\n${{ steps.extract_cves.outputs.cve_list }}"
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_G_ORCHESTRATION_WEBHOOK_URL }}
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK