Skip to main content

GitHub Actions security scanner using OpenSSF Scorecard

Project description

ActionsGuard 🛡️

GitHub Actions Security Scanner - Scan your GitHub Actions workflows for security vulnerabilities using OpenSSF Scorecard.

License: MIT Python 3.8+ PyPI version

Features

  • 🔍 Comprehensive Scanning: Scan single repositories, entire organizations, or user accounts
  • 📊 Multiple Report Formats: JSON, HTML, CSV, and Markdown reports
  • 📦 Inventory Tracking: Keep track of all your repos and their security scores over time
  • 🚀 Easy Integration: Use as CLI tool or GitHub Action
  • ⚡ Parallel Execution: Fast scanning with concurrent repository processing
  • 🎯 Focused Checks: Run specific security checks or all OpenSSF Scorecard checks
  • 📈 Beautiful Reports: Visual HTML reports with risk scoring and detailed findings

What It Checks

ActionsGuard leverages OpenSSF Scorecard to check for:

  • Dangerous Workflows: Detects potentially dangerous patterns in GitHub Actions
  • Token Permissions: Ensures proper token permission configuration
  • Pinned Dependencies: Verifies dependencies are pinned to specific versions
  • And 15+ additional security checks

Installation

Prerequisites

Important: ActionsGuard requires OpenSSF Scorecard to be installed first.

Install Scorecard

Recommended: Using Homebrew (macOS & Linux)

brew install scorecard

Alternative: Download Binary Manually

Click to expand manual installation instructions
# macOS (Apple Silicon)
curl -L -o scorecard https://github.com/ossf/scorecard/releases/latest/download/scorecard_darwin_arm64
chmod +x scorecard
sudo mv scorecard /usr/local/bin/scorecard

# macOS (Intel)
curl -L -o scorecard https://github.com/ossf/scorecard/releases/latest/download/scorecard_darwin_amd64
chmod +x scorecard
sudo mv scorecard /usr/local/bin/scorecard

# Linux
curl -L -o scorecard https://github.com/ossf/scorecard/releases/latest/download/scorecard_linux_amd64
chmod +x scorecard
sudo mv scorecard /usr/local/bin/scorecard

Verify Installation:

scorecard version

Install ActionsGuard

Development Installation (Current Method)

Since ActionsGuard is not yet published to PyPI, install from source:

# Clone the repository
git clone https://github.com/cybrking/actions-guard.git
cd actions-guard

# Create virtual environment (recommended)
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Install ActionsGuard in development mode
pip install -e .

# Verify installation
actionsguard --version

Future: Via pip (After PyPI Publication)

pip install actionsguard

Quick Start

1. Set up GitHub Token

Option A: Fine-grained Token (Recommended)

Create at: https://github.com/settings/personal-access-tokens/new

Permissions needed:

  • Repository permissions:
    • Actions: Read
    • Contents: Read
    • Metadata: Read
  • Organization permissions (for org scanning):
    • Members: Read
export GITHUB_TOKEN="github_pat_your_token_here"

Option B: Classic Token

Create at: https://github.com/settings/tokens/new

Scopes needed:

  • repo (for private repos) or public_repo (for public repos only)
  • read:org (for organization scanning)
export GITHUB_TOKEN="ghp_your_token_here"

⚠️ Important for Private Repositories:

If you're scanning your own private repos, you MUST use repo scope (not just public_repo). If you see "0 repositories found", your token likely doesn't have the right permissions.

Quick test:

# Check if your token can see your repos
actionsguard debug --user your-username

The debug command will:

  • Show which user you're authenticated as
  • Display your token scopes
  • List all repositories your token can see
  • Explain why repos might be filtered out

2. Scan a Repository

actionsguard scan --repo owner/repository

3. Scan an Organization or User Account

# Scan an entire organization
actionsguard scan --org your-organization

# Scan a user account (e.g., your personal repos)
actionsguard scan --user cybrking

Usage

CLI Examples

Basic Scanning

# Scan a single repository
actionsguard scan --repo kubernetes/kubernetes

# Scan entire organization
actionsguard scan --org my-org

# Scan a user account (personal repos)
actionsguard scan --user your-user

# Scan with custom token
actionsguard scan --repo owner/repo --token ghp_xxxxxxxxxxxx

Advanced Filtering

# Exclude specific repositories
actionsguard scan --org my-org --exclude repo1,repo2
actionsguard scan --user your-user --exclude forked-repo

# Only scan specific repositories
actionsguard scan --org my-org --only important-repo,critical-repo
actionsguard scan --user your-user --only my-critical-project

# Run specific security checks
actionsguard scan --org my-org --checks Dangerous-Workflow,Token-Permissions

# Run all Scorecard checks
actionsguard scan --org my-org --all-checks

Custom Output

# Change output directory
actionsguard scan --org my-org --output ./security-reports

# Generate specific report formats
actionsguard scan --org my-org --format json,html

# Fail on critical issues (useful for CI/CD)
actionsguard scan --org my-org --fail-on-critical

Parallel Scanning

# Adjust parallel scan workers (default: 5)
actionsguard scan --org my-org --parallel 10

GitHub Action Usage

Add ActionsGuard to your workflow:

name: Security Scan

on:
  schedule:
    - cron: '0 0 * * 0'  # Weekly on Sunday
  workflow_dispatch:

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - name: Run ActionsGuard
        uses: your-username/actionsguard@v1
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          org-name: my-organization
          fail-on-critical: true

      - name: Upload Reports
        uses: actions/upload-artifact@v3
        with:
          name: security-reports
          path: reports/

Action Inputs

