Harness SAST¶
This document outlines the steps to integrate AccuKnox SAST scanning into the Harness Pipeline. This will allow automating the scan to be triggered on events. The results from the scan will then be visible on the AccuKnox platform for management and resolution.
Prerequisites¶
-
Harness Pipeline
-
SonarQube Instance with access from Harness Pipeline
-
AccuKnox Platform Access
Integration Steps¶
On the AccuKnox platform¶
Step 1: Navigate to Settings → Labels and click on the Add Label button.
Enter a name for the label, use the same as the filename prefix and click on Save
Step 2: Go to Settings → Tokens then click on the Create button
In the subsequent popup, provide a name for the token and click on Generate
Copy the Tenant Id and click on Copy to fetch the API token. These values will be used in the Harness Pipeline.
On SonarQube¶
Step 1: Create a new local project on SonarQube and note the project key. Reference docs
Step 2: Generate SonarQube User Token following the instructions in the official sonarqube docs. Note the token generated.
On Harness¶
Step 1: Create secrets in Harness to store the AccuKnox token and the SonarQube token.
Navigate to Project Settings → Click on Secrets
Select New Secret and click on Text in the dropdown
Enter a Name for the secret, paste the token copied from the AccuKnox platform as the secret value and click on Save
Create another secret with the same method for the token generated from SonarQube
Step 2: Create a stage in the pipeline for the scanning
Navigate to an existing pipeline or create a new pipeline and add a Build Stage into the pipeline
Clone the codebase that needs to be scanned
Select the infrastructure to run the scan and click on Continue.
Step 3: Setup the scanner
Switch to the YAML view and paste the below snippet at the end:
execution:
steps:
- step:
type: Run
name: AccuKnox_SAST
identifier: SAST_Scan
spec:
shell: Bash
command: |-
docker run --rm -e SONAR_HOST_URL="<+stage.variables.SQ_URL>" -e SONAR_SCANNER_OPTS="-Dsonar.projectKey="<+stage.variables.SQ_PROJECT>" -Dsonar.qualitygate.wait="<+stage.variables.QUALITY_GATE>"" -e SONAR_TOKEN="<+stage.variables.SQ_TOKEN>" -v "$(pwd):/usr/src" sonarsource/sonar-scanner-cli || Quality_Gate="Failed"
docker run --rm -e SQ_URL="<+stage.variables.SQ_URL>" -e SQ_AUTH_TOKEN="<+stage.variables.SQ_TOKEN>" -e SQ_PROJECTS="<+stage.variables.SQ_PROJECT>" -e REPORT_PATH=/app/data -v $(pwd):/app/data accuknox/sastjob:latest
for file in `ls -1 SQ-*.json`; do
curl --location --request POST "<+stage.variables.ENDPOINT>/api/v1/artifact/?tenant_id=<+stage.variables.TENANT_ID>&data_type=SQ&save_to_s3=true&label_id=<+stage.variables.LABEL>" \
--header "Tenant-Id: <+stage.variables.TENANT_ID>" \
--header "Authorization: Bearer <+stage.variables.ACCUKNOX_TOKEN>" \
--form "file=@/harness/$file"
done
if [ "<+stage.variables.QUALITY_GATE>" -eq 1 ];then
if [ "$Quality_Gate" == "Failed" ]; then
echo "Quality Gate has failed, pipeline will be halted"
exit 1
else
echo "Quality Gate passed"
fi
fi
variables:
- name: SQ_URL
type: String
description: "The URL to access the SonarQube deployment"
required: true
value: https://your.sonarqube.com/
- name: ENDPOINT
type: String
description: "The AccuKnox endpoint to forward the results"
required: true
value: https://cspm.demo.accuknox.com
- name: TENANT_ID
type: String
description: "The tenant ID fetched from AccuKnox platform"
required: true
value: ""
- name: ACCUKNOX_TOKEN
type: Secret
description: "The API Token fetched from AccuKnox platform"
required: true
value: ""
- name: LABEL
type: String
description: "The name of the label generated from the AccuKnox platform"
required: true
value: ""
- name: SQ_TOKEN
type: Secret
description: "The token generated from the SonarQube Platform"
required: true
value: ""
- name: SQ_PROJECT
type: String
description: "The name/key of the project created in SonarQube"
required: true
value: ""
- name: QUALITY_GATE
type: String
description: "Set to 'true' to fail the pipeline when Quality Gate fails. No action if set to 'false'"
required: true
value: "false"
Step 4: Set the variables for scanning
Click on variables to the right and set the value of the variables:
-
SQ_URL
: The URL to access the SonarQube deployment -
ENDPOINT
: The AccuKnox endpoint to forward the results. (Set to AccuKnox Endpointhttps://cspm.accuknox.com
. Eg. Forapp.demo.accuknox.com
, this is set tohttps://cspm.demo.accuknox.com
) -
TENANT_ID
: The tenant ID fetched from AccuKnox platform -
ACCUKNOX_TOKEN
: The API Token fetched from AccuKnox platform. (Set to the secret that was created in the first step) -
LABEL
: The name of the label generated from the AccuKnox platform -
QUALITY_GATE
: Fails the pipeline if Quality Gate fails when set to 'true'. No action if set to 'false' -
SQ_TOKEN
: The token generated from the SonarQube Platform -
SQ_PROJECT
: The name/key of the project created in SonarQube
After confirming the variables, click on Apply Changes and Save
Pipeline Execution¶
The pipeline has now been configured, click on Run to trigger the scan. Since the QUALITY_GATE
has passed, the pipeline has succeeded without isssues.
If the QUALITY_GATE
has failed, then the pipeline will be halted with the message Quality Gate has failed, pipeline will be halted
To run the pipeline successfully irrespective of quality gate status, set the QUALITY_GATE
variable to false
.
View Results¶
To view the scan results on the AccuKnox platform, navigate to Issues → Findings and select Static Code Analysis Findings from the Findings Type dropdown filter.