File 80-vulnerability-scan-trivy of Package post-build-checks-containers.41016
#!/bin/bash
#
# Perform vulnerability scan of a container image built by OBS using Trivy.
# Strict mode
set -euo pipefail
TOPDIR="/usr/src/packages"
#OUTPUTDIR="$TOPDIR/"
# Helper functions
log() {
echo "$@" >&2
}
check_required_environment_variables() {
local required_environment_variable
for required_environment_variable in "$@"; do
if [[ -z ${!required_environment_variable:-} ]]; then
log "Missing environment variable '$required_environment_variable'"
return 1
fi
done
}
containerinfos() {
find "$OUTPUTDIR" -type f -name '*.containerinfo'
}
check_required_environment_variables BUILD_DIR BUILD_ROOT
log "Retrieving container image metadata"
CONTAINERINFO="$(find "$TOPDIR" -name '*.containerinfo' -print -quit)"
OUTPUTDIR=`dirname $CONTAINERINFO`
CONTAINER_NAME="$(basename "$CONTAINERINFO" | sed 's/\.containerinfo$//')"
CONTAINER_TAG="$(python3 -c \
'import json, sys; print(json.load(sys.stdin)["tags"][0])' \
<"$CONTAINERINFO")"
log "Container image tag to check: $CONTAINER_TAG"
CONTAINER_UNPACKED_DIR=`mktemp -d`
TRIVY_RESULT="$(mktemp)"
find `dirname $CONTAINER_NAME` -name "*.tar" | while read tarname
do
echo "tarname is $tarname"
log "Scanning image $tarname with Trivy"
trivy image \
--cache-dir /usr/share/trivy/cache \
--detection-priority comprehensive \
--format cosign-vuln \
--offline-scan \
--skip-db-update \
--skip-java-db-update \
--output "$TRIVY_RESULT" \
--input $tarname \
"$CONTAINER_UNPACKED_DIR"
done
cat $TRIVY_RESULT
# Convert file to the Cosign Vulnerability Scan Record Attestation Spec format
# https://github.com/sigstore/cosign/blob/main/specs/COSIGN_VULN_ATTESTATION_SPEC.md
# NOTE: The subject will be filled by OBS during publishing
# This command merges the files, avoid --argjson due to error using large files
OUTPUT_FILE="$OUTPUTDIR/$CONTAINER_NAME.trivy_vuln.intoto.json"
jq -s '.[1].predicate = .[0] | .[1]' "$TRIVY_RESULT" - >"$OUTPUT_FILE" <<EOF
{
"_type": "https://in-toto.io/Statement/v0.1",
"predicateType": "https://cosign.sigstore.dev/attestation/vuln/v1",
"subject": [
{
"name": "",
"digest": {
"sha256": ""
}
}
],
"predicate": {}
}
EOF
log "Cleaning up"
rm "$TRIVY_RESULT"