GitHub Actions Container Scan
The Container Scan action scans Docker/OCI container images for vulnerabilities, secrets, and malware. It supports local images, registry images, and tar archives, with optional SARIF upload and GitHub Issue creation.
Action Path: qualys/qualys-github/container-scan@v1
Inputs
Authentication
| Input |
Required |
Default |
Description |
qualys_access_token |
Yes |
- |
Qualys API access token for authentication |
qualys_pod |
Yes |
- |
Qualys platform POD (US1, US2, US3, US4, EU1, EU2, IN1, CA1, AU1, AE1, JP1, KSA1) |
Scan Target
| Input |
Required |
Default |
Description |
image_id |
Yes |
- |
Container image to scan (name:tag, digest, or local image ID) |
image_tar |
No |
- |
Path to a tar archive of the image (alternative to image_id) |
platform |
No |
linux/amd64 |
Target platform for multi-arch images (linux/amd64, linux/arm64) |
Scan Options
| Input |
Required |
Default |
Description |
scan_secrets |
No |
false |
Enable secrets detection in container layers |
scan_malware |
No |
false |
Enable malware detection in container |
offline_mode |
No |
false |
Scan without uploading results to Qualys platform |
Thresholds and Policy
| Input |
Required |
Default |
Description |
max_critical |
No |
-1 |
Maximum allowed critical vulnerabilities (-1 = unlimited) |
max_high |
No |
-1 |
Maximum allowed high vulnerabilities (-1 = unlimited) |
max_medium |
No |
-1 |
Maximum allowed medium vulnerabilities (-1 = unlimited) |
max_low |
No |
-1 |
Maximum allowed low vulnerabilities (-1 = unlimited) |
use_policy |
No |
false |
Use Qualys cloud policy evaluation instead of thresholds |
fail_on_audit |
No |
false |
Fail the action if policy result is AUDIT |
GitHub Integration
| Input |
Required |
Default |
Description |
upload_sarif |
No |
false |
Upload SARIF report to GitHub Security tab |
create_issues |
No |
false |
Create GitHub Issues for vulnerabilities |
issue_severities |
No |
4,5 |
Severity levels to create issues for (1-5, comma-separated) |
issue_labels |
No |
security,vulnerability |
Labels to apply to created issues |
Complete Example
name: Container Security Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
scan:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
issues: write
steps:
- uses: actions/checkout@v4
- name: Build container image
run: docker build -t myapp:${{ github.sha }} .
- name: Scan container
id: scan
uses: qualys/qualys-github/container-scan@v1
with:
qualys_access_token: ${{ secrets.QUALYS_ACCESS_TOKEN }}
qualys_pod: US3
image_id: myapp:${{ github.sha }}
scan_secrets: true
scan_malware: true
max_critical: 0
max_high: 5
upload_sarif: true
create_issues: true
issue_severities: '4,5'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check scan results
if: always()
run: |
echo "Total vulnerabilities: ${{ steps.scan.outputs.vulnerability_count }}"
echo "Critical: ${{ steps.scan.outputs.critical_count }}"
echo "High: ${{ steps.scan.outputs.high_count }}"
echo "Scan passed: ${{ steps.scan.outputs.scan_passed }}"
Scanning Remote Images
To scan images from private registries, authenticate before running the scan:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Scan remote image
uses: qualys/qualys-github/container-scan@v1
with:
qualys_access_token: ${{ secrets.QUALYS_ACCESS_TOKEN }}
qualys_pod: US3
image_id: myorg/myapp:latest
Scanning Tar Archives
Scan a previously exported image tar file:
- name: Export and scan image
run: docker save myapp:latest -o myapp.tar
- name: Scan tar archive
uses: qualys/qualys-github/container-scan@v1
with:
qualys_access_token: ${{ secrets.QUALYS_ACCESS_TOKEN }}
qualys_pod: US3
image_tar: myapp.tar
Policy Evaluation
Use Qualys cloud policies instead of local thresholds:
- name: Scan with policy
uses: qualys/qualys-github/container-scan@v1
with:
qualys_access_token: ${{ secrets.QUALYS_ACCESS_TOKEN }}
qualys_pod: US3
image_id: myapp:${{ github.sha }}
use_policy: true
fail_on_audit: true
Outputs
| Output |
Description |
vulnerability_count |
Total number of vulnerabilities found |
critical_count |
Number of critical severity vulnerabilities |
high_count |
Number of high severity vulnerabilities |
medium_count |
Number of medium severity vulnerabilities |
low_count |
Number of low severity vulnerabilities |
secrets_count |
Number of secrets detected |
malware_count |
Number of malware detections |
policy_result |
Policy evaluation result (ALLOW, DENY, AUDIT, or NONE) |
scan_passed |
true/false based on thresholds or policy |
sarif_path |
Path to SARIF report file |
json_path |
Path to JSON report file |
issues_created |
Number of GitHub Issues created |
Next Steps
- Code Scan - Scan source code for vulnerable dependencies
- Configuration - Complete configuration reference
- Overview - Return to GitHub Actions overview