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.
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) orpublic_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 tokenACTIONSGUARD_OUTPUT_DIR: Default output directoryACTIONSGUARD_CHECKS: Default checks to run
Exit Codes
0: Success, no critical issues1: 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:
- Token Issues: docs/TROUBLESHOOTING_TOKEN.md
- General Guide: docs/TOKEN_GUIDE.md
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:orgscope - 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.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- OpenSSF Scorecard - The security checks engine
- PyGithub - GitHub API wrapper
- Click - CLI framework
- Rich - Terminal formatting
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca6222ab10f520b5175ddce64aca99ef2ab6fcccf5c9e019b2587e5e23328183
|
|
| MD5 |
90c855af99c027e5e1a043488de82efa
|
|
| BLAKE2b-256 |
c619b7fa1b54ee48479c71e9e8bb45824b7284a7073dfd53503c89d447855a82
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef6532682be965a99de748d5cbc5b5f317c283a327ecd25835c6f65886f3bb5b
|
|
| MD5 |
e62301ab6f5cfd590c07a5219e3477ea
|
|
| BLAKE2b-256 |
51a7e04e7831320875a5d88e63a0265cb1ea4f18c347247b5cc4c77cedda6eba
|