diff --git a/.github/workflows/generate-augmented-sbom.yml b/.github/workflows/generate-augmented-sbom.yml new file mode 100644 index 00000000..4d1510ab --- /dev/null +++ b/.github/workflows/generate-augmented-sbom.yml @@ -0,0 +1,49 @@ +name: Augment SBOM + +on: + workflow_dispatch: + inputs: + release_version: + description: "Release version (e.g. 3.12.1)" + required: true + type: string + +permissions: + id-token: write + contents: read + +jobs: + augment-sbom: + runs-on: ubuntu-latest + env: + KONDUKTO_TOKEN: ${{ secrets.KONDUKTO_TOKEN }} + KONDUKTO_REPO: ${{ vars.KONDUKTO_REPO }} + KONDUKTO_BRANCH_PREFIX: ${{ vars.KONDUKTO_BRANCH_PREFIX }} + SILKBOMB_IMG: ${{ vars.SILKBOMB_IMG }} + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + + - name: Get current date + id: date + run: echo "date=$(date +'%Y-%m-%d')" >> "$GITHUB_OUTPUT" + + - name: Augment SBOM with Kondukto + env: + RELEASE_VERSION: ${{ inputs.release_version }} + run: ./scripts/compliance/augment-sbom.sh + + - name: Generate SSDLC report + env: + AUTHOR: ${{ github.actor }} + VERSION: ${{ inputs.release_version }} + AUGMENTED_REPORT: "true" + run: ./scripts/compliance/gen-ssdlc-report.sh + + - name: Upload augmented SBOM as artifact + uses: actions/upload-artifact@v4 + with: + name: augmented_sbom_and_ssdlc_report + path: | + compliance/v${{ inputs.release_version }}/augmented-sbom-v${{ inputs.release_version }}-${{ steps.date.outputs.date }}.json + compliance/v${{ inputs.release_version }}/ssdlc-compliance-${{ inputs.release_version }}-${{ steps.date.outputs.date }}.md + if-no-files-found: error diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 75bd1664..cbaaea6d 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -29,7 +29,7 @@ jobs: with: node-version: 18.x - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} @@ -50,7 +50,7 @@ jobs: with: node-version: 18.x - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} @@ -70,7 +70,7 @@ jobs: with: node-version: 18.x - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} @@ -90,7 +90,7 @@ jobs: with: node-version: 18.x - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} @@ -111,7 +111,7 @@ jobs: with: node-version: 18.x - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3cec1822..28c8da23 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -314,3 +314,57 @@ jobs: labels: failed-release title: Publishing v${{ steps.extract-version.outputs.VERSION }} to GitHub Releases failed body: See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + - name: Generate PURL and SBOM + run: | + ./scripts/compliance/gen-purls.sh + ./scripts/compliance/gen-sbom.sh + env: + SILKBOMB_IMG: ${{ vars.SILKBOMB_IMG }} + - name: Upload SBOM to Kondukto + run: ./scripts/compliance/upload-sbom.sh + env: + KONDUKTO_TOKEN: ${{ secrets.KONDUKTO_TOKEN }} + SILKBOMB_IMG: ${{ vars.SILKBOMB_IMG }} + KONDUKTO_REPO: ${{ vars.KONDUKTO_REPO }} + KONDUKTO_BRANCH_PREFIX: ${{ vars.KONDUKTO_BRANCH_PREFIX }} + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + - name: Generate SSDLC report + run: | + AUTHOR="${{ github.actor }}" + export AUTHOR + VERSION="${{ steps.extract-version.outputs.VERSION }}" + export VERSION + ./scripts/compliance/gen-ssdlc-report.sh + env: + KONDUKTO_TOKEN: ${{ secrets.KONDUKTO_TOKEN }} + SILKBOMB_IMG: ${{ vars.SILKBOMB_IMG }} + KONDUKTO_REPO: ${{ vars.KONDUKTO_REPO }} + KONDUKTO_BRANCH_PREFIX: ${{ vars.KONDUKTO_BRANCH_PREFIX }} + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec + with: + gpg_private_key: ${{ secrets.APIX_BOT_GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.APIX_BOT_PASSPHRASE }} + git_user_signingkey: true + git_commit_gpgsign: true + - name: Commit changes + shell: bash + run: | + if [[ $(git status --porcelain) ]]; then + git pull + git config --local user.email svc-api-experience-integrations-escalation@mongodb.com + git config --local user.name svc-apix-bot + git remote set-url origin https://svc-apix-bot:${{ secrets.APIX_BOT_PAT }}@github.com/${{ github.repository }} + git add compliance/v*/* + git commit -m "chore: Update SSDLC report for ${{ steps.extract-version.outputs.VERSION }}" + git push origin + else + echo "No changes to commit." + fi + - name: Upload SBOM as release artifact + uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 + with: + files: compliance/sbom.json + tag_name: ${{ steps.extract-version.outputs.VERSION }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/scripts/compliance/augment-sbom.sh b/scripts/compliance/augment-sbom.sh new file mode 100755 index 00000000..0471e750 --- /dev/null +++ b/scripts/compliance/augment-sbom.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail + +: "${RELEASE_VERSION:?RELEASE_VERSION environment variable not set}" +DATE=$(date +'%Y-%m-%d') + +echo "Augmenting SBOM..." +docker run \ + --pull=always \ + --platform="linux/amd64" \ + --rm \ + -v "${PWD}:/pwd" \ + -e KONDUKTO_TOKEN \ + "$SILKBOMB_IMG" \ + augment \ + --sbom-in "/pwd/compliance/sbom.json" \ + --repo "$KONDUKTO_REPO" \ + --branch "$KONDUKTO_BRANCH_PREFIX" \ + --sbom-out "/pwd/compliance/augmented-sbom-v${RELEASE_VERSION}-${DATE}.json" diff --git a/scripts/compliance/gen-purls.sh b/scripts/compliance/gen-purls.sh new file mode 100755 index 00000000..701144af --- /dev/null +++ b/scripts/compliance/gen-purls.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Reference: .cursor/rules - be surgical, only output PURLs, use jq for JSON parsing + +if ! command -v jq &> /dev/null; then + echo "jq is required but not installed. Please install jq to use this script." + exit 1 +fi + +mkdir -p compliance + +PKG_JSON=package.json + +# Output all npm dependencies, devDependencies, and peerDependencies as PURLs to compliance/purls.txt +yq -r --output-format json '.dependencies | to_entries | .[] | "pkg:npm/" + .key + "@" + .value' $PKG_JSON > compliance/purls.txt +yq -r --output-format json '.devDependencies | to_entries | .[] | "pkg:npm/" + .key + "@" + .value' $PKG_JSON >> compliance/purls.txt +yq -r --output-format json '.peerDependencies | to_entries | .[] | "pkg:npm/" + .key + "@" + .value' $PKG_JSON >> compliance/purls.txt diff --git a/scripts/compliance/gen-sbom.sh b/scripts/compliance/gen-sbom.sh new file mode 100755 index 00000000..d6557737 --- /dev/null +++ b/scripts/compliance/gen-sbom.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Generating SBOM..." +docker run --rm \ + -v "$PWD:/pwd" \ + "$SILKBOMB_IMG" \ + update \ + --purls /pwd/compliance/purls.txt \ + --sbom-out /pwd/compliance/sbom.json diff --git a/scripts/compliance/gen-ssdlc-report.sh b/scripts/compliance/gen-ssdlc-report.sh new file mode 100755 index 00000000..25a7273c --- /dev/null +++ b/scripts/compliance/gen-ssdlc-report.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail + +release_date=${DATE:-$(date -u '+%Y-%m-%d')} + +export DATE="${release_date}" + +if [ -z "${AUTHOR:-}" ]; then + AUTHOR=$(git config user.name) +fi + +if [ -z "${VERSION:-}" ]; then + VERSION=$(git tag --list 'v*' --sort=-v:refname | head -1 | cut -d 'v' -f 2) +fi + +if [ "${AUGMENTED_REPORT:-false}" = "true" ]; then + target_dir="." + file_name="ssdlc-compliance-${VERSION}-${DATE}.md" + SBOM_TEXT=" - See Augmented SBOM manifests (CycloneDX in JSON format): + - This file has been provided along with this report under the name 'linux_amd64_augmented_sbom_v${VERSION}.json' + - Please note that this file was generated on ${DATE} and may not reflect the latest security information of all third party dependencies." + +else # If not augmented, generate the standard report + target_dir="compliance/v${VERSION}" + file_name="ssdlc-compliance-${VERSION}.md" + SBOM_TEXT=" - See SBOM Lite manifests (CycloneDX in JSON format): + - https://github.com/mongodb/awscdk-resources-mongodbatlas/releases/download/v${VERSION}/sbom.json" + # Ensure awscdk-resources-mongodbatlas version directory exists + mkdir -p "${target_dir}" +fi + +export AUTHOR +export VERSION +export SBOM_TEXT + +echo "Generating SSDLC report for MongoDB Atlas AWS CDK Resources version ${VERSION}, author ${AUTHOR} and release date ${DATE}..." + +envsubst < templates/ssdlc-compliance.template.md \ + > "${target_dir}/${file_name}" + +echo "SSDLC compliance report ready. Files in ${target_dir}/:" +ls -l "${target_dir}/" + +echo "Printing the generated report:" +cat "${target_dir}/${file_name}" diff --git a/scripts/compliance/upload-sbom.sh b/scripts/compliance/upload-sbom.sh new file mode 100755 index 00000000..7eebbf4f --- /dev/null +++ b/scripts/compliance/upload-sbom.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Uploading SBOMs..." +docker run --rm \ + -v "$PWD:/pwd" \ + -e KONDUKTO_TOKEN \ + "$SILKBOMB_IMG" \ + upload \ + --sbom-in /pwd/compliance/sbom.json \ + --repo "$KONDUKTO_REPO" \ + --branch "$KONDUKTO_BRANCH_PREFIX" diff --git a/templates/ssdlc-compliance.template.md b/templates/ssdlc-compliance.template.md new file mode 100644 index 00000000..fb603e49 --- /dev/null +++ b/templates/ssdlc-compliance.template.md @@ -0,0 +1,29 @@ +SSDLC Compliance Report: MongoDB Atlas AWS CDK Resources ${VERSION} +================================================================= + +- Release Creator: ${AUTHOR} +- Created On: ${DATE} + +Overview: + +- **Product and Release Name** + - MongoDB Atlas AWS CDK Resources ${VERSION}, ${DATE}. + +- **Process Document** + - https://www.mongodb.com/blog/post/how-mongodb-protects-against-supply-chain-vulnerabilities + +- **Tool used to track third party vulnerabilities** + - [Kondukto](https://arcticglow.kondukto.io/) + +- **Dependency Information** +${SBOM_TEXT} + +- **Security Testing Report** + - Available as needed from Cloud Security. + +- **Security Assessment Report** + - Available as needed from Cloud Security. + +Assumptions and attestations: + +- Internal processes are used to ensure CVEs are identified and mitigated within SLAs.