Initial commit
This commit is contained in:
708
skills/appsec/api-spectral/SKILL.md
Normal file
708
skills/appsec/api-spectral/SKILL.md
Normal file
@@ -0,0 +1,708 @@
|
||||
---
|
||||
name: api-spectral
|
||||
description: >
|
||||
API specification linting and security validation using Stoplight's Spectral with support for
|
||||
OpenAPI, AsyncAPI, and Arazzo specifications. Validates API definitions against security best
|
||||
practices, OWASP API Security Top 10, and custom organizational standards. Use when: (1) Validating
|
||||
OpenAPI/AsyncAPI specifications for security issues and design flaws, (2) Enforcing API design
|
||||
standards and governance policies across API portfolios, (3) Creating custom security rules for
|
||||
API specifications in CI/CD pipelines, (4) Detecting authentication, authorization, and data
|
||||
exposure issues in API definitions, (5) Ensuring API specifications comply with organizational
|
||||
security standards and regulatory requirements.
|
||||
version: 0.1.0
|
||||
maintainer: SirAppSec
|
||||
category: appsec
|
||||
tags: [api-security, openapi, asyncapi, linting, spectral, api-governance, owasp-api, specification-validation]
|
||||
frameworks: [OWASP]
|
||||
dependencies:
|
||||
tools: [node, npm]
|
||||
optional: [docker, git]
|
||||
references:
|
||||
- https://docs.stoplight.io/docs/spectral/674b27b261c3c-overview
|
||||
- https://github.com/stoplightio/spectral
|
||||
- https://owasp.org/API-Security/editions/2023/en/0x11-t10/
|
||||
---
|
||||
|
||||
# API Security with Spectral
|
||||
|
||||
## Overview
|
||||
|
||||
Spectral is a flexible JSON/YAML linter from Stoplight that validates API specifications against
|
||||
security best practices and organizational standards. With built-in rulesets for OpenAPI v2/v3.x,
|
||||
AsyncAPI v2.x, and Arazzo v1.0, Spectral helps identify security vulnerabilities, design flaws,
|
||||
and compliance issues during the API design phase—before code is written. Custom rulesets enable
|
||||
enforcement of OWASP API Security Top 10 patterns, authentication standards, and data protection
|
||||
requirements across your entire API portfolio.
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
# Install via npm
|
||||
npm install -g @stoplight/spectral-cli
|
||||
|
||||
# Or using Yarn
|
||||
yarn global add @stoplight/spectral-cli
|
||||
|
||||
# Or using Docker
|
||||
docker pull stoplight/spectral
|
||||
|
||||
# Verify installation
|
||||
spectral --version
|
||||
```
|
||||
|
||||
### Basic API Specification Linting
|
||||
|
||||
```bash
|
||||
# Lint OpenAPI specification with built-in rules
|
||||
spectral lint openapi.yaml
|
||||
|
||||
# Lint with specific ruleset
|
||||
spectral lint openapi.yaml --ruleset .spectral.yaml
|
||||
|
||||
# Output as JSON for CI/CD integration
|
||||
spectral lint openapi.yaml --format json --output results.json
|
||||
```
|
||||
|
||||
### Quick Security Scan
|
||||
|
||||
```bash
|
||||
# Create security-focused ruleset
|
||||
echo 'extends: ["spectral:oas"]' > .spectral.yaml
|
||||
|
||||
# Lint API specification
|
||||
spectral lint api-spec.yaml --ruleset .spectral.yaml
|
||||
```
|
||||
|
||||
## Core Workflow
|
||||
|
||||
### Workflow Checklist
|
||||
|
||||
Progress:
|
||||
[ ] 1. Install Spectral and select appropriate base rulesets
|
||||
[ ] 2. Create or configure ruleset with security rules
|
||||
[ ] 3. Identify API specifications to validate (OpenAPI, AsyncAPI, Arazzo)
|
||||
[ ] 4. Run linting with appropriate severity thresholds
|
||||
[ ] 5. Review findings and categorize by security impact
|
||||
[ ] 6. Map findings to OWASP API Security Top 10
|
||||
[ ] 7. Create custom rules for organization-specific security patterns
|
||||
[ ] 8. Integrate into CI/CD pipeline with failure thresholds
|
||||
[ ] 9. Generate reports with remediation guidance
|
||||
[ ] 10. Establish continuous validation process
|
||||
|
||||
Work through each step systematically. Check off completed items.
|
||||
|
||||
### Step 1: Ruleset Configuration
|
||||
|
||||
Create a `.spectral.yaml` ruleset extending built-in security rules:
|
||||
|
||||
```yaml
|
||||
# .spectral.yaml - Basic security-focused ruleset
|
||||
extends: ["spectral:oas", "spectral:asyncapi"]
|
||||
|
||||
rules:
|
||||
# Enforce HTTPS for all API endpoints
|
||||
oas3-valid-schema-example: true
|
||||
oas3-server-not-example.com: true
|
||||
|
||||
# Authentication security
|
||||
operation-security-defined: error
|
||||
|
||||
# Information disclosure prevention
|
||||
info-contact: warn
|
||||
info-description: warn
|
||||
```
|
||||
|
||||
**Built-in Rulesets:**
|
||||
- `spectral:oas` - OpenAPI v2/v3.x security and best practices
|
||||
- `spectral:asyncapi` - AsyncAPI v2.x validation rules
|
||||
- `spectral:arazzo` - Arazzo v1.0 workflow specifications
|
||||
|
||||
**Ruleset Selection Best Practices:**
|
||||
- Start with built-in rulesets and progressively add custom rules
|
||||
- Use `error` severity for critical security issues (authentication, HTTPS)
|
||||
- Use `warn` for recommended practices and information disclosure risks
|
||||
- Use `info` for style guide compliance and documentation completeness
|
||||
|
||||
For advanced ruleset patterns, see `references/ruleset_patterns.md`.
|
||||
|
||||
### Step 2: Security-Focused API Linting
|
||||
|
||||
Run Spectral with security-specific validation:
|
||||
|
||||
```bash
|
||||
# Comprehensive security scan
|
||||
spectral lint openapi.yaml \
|
||||
--ruleset .spectral.yaml \
|
||||
--format stylish \
|
||||
--verbose
|
||||
|
||||
# Focus on error-level findings only (critical security issues)
|
||||
spectral lint openapi.yaml \
|
||||
--ruleset .spectral.yaml \
|
||||
--fail-severity error
|
||||
|
||||
# Scan multiple specifications
|
||||
spectral lint api-specs/*.yaml --ruleset .spectral.yaml
|
||||
|
||||
# Generate JSON report for further analysis
|
||||
spectral lint openapi.yaml \
|
||||
--ruleset .spectral.yaml \
|
||||
--format json \
|
||||
--output security-findings.json
|
||||
```
|
||||
|
||||
**Output Formats:**
|
||||
- `stylish` - Human-readable terminal output (default)
|
||||
- `json` - Machine-readable JSON for CI/CD integration
|
||||
- `junit` - JUnit XML for test reporting platforms
|
||||
- `html` - HTML report (requires additional plugins)
|
||||
- `github-actions` - GitHub Actions annotations format
|
||||
|
||||
### Step 3: OWASP API Security Validation
|
||||
|
||||
Validate API specifications against OWASP API Security Top 10:
|
||||
|
||||
```yaml
|
||||
# .spectral-owasp.yaml - OWASP API Security focused rules
|
||||
extends: ["spectral:oas"]
|
||||
|
||||
rules:
|
||||
# API1:2023 - Broken Object Level Authorization
|
||||
operation-security-defined:
|
||||
severity: error
|
||||
message: "All operations must have security defined (OWASP API1)"
|
||||
|
||||
# API2:2023 - Broken Authentication
|
||||
security-schemes-defined:
|
||||
severity: error
|
||||
message: "API must define security schemes (OWASP API2)"
|
||||
|
||||
# API3:2023 - Broken Object Property Level Authorization
|
||||
no-additional-properties:
|
||||
severity: warn
|
||||
message: "Consider disabling additionalProperties to prevent data leakage (OWASP API3)"
|
||||
|
||||
# API5:2023 - Broken Function Level Authorization
|
||||
operation-tag-defined:
|
||||
severity: warn
|
||||
message: "Operations should be tagged for authorization policy mapping (OWASP API5)"
|
||||
|
||||
# API7:2023 - Server Side Request Forgery
|
||||
no-http-basic:
|
||||
severity: error
|
||||
message: "HTTP Basic auth transmits credentials in plain text (OWASP API7)"
|
||||
|
||||
# API8:2023 - Security Misconfiguration
|
||||
servers-use-https:
|
||||
description: All server URLs must use HTTPS
|
||||
severity: error
|
||||
given: $.servers[*].url
|
||||
then:
|
||||
function: pattern
|
||||
functionOptions:
|
||||
match: "^https://"
|
||||
message: "Server URL must use HTTPS (OWASP API8)"
|
||||
|
||||
# API9:2023 - Improper Inventory Management
|
||||
api-version-required:
|
||||
severity: error
|
||||
given: $.info
|
||||
then:
|
||||
field: version
|
||||
function: truthy
|
||||
message: "API version must be specified (OWASP API9)"
|
||||
```
|
||||
|
||||
**Run OWASP-focused validation:**
|
||||
```bash
|
||||
spectral lint openapi.yaml --ruleset .spectral-owasp.yaml
|
||||
```
|
||||
|
||||
For complete OWASP API Security Top 10 rule mappings, see `references/owasp_api_mappings.md`.
|
||||
|
||||
### Step 4: Custom Security Rule Development
|
||||
|
||||
Create organization-specific security rules using Spectral's rule engine:
|
||||
|
||||
```yaml
|
||||
# .spectral-custom.yaml
|
||||
extends: ["spectral:oas"]
|
||||
|
||||
rules:
|
||||
# Require API key authentication
|
||||
require-api-key-auth:
|
||||
description: All APIs must support API key authentication
|
||||
severity: error
|
||||
given: $.components.securitySchemes[*]
|
||||
then:
|
||||
field: type
|
||||
function: enumeration
|
||||
functionOptions:
|
||||
values: [apiKey, oauth2, openIdConnect]
|
||||
message: "API must define apiKey, OAuth2, or OpenID Connect security"
|
||||
|
||||
# Prevent PII in query parameters
|
||||
no-pii-in-query:
|
||||
description: Prevent PII exposure in URL query parameters
|
||||
severity: error
|
||||
given: $.paths[*][*].parameters[?(@.in == 'query')].name
|
||||
then:
|
||||
function: pattern
|
||||
functionOptions:
|
||||
notMatch: "(ssn|social.?security|credit.?card|password|secret|token)"
|
||||
message: "Query parameters must not contain PII identifiers"
|
||||
|
||||
# Require rate limiting headers
|
||||
require-rate-limit-headers:
|
||||
description: API responses should include rate limit headers
|
||||
severity: warn
|
||||
given: $.paths[*][*].responses[*].headers
|
||||
then:
|
||||
function: schema
|
||||
functionOptions:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
X-RateLimit-Limit: true
|
||||
X-RateLimit-Remaining: true
|
||||
message: "Consider adding rate limit headers for security"
|
||||
|
||||
# Enforce consistent error responses
|
||||
error-response-format:
|
||||
description: Error responses must follow standard format
|
||||
severity: error
|
||||
given: $.paths[*][*].responses[?(@property >= 400)].content.application/json.schema
|
||||
then:
|
||||
function: schema
|
||||
functionOptions:
|
||||
schema:
|
||||
type: object
|
||||
required: [error, message]
|
||||
properties:
|
||||
error:
|
||||
type: string
|
||||
message:
|
||||
type: string
|
||||
message: "Error responses must include 'error' and 'message' fields"
|
||||
```
|
||||
|
||||
**Custom Rule Development Resources:**
|
||||
- `references/custom_rules_guide.md` - Complete rule authoring guide with functions
|
||||
- `references/custom_functions.md` - Creating custom JavaScript/TypeScript functions
|
||||
- `assets/rule-templates/` - Reusable rule templates for common security patterns
|
||||
|
||||
### Step 5: CI/CD Pipeline Integration
|
||||
|
||||
Integrate Spectral into continuous integration workflows:
|
||||
|
||||
**GitHub Actions:**
|
||||
```yaml
|
||||
# .github/workflows/api-security-lint.yml
|
||||
name: API Security Linting
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
spectral:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '18'
|
||||
|
||||
- name: Install Spectral
|
||||
run: npm install -g @stoplight/spectral-cli
|
||||
|
||||
- name: Lint API Specifications
|
||||
run: |
|
||||
spectral lint api-specs/*.yaml \
|
||||
--ruleset .spectral.yaml \
|
||||
--format github-actions \
|
||||
--fail-severity error
|
||||
|
||||
- name: Generate Report
|
||||
if: always()
|
||||
run: |
|
||||
spectral lint api-specs/*.yaml \
|
||||
--ruleset .spectral.yaml \
|
||||
--format json \
|
||||
--output spectral-report.json
|
||||
|
||||
- name: Upload Report
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: spectral-security-report
|
||||
path: spectral-report.json
|
||||
```
|
||||
|
||||
**GitLab CI:**
|
||||
```yaml
|
||||
# .gitlab-ci.yml
|
||||
api-security-lint:
|
||||
stage: test
|
||||
image: node:18
|
||||
script:
|
||||
- npm install -g @stoplight/spectral-cli
|
||||
- spectral lint api-specs/*.yaml --ruleset .spectral.yaml --fail-severity error
|
||||
artifacts:
|
||||
when: always
|
||||
reports:
|
||||
junit: spectral-report.xml
|
||||
```
|
||||
|
||||
**Docker-Based Pipeline:**
|
||||
```bash
|
||||
# Run in CI/CD with Docker
|
||||
docker run --rm \
|
||||
-v $(pwd):/work \
|
||||
stoplight/spectral lint /work/openapi.yaml \
|
||||
--ruleset /work/.spectral.yaml \
|
||||
--format json \
|
||||
--output /work/results.json
|
||||
|
||||
# Fail build on critical security issues
|
||||
if jq -e '.[] | select(.severity == 0)' results.json > /dev/null; then
|
||||
echo "Critical security issues detected!"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
For complete CI/CD integration examples, see `scripts/ci_integration_examples/`.
|
||||
|
||||
### Step 6: Results Analysis and Remediation
|
||||
|
||||
Analyze findings and provide security remediation:
|
||||
|
||||
```bash
|
||||
# Parse Spectral JSON output for security report
|
||||
python3 scripts/parse_spectral_results.py \
|
||||
--input spectral-report.json \
|
||||
--output security-report.html \
|
||||
--map-owasp \
|
||||
--severity-threshold error
|
||||
|
||||
# Generate remediation guidance
|
||||
python3 scripts/generate_remediation.py \
|
||||
--input spectral-report.json \
|
||||
--output remediation-guide.md
|
||||
```
|
||||
|
||||
**Validation Workflow:**
|
||||
1. Review all error-level findings (critical security issues)
|
||||
2. Verify each finding in API specification context
|
||||
3. Map findings to OWASP API Security Top 10 categories
|
||||
4. Prioritize by severity and exploitability
|
||||
5. Apply fixes to API specifications
|
||||
6. Re-lint to verify remediation
|
||||
7. Document security decisions and exceptions
|
||||
|
||||
**Feedback Loop Pattern:**
|
||||
```bash
|
||||
# 1. Initial lint
|
||||
spectral lint openapi.yaml --ruleset .spectral.yaml -o scan1.json
|
||||
|
||||
# 2. Apply security fixes to API specification
|
||||
|
||||
# 3. Re-lint to verify fixes
|
||||
spectral lint openapi.yaml --ruleset .spectral.yaml -o scan2.json
|
||||
|
||||
# 4. Compare results
|
||||
python3 scripts/compare_spectral_results.py scan1.json scan2.json
|
||||
```
|
||||
|
||||
## Advanced Patterns
|
||||
|
||||
### Pattern 1: Multi-Specification Governance
|
||||
|
||||
Enforce consistent security standards across API portfolio:
|
||||
|
||||
```bash
|
||||
# Scan all API specifications with organization ruleset
|
||||
find api-specs/ -name "*.yaml" -o -name "*.json" | while read spec; do
|
||||
echo "Linting: $spec"
|
||||
spectral lint "$spec" \
|
||||
--ruleset .spectral-org-standards.yaml \
|
||||
--format json \
|
||||
--output "reports/$(basename $spec .yaml)-report.json"
|
||||
done
|
||||
|
||||
# Aggregate findings across portfolio
|
||||
python3 scripts/aggregate_api_findings.py \
|
||||
--input-dir reports/ \
|
||||
--output portfolio-security-report.html
|
||||
```
|
||||
|
||||
### Pattern 2: Progressive Severity Enforcement
|
||||
|
||||
Start with warnings and progressively enforce stricter rules:
|
||||
|
||||
```yaml
|
||||
# .spectral-phase1.yaml - Initial rollout (warnings only)
|
||||
extends: ["spectral:oas"]
|
||||
rules:
|
||||
servers-use-https: warn
|
||||
operation-security-defined: warn
|
||||
|
||||
# .spectral-phase2.yaml - Enforcement phase (errors)
|
||||
extends: ["spectral:oas"]
|
||||
rules:
|
||||
servers-use-https: error
|
||||
operation-security-defined: error
|
||||
```
|
||||
|
||||
```bash
|
||||
# Phase 1: Awareness (don't fail builds)
|
||||
spectral lint openapi.yaml --ruleset .spectral-phase1.yaml
|
||||
|
||||
# Phase 2: Enforcement (fail on violations)
|
||||
spectral lint openapi.yaml --ruleset .spectral-phase2.yaml --fail-severity error
|
||||
```
|
||||
|
||||
### Pattern 3: API Security Pre-Commit Validation
|
||||
|
||||
Prevent insecure API specifications from being committed:
|
||||
|
||||
```bash
|
||||
# .git/hooks/pre-commit
|
||||
#!/bin/bash
|
||||
|
||||
# Find staged API specification files
|
||||
SPECS=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(yaml|yml|json)$' | grep -E '(openapi|swagger|api)')
|
||||
|
||||
if [ -n "$SPECS" ]; then
|
||||
echo "Validating API specifications..."
|
||||
for spec in $SPECS; do
|
||||
spectral lint "$spec" --ruleset .spectral.yaml --fail-severity error
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Security validation failed for $spec"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
```
|
||||
|
||||
### Pattern 4: Automated Security Review Comments
|
||||
|
||||
Generate security review comments for pull requests:
|
||||
|
||||
```bash
|
||||
# Generate PR review comments from Spectral findings
|
||||
spectral lint openapi.yaml \
|
||||
--ruleset .spectral.yaml \
|
||||
--format json | \
|
||||
python3 scripts/generate_pr_comments.py \
|
||||
--file openapi.yaml \
|
||||
--severity error,warn \
|
||||
--output pr-comments.json
|
||||
|
||||
# Post to GitHub PR via gh CLI
|
||||
gh pr comment $PR_NUMBER --body-file pr-comments.json
|
||||
```
|
||||
|
||||
## Custom Functions for Advanced Security Rules
|
||||
|
||||
Create custom JavaScript functions for complex security validation:
|
||||
|
||||
```javascript
|
||||
// spectral-functions/check-jwt-expiry.js
|
||||
export default (targetVal, opts) => {
|
||||
// Validate JWT security scheme includes expiration
|
||||
if (targetVal.type === 'http' && targetVal.scheme === 'bearer') {
|
||||
if (!targetVal.bearerFormat || targetVal.bearerFormat !== 'JWT') {
|
||||
return [{
|
||||
message: 'Bearer authentication should specify JWT format'
|
||||
}];
|
||||
}
|
||||
}
|
||||
return [];
|
||||
};
|
||||
```
|
||||
|
||||
```yaml
|
||||
# .spectral.yaml with custom function
|
||||
functions:
|
||||
- check-jwt-expiry
|
||||
functionsDir: ./spectral-functions
|
||||
|
||||
rules:
|
||||
jwt-security-check:
|
||||
description: Validate JWT security configuration
|
||||
severity: error
|
||||
given: $.components.securitySchemes[*]
|
||||
then:
|
||||
function: check-jwt-expiry
|
||||
```
|
||||
|
||||
For complete custom function development guide, see `references/custom_functions.md`.
|
||||
|
||||
## Automation & Continuous Validation
|
||||
|
||||
### Scheduled API Security Scanning
|
||||
|
||||
```bash
|
||||
# Automated daily API specification scanning
|
||||
./scripts/spectral_scheduler.sh \
|
||||
--schedule daily \
|
||||
--specs-dir api-specs/ \
|
||||
--ruleset .spectral-owasp.yaml \
|
||||
--output-dir scan-results/ \
|
||||
--alert-on error \
|
||||
--slack-webhook $SLACK_WEBHOOK
|
||||
```
|
||||
|
||||
### API Specification Monitoring
|
||||
|
||||
```bash
|
||||
# Monitor API specifications for security regressions
|
||||
./scripts/spectral_monitor.sh \
|
||||
--baseline baseline-scan.json \
|
||||
--current-scan latest-scan.json \
|
||||
--alert-on-new-findings \
|
||||
--email security-team@example.com
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- **Specification Security**: API specifications may contain sensitive information (internal URLs, authentication schemes) - control access and sanitize before sharing
|
||||
- **Rule Integrity**: Protect ruleset files from unauthorized modification - store in version control with code review requirements
|
||||
- **False Positives**: Manually review findings before making security claims - context matters for API design decisions
|
||||
- **Specification Versioning**: Maintain version history of API specifications to track security improvements over time
|
||||
- **Secrets in Specs**: Never include actual credentials, API keys, or secrets in example values - use placeholder values only
|
||||
- **Compliance Mapping**: Document how Spectral rules map to compliance requirements (PCI-DSS, GDPR, HIPAA)
|
||||
- **Governance Enforcement**: Define exception process for legitimate rule violations with security team approval
|
||||
- **Audit Logging**: Log all Spectral scans, findings, and remediation actions for security auditing
|
||||
- **Access Control**: Restrict modification of security rulesets to designated API security team members
|
||||
- **Continuous Validation**: Re-validate API specifications whenever they change or when new security rules are added
|
||||
|
||||
## Bundled Resources
|
||||
|
||||
### Scripts (`scripts/`)
|
||||
|
||||
- `parse_spectral_results.py` - Parse Spectral JSON output and generate security reports with OWASP mapping
|
||||
- `generate_remediation.py` - Generate remediation guidance based on Spectral findings
|
||||
- `compare_spectral_results.py` - Compare two Spectral scans to track remediation progress
|
||||
- `aggregate_api_findings.py` - Aggregate findings across multiple API specifications
|
||||
- `spectral_ci.sh` - CI/CD integration wrapper with exit code handling
|
||||
- `spectral_scheduler.sh` - Scheduled scanning with alerting
|
||||
- `spectral_monitor.sh` - Continuous monitoring with baseline comparison
|
||||
- `generate_pr_comments.py` - Convert Spectral findings to PR review comments
|
||||
|
||||
### References (`references/`)
|
||||
|
||||
- `owasp_api_mappings.md` - Complete OWASP API Security Top 10 rule mappings
|
||||
- `custom_rules_guide.md` - Custom rule authoring with examples
|
||||
- `custom_functions.md` - Creating custom JavaScript/TypeScript validation functions
|
||||
- `ruleset_patterns.md` - Reusable ruleset patterns for common security scenarios
|
||||
- `api_security_checklist.md` - API security validation checklist
|
||||
|
||||
### Assets (`assets/`)
|
||||
|
||||
- `spectral-owasp.yaml` - Comprehensive OWASP API Security Top 10 ruleset
|
||||
- `spectral-org-template.yaml` - Organization-wide API security standards template
|
||||
- `github-actions-template.yml` - Complete GitHub Actions workflow
|
||||
- `gitlab-ci-template.yml` - GitLab CI integration template
|
||||
- `rule-templates/` - Reusable security rule templates
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Pattern 1: Security-First API Design Validation
|
||||
|
||||
Validate API specifications during design phase:
|
||||
|
||||
```bash
|
||||
# Design phase validation (strict security rules)
|
||||
spectral lint api-design.yaml \
|
||||
--ruleset .spectral-owasp.yaml \
|
||||
--fail-severity warn \
|
||||
--verbose
|
||||
```
|
||||
|
||||
### Pattern 2: API Specification Diff Analysis
|
||||
|
||||
Detect security regressions between API versions:
|
||||
|
||||
```bash
|
||||
# Compare two API specification versions
|
||||
spectral lint api-v2.yaml --ruleset .spectral.yaml -o v2-findings.json
|
||||
spectral lint api-v1.yaml --ruleset .spectral.yaml -o v1-findings.json
|
||||
|
||||
python3 scripts/compare_spectral_results.py \
|
||||
--baseline v1-findings.json \
|
||||
--current v2-findings.json \
|
||||
--show-regressions
|
||||
```
|
||||
|
||||
### Pattern 3: Multi-Environment API Security
|
||||
|
||||
Different rulesets for development, staging, production:
|
||||
|
||||
```yaml
|
||||
# .spectral-dev.yaml (permissive)
|
||||
extends: ["spectral:oas"]
|
||||
rules:
|
||||
servers-use-https: warn
|
||||
|
||||
# .spectral-prod.yaml (strict)
|
||||
extends: ["spectral:oas"]
|
||||
rules:
|
||||
servers-use-https: error
|
||||
operation-security-defined: error
|
||||
```
|
||||
|
||||
## Integration Points
|
||||
|
||||
- **CI/CD**: GitHub Actions, GitLab CI, Jenkins, CircleCI, Azure DevOps
|
||||
- **API Gateways**: Kong, Apigee, AWS API Gateway (validate specs before deployment)
|
||||
- **IDE Integration**: VS Code extension, JetBrains plugins for real-time validation
|
||||
- **API Documentation**: Stoplight Studio, Swagger UI, Redoc
|
||||
- **Issue Tracking**: Jira, GitHub Issues, Linear (automated ticket creation for findings)
|
||||
- **API Governance**: Backstage, API catalogs (enforce standards across portfolios)
|
||||
- **Security Platforms**: Defect Dojo, SIEM platforms (via JSON export)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Issue: Too Many False Positives
|
||||
|
||||
**Solution**:
|
||||
- Start with `error` severity only: `spectral lint --fail-severity error`
|
||||
- Progressively add rules and adjust severity levels
|
||||
- Use `overrides` section in ruleset to exclude specific paths
|
||||
- See `references/ruleset_patterns.md` for filtering strategies
|
||||
|
||||
### Issue: Custom Rules Not Working
|
||||
|
||||
**Solution**:
|
||||
- Verify JSONPath expressions using online JSONPath testers
|
||||
- Check rule syntax with `spectral lint --ruleset .spectral.yaml --verbose`
|
||||
- Use `--verbose` flag to see which rules are being applied
|
||||
- Test rules in isolation before combining them
|
||||
|
||||
### Issue: Performance Issues with Large Specifications
|
||||
|
||||
**Solution**:
|
||||
- Lint specific paths only: `spectral lint api-spec.yaml --ignore-paths "components/examples"`
|
||||
- Use `--skip-rules` to disable expensive rules temporarily
|
||||
- Split large specifications into smaller modules
|
||||
- Run Spectral in parallel for multiple specifications
|
||||
|
||||
### Issue: CI/CD Integration Failing
|
||||
|
||||
**Solution**:
|
||||
- Check Node.js version compatibility (requires Node 14+)
|
||||
- Verify ruleset path is correct relative to specification file
|
||||
- Use `--fail-severity` to control when builds should fail
|
||||
- Review exit codes in `scripts/spectral_ci.sh`
|
||||
|
||||
## References
|
||||
|
||||
- [Spectral Documentation](https://docs.stoplight.io/docs/spectral/674b27b261c3c-overview)
|
||||
- [Spectral GitHub Repository](https://github.com/stoplightio/spectral)
|
||||
- [OWASP API Security Top 10](https://owasp.org/API-Security/editions/2023/en/0x11-t10/)
|
||||
- [OpenAPI Specification](https://spec.openapis.org/oas/latest.html)
|
||||
- [AsyncAPI Specification](https://www.asyncapi.com/docs/reference/specification/latest)
|
||||
Reference in New Issue
Block a user