Input Description Required Default
github-token GitHub token for API access Yes -
org-name Organization to scan No Current repo org
repo-name Single repository to scan No -
exclude-repos Comma-separated repos to exclude No -
only-repos Only scan these repos No -
checks Specific checks to run No Dangerous-Workflow,Token-Permissions,Pinned-Dependencies
all-checks Run all checks No false
output-format Report formats No html,json,csv,markdown
fail-on-critical Fail if critical issues found No false

Action Outputs

Output Description
reports-path Path to generated reports
critical-count Number of critical issues
overall-score Average security score
summary JSON scan summary

Report Formats

HTML Report

Beautiful, interactive HTML report with:

  • Executive summary with metrics
  • Color-coded risk levels
  • Collapsible sections for easy navigation
  • Direct links to documentation
  • Mobile-responsive design

JSON Report

Machine-readable JSON with complete scan data:

{
  "total_repos": 50,
  "successful_scans": 48,
  "failed_scans": 2,
  "average_score": 7.2,
  "critical_count": 3,
  "results": [...]
}

CSV Report

Spreadsheet-compatible format for analysis in Excel or Google Sheets:

Repository,URL,Score,Risk Level,Critical Issues,High Issues,...
owner/repo1,https://...,6.5,MEDIUM,0,2,...

Markdown Report

GitHub-flavored markdown with emojis and collapsible sections, perfect for:

  • GitHub Issues
  • Pull Request comments
  • Documentation

Configuration

Environment Variables

  • GITHUB_TOKEN: GitHub personal access token
  • ACTIONSGUARD_OUTPUT_DIR: Default output directory
  • ACTIONSGUARD_CHECKS: Default checks to run

Exit Codes

  • 0: Success, no critical issues
  • 1: Critical issues found (with --fail-on-critical)
  • 2: Error during execution

Development

Setup

# Clone repository
git clone https://github.com/cybrking/actions-guard.git
cd actions-guard

# Create virtual environment
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install development dependencies
pip install -e ".[dev]"

Running Tests

pytest tests/ -v --cov=actionsguard

Code Quality

# Format code
black actionsguard/ tests/

# Lint
flake8 actionsguard/ tests/

# Type checking
mypy actionsguard/

CI/CD Integration

GitHub Actions

- name: Security Scan
  run: |
    pip install actionsguard
    actionsguard scan --org ${{ github.repository_owner }} --fail-on-critical

GitLab CI

security_scan:
  script:
    - pip install actionsguard
    - actionsguard scan --org my-org --fail-on-critical
  artifacts:
    paths:
      - reports/

Jenkins

stage('Security Scan') {
    steps {
        sh 'pip install actionsguard'
        sh 'actionsguard scan --org my-org --fail-on-critical'
        publishHTML([
            reportDir: 'reports',
            reportFiles: 'report.html',
            reportName: 'Security Report'
        ])
    }
}

Troubleshooting

For detailed troubleshooting guides, see:

Common Issues

1. Scorecard Command Not Found

Error: OpenSSF Scorecard not found

Solution: Install scorecard using Homebrew:

brew install scorecard

# Verify installation
scorecard version

If you don't have Homebrew, install it from https://brew.sh or see the manual installation instructions in the Prerequisites section above.

2. ActionsGuard Not Found on PyPI

ERROR: Could not find a version that satisfies the requirement actionsguard

Solution: ActionsGuard is not yet published to PyPI. Install from source:

git clone https://github.com/cybrking/actions-guard.git
cd actions-guard
pip install -e .

3. GitHub API Rate Limit

Error: GitHub API rate limit exceeded

Solution:

  • Wait for rate limit reset (check: curl -H "Authorization: token YOUR_TOKEN" https://api.github.com/rate_limit)
  • Use a different token
  • Authenticated requests have higher limits (5000/hour vs 60/hour)

4. Organization Access Denied

Error: No permission to access organization

Solution:

  • For Fine-grained tokens: Ensure "Members: Read" permission is granted under Organization permissions
  • For Classic tokens: Ensure your token has the read:org scope
  • Verify you're a member of the organization or have appropriate access

5. Python Project Not Found

ERROR: file:///path does not appear to be a Python project

Solution: Make sure you're in the correct directory (should contain setup.py and pyproject.toml):

cd actions-guard  # Navigate to the cloned repository
pip install -e .

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for details.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Roadmap

  • SARIF output for GitHub Security tab
  • Comparison mode for regression detection
  • Auto-create GitHub Issues for critical findings
  • Custom security check plugins
  • Web UI for report visualization
  • Integration with more CI/CD platforms

Made with ❤️ by Travis Felder

If you find ActionsGuard useful, please consider giving it a ⭐ on GitHub!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

actionsguard-1.0.0.tar.gz (69.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

actionsguard-1.0.0-py3-none-any.whl (53.8 kB view details)

Uploaded Python 3

File details

Details for the file actionsguard-1.0.0.tar.gz.

File metadata

  • Download URL: actionsguard-1.0.0.tar.gz
  • Upload date:
  • Size: 69.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for actionsguard-1.0.0.tar.gz
Algorithm Hash digest
SHA256 ca6222ab10f520b5175ddce64aca99ef2ab6fcccf5c9e019b2587e5e23328183
MD5 90c855af99c027e5e1a043488de82efa
BLAKE2b-256 c619b7fa1b54ee48479c71e9e8bb45824b7284a7073dfd53503c89d447855a82

See more details on using hashes here.

File details

Details for the file actionsguard-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: actionsguard-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 53.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for actionsguard-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ef6532682be965a99de748d5cbc5b5f317c283a327ecd25835c6f65886f3bb5b
MD5 e62301ab6f5cfd590c07a5219e3477ea
BLAKE2b-256 51a7e04e7831320875a5d88e63a0265cb1ea4f18c347247b5cc4c77cedda6eba

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page