---
name: ci-cd-security
description: Security best practices for GitHub Actions workflows, supply chain security, and secure CI/CD pipelines
license: Apache-2.0
---

# CI/CD Security Skill


## 🔴 AI FIRST Quality Principle

> **Apply the AI FIRST principle: never accept first-pass quality. Minimum 2 iterations. Read all output, improve every section. No shortcuts.**

## Purpose

Implement security-hardened CI/CD pipelines using GitHub Actions with least privilege, supply chain security, and comprehensive monitoring.

## Core Principles

### 1. Least Privilege Permissions
Always grant minimum necessary permissions:

```yaml
permissions:
  contents: read       # Read repo content
  pull-requests: write # Only if managing PRs
  issues: write        # Only if managing issues
  # Deny everything else by default
```

### 2. Pin Actions to SHA
Never use tags - always pin to commit SHA:

```yaml
# ❌ Bad: Using tag (can be moved)
- uses: actions/checkout@v4

# ✅ Good: Pinned to SHA (immutable)
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
```

### 3. Harden Runner
Use step-security/harden-runner on every job:

```yaml
- name: Harden Runner
  uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9
  with:
    egress-policy: audit  # Log all network calls
```

### 4. Secrets Management
```yaml
# ✅ Use GitHub Secrets
- env:
    TOKEN: \${{ secrets.GITHUB_TOKEN }}
  run: |
    # Never echo secrets
    curl -H "Authorization: Bearer \$TOKEN" ...

# ❌ Never hardcode
TOKEN="ghp_hardcoded_token"  # NEVER DO THIS
```

### 5. Supply Chain Security
```yaml
- name: Dependency Review
  uses: actions/dependency-review-action@SHA
  
- name: CodeQL Scanning
  uses: github/codeql-action/analyze@SHA
```

## Security-Hardened Workflow Template

```yaml
name: Secure Workflow

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9
        with:
          egress-policy: audit
          allowed-endpoints: >
            github.com:443
            api.github.com:443
            
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
        
      - name: Setup Node
        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238
        with:
          node-version: '26'
          cache: 'npm'
          
      - name: Install Dependencies
        run: npm ci
        
      - name: Run Security Checks
        run: |
          npm audit
          npm run lint
          npm test
```

## Supply Chain Security

### Dependency Scanning
```yaml
- name: Run Dependency Review
  uses: actions/dependency-review-action@SHA
  with:
    fail-on-severity: moderate
```

### Code Scanning
```yaml
- name: Initialize CodeQL
  uses: github/codeql-action/init@SHA
  with:
    languages: javascript, python
    
- name: Perform CodeQL Analysis
  uses: github/codeql-action/analyze@SHA
```

### Secret Scanning
Enable in repository settings:
- GitHub secret scanning
- Push protection
- Custom patterns if needed

## Remember

- **Least Privilege**: Grant minimal permissions
- **Pin to SHA**: Immutable action versions
- **Harden Runner**: Audit all network egress
- **Scan Everything**: Dependencies, code, secrets
- **Never Trust**: Validate all inputs
- **Monitor Continuously**: Review audit logs

## References

- [GitHub Actions Security](https://docs.github.com/en/actions/security-guides)
- [Step Security](https://github.com/step-security/harden-runner)
- [SLSA Framework](https://slsa.dev/)
