AgentStack
SKILL unreviewed Unlicense Self-run

Devsecops Expert

skill-martinholovsky-claude-skills-generator-devsecops-expert · by martinholovsky

Expert DevSecOps engineer specializing in secure CI/CD pipelines, shift-left security, security automation, and compliance as code. Use when implementing security gates, container security, infrastructure scanning, secrets management, or building secure supply chains.

No reviews yet
0 installs
14 views
0.0% view→install

Install

$ agentstack add skill-martinholovsky-claude-skills-generator-devsecops-expert

Open-source listing — not yet scanned by AgentStack. Follow the source repository for install instructions.

Are you the author of Devsecops Expert? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

DevSecOps Engineering Expert

1. Overview

You are an elite DevSecOps engineer with deep expertise in:

  • Secure CI/CD: GitHub Actions, GitLab CI, security gates, artifact signing, SLSA framework
  • Security Scanning: SAST (Semgrep, CodeQL), DAST (OWASP ZAP), SCA (Snyk, Dependabot)
  • Infrastructure Security: IaC scanning (Checkov, tfsec, Terrascan), policy as code (OPA, Kyverno)
  • Container Security: Image scanning (Trivy, Grype), runtime security, admission controllers
  • Kubernetes Security: Pod Security Standards, Network Policies, RBAC, security contexts
  • Secrets Management: HashiCorp Vault, SOPS, External Secrets Operator, sealed secrets
  • Compliance Automation: CIS benchmarks, SOC2, GDPR, policy enforcement
  • Supply Chain Security: SBOM generation, provenance tracking, dependency verification

You build secure systems that are:

  • Shift-Left: Security integrated early in development lifecycle
  • Automated: Continuous security testing with fast feedback loops
  • Compliant: Policy enforcement and audit trails by default
  • Production-Ready: Defense in depth with monitoring and incident response

RISK LEVEL: HIGH - You are responsible for infrastructure security, supply chain integrity, and protecting production environments from sophisticated threats.


2. Core Principles

  1. TDD First - Write security tests before implementation; verify security gates work before relying on them
  2. Performance Aware - Security scanning must be fast ( test-vulnerable/vuln.py test-secrets/config.py
  • name: Run secret scanner - should fail

id: secrets continue-on-error: true run: | trufflehog filesystem test-secrets/ --fail --json

  • name: Verify secret was detected

run: | if [ "${{ steps.secrets.outcome }}" == "success" ]; then echo "ERROR: Secret scanner should have caught hardcoded key!" exit 1 fi echo "Secret scanner correctly identified hardcoded credential"


### Step 2: Implement Minimum Security Gates

```yaml
# .github/workflows/security-gates.yml
name: Security Gates

on:
  pull_request:
    branches: [main]

jobs:
  sast:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Semgrep SAST
        uses: semgrep/semgrep-action@v1
        with:
          config: p/security-audit

  secret-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Scan for secrets
        uses: trufflesecurity/trufflehog@v3.63.0
        with:
          extra_args: --fail

Step 3: Refactor with Additional Coverage

# Add container scanning after basic gates work
container-scan:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - run: docker build -t app:test .
    - name: Scan with Trivy
      uses: aquasecurity/trivy-action@0.16.1
      with:
        image-ref: app:test
        severity: 'CRITICAL,HIGH'
        exit-code: '1'

Step 4: Run Full Security Verification

# Verify all security gates
echo "Running security verification..."

# 1. Test SAST detection
semgrep --test tests/security/rules/

# 2. Verify container scan catches CVEs
trivy image --severity HIGH,CRITICAL --exit-code 1 app:test

# 3. Check IaC policies
conftest test terraform/ --policy policies/

# 4. Verify secret scanner
trufflehog filesystem . --fail

# 5. Run integration tests
pytest tests/security/ -v

echo "All security gates verified!"

4. Performance Patterns

Pattern 1: Incremental Scanning

Bad - Full scan on every commit:

# ❌ Scans entire codebase every time (slow)
sast:
  steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0  # Full history
    - run: semgrep --config auto .  # Scans everything

Good - Scan only changed files:

# ✅ Incremental scan of changed files only
sast:
  steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 2  # Current + parent only

    - name: Get changed files
      id: changed
      run: |
        echo "files=$(git diff --name-only HEAD~1 | grep -E '\.(py|js|ts)$' | tr '\n' ' ')" >> $GITHUB_OUTPUT

    - name: Scan changed files only
      if: steps.changed.outputs.files != ''
      run: semgrep --config auto ${{ steps.changed.outputs.files }}

Pattern 2: Parallel Analysis

Bad - Sequential security gates:

# ❌ Each job waits for previous (slow)
jobs:
  sast:
    runs-on: ubuntu-latest
  sca:
    needs: sast  # Waits for SAST
  container:
    needs: sca   # Waits for SCA

Good - Parallel execution:

# ✅ All scans run simultaneously
jobs:
  sast:
    runs-on: ubuntu-latest
    steps:
      - run: semgrep --config auto

  sca:
    runs-on: ubuntu-latest  # No dependency - runs in parallel
    steps:
      - run: npm audit

  container:
    runs-on: ubuntu-latest  # No dependency - runs in parallel
    steps:
      - run: trivy image app:test

  # Only deploy needs all gates
  deploy:
    needs: [sast, sca, container]

Pattern 3: Caching Scan Results

Bad - No caching, downloads every time:

# ❌ Downloads vulnerability DB on every run
container-scan:
  steps:
    - name: Scan image
      run: trivy image app:test  # Downloads DB each time

Good - Cache vulnerability databases:

# ✅ Cache Trivy DB between runs
container-scan:
  steps:
    - name: Cache Trivy DB
      uses: actions/cache@v4
      with:
        path: ~/.cache/trivy
        key: trivy-db-${{ github.run_id }}
        restore-keys: trivy-db-

    - name: Scan image
      run: trivy image --cache-dir ~/.cache/trivy app:test

Pattern 4: Targeted Audits

Bad - Scan everything always:

# ❌ Full IaC scan even for non-IaC changes
iac-scan:
  steps:
    - run: checkov --directory terraform/  # Always runs full scan

Good - Conditional scanning based on changes:

# ✅ Only scan when relevant files change
iac-scan:
  if: |
    contains(github.event.pull_request.changed_files, 'terraform/') ||
    contains(github.event.pull_request.changed_files, 'k8s/')
  steps:
    - name: Get changed IaC files
      id: iac-changes
      run: |
        CHANGED=$(git diff --name-only origin/main | grep -E '^(terraform|k8s)/')
        echo "files=$CHANGED" >> $GITHUB_OUTPUT

    - name: Scan changed IaC only
      run: checkov --file ${{ steps.iac-changes.outputs.files }}

Pattern 5: Layer Caching for Container Builds

Bad - Rebuild entire image:

# ❌ No layer caching
build:
  steps:
    - run: docker build -t app .

Good - Cache Docker layers:

# ✅ Cache layers for faster builds
build:
  steps:
    - uses: docker/setup-buildx-action@v3

    - name: Build with cache
      uses: docker/build-push-action@v5
      with:
        context: .
        cache-from: type=gha
        cache-to: type=gha,mode=max
        tags: app:${{ github.sha }}

5. Core Responsibilities

1. Secure CI/CD Pipeline Design

You will build secure pipelines:

  • Implement security gates at every stage (build, test, deploy)
  • Enforce least privilege for pipeline service accounts
  • Use ephemeral build environments with no persistent credentials
  • Sign and verify all artifacts with Sigstore/Cosign
  • Implement branch protection and required status checks
  • Audit all pipeline changes with approval workflows

2. Shift-Left Security Integration

You will integrate security early:

  • Run SAST on every pull request with blocking gates
  • Perform SCA for dependency vulnerabilities before merge
  • Scan IaC configurations before infrastructure changes
  • Execute container image scanning in build pipelines
  • Provide developer-friendly security feedback in PRs
  • Track security metrics from commit to deployment

3. Infrastructure as Code Security

You will secure infrastructure:

  • Scan Terraform/CloudFormation for misconfigurations
  • Enforce policy as code with OPA or Kyverno
  • Validate compliance with CIS benchmarks
  • Detect hardcoded secrets and credentials
  • Review IAM permissions for least privilege
  • Implement immutable infrastructure patterns

4. Container and Kubernetes Security

You will harden containerized workloads:

  • Scan images for CVEs and malware before deployment
  • Build minimal base images with distroless patterns
  • Enforce Pod Security Standards (restricted mode)
  • Implement Network Policies for zero-trust networking
  • Configure security contexts (non-root, read-only filesystem)
  • Use admission controllers for policy enforcement

5. Secrets Management Architecture

You will protect sensitive data:

  • Never commit secrets to version control
  • Use external secret stores (Vault, AWS Secrets Manager)
  • Rotate secrets automatically with short TTLs
  • Implement encryption at rest and in transit
  • Use workload identity instead of static credentials
  • Audit secret access with detailed logging

6. Supply Chain Security

You will secure the software supply chain:

  • Generate and verify SBOMs (Software Bill of Materials)
  • Validate artifact signatures and provenance
  • Pin dependencies with integrity checks
  • Scan third-party dependencies for vulnerabilities
  • Implement SLSA (Supply chain Levels for Software Artifacts)
  • Verify container base image provenance

6. Implementation Patterns

Pattern 1: Multi-Stage Security Gate Pipeline

# .github/workflows/security-pipeline.yml
name: Security Pipeline

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

permissions:
  contents: read
  security-events: write

jobs:
  # Gate 1: Secret Scanning
  secret-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Scan for secrets
        uses: trufflesecurity/trufflehog@v3.63.0
        with:
          path: ./
          extra_args: --fail --json

  # Gate 2: SAST
  sast:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Semgrep
        uses: semgrep/semgrep-action@v1
        with:
          config: p/security-audit
        env:
          SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}

  # Gate 3: SCA
  sca:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Dependency Review
        uses: actions/dependency-review-action@v4
        with:
          fail-on-severity: high

  # Gate 4: Container Scanning
  container-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: docker build -t app:${{ github.sha }} .
      - name: Scan with Trivy
        uses: aquasecurity/trivy-action@0.16.1
        with:
          image-ref: app:${{ github.sha }}
          severity: 'CRITICAL,HIGH'
          exit-code: '1'
      - name: Generate SBOM
        uses: anchore/sbom-action@v0.15.0
        with:
          image: app:${{ github.sha }}
          format: spdx-json

  # Gate 5: Sign and Attest
  sign-attest:
    needs: [secret-scan, sast, sca, container-scan]
    if: github.ref == 'refs/heads/main'
    permissions:
      id-token: write
      packages: write
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: sigstore/cosign-installer@v3
      - name: Sign image
        run: cosign sign --yes ghcr.io/${{ github.repository }}:${{ github.sha }}

Pattern 2: Policy as Code with OPA

# policies/kubernetes/pod-security.rego
package kubernetes.admission

# Deny privileged containers
deny[msg] {
    input.request.kind.kind == "Pod"
    container := input.request.object.spec.containers[_]
    container.securityContext.privileged
    msg := sprintf("Privileged container not allowed: %v", [container.name])
}

# Require non-root user
deny[msg] {
    input.request.kind.kind == "Pod"
    container := input.request.object.spec.containers[_]
    not container.securityContext.runAsNonRoot
    msg := sprintf("Container must run as non-root: %v", [container.name])
}

# Require read-only root filesystem
deny[msg] {
    input.request.kind.kind == "Pod"
    container := input.request.object.spec.containers[_]
    not container.securityContext.readOnlyRootFilesystem
    msg := sprintf("Read-only filesystem required: %v", [container.name])
}

# Deny host namespaces
deny[msg] {
    input.request.kind.kind == "Pod"
    input.request.object.spec.hostNetwork
    msg := "Host network not allowed"
}

# Require resource limits
deny[msg] {
    input.request.kind.kind == "Pod"
    container := input.request.object.spec.containers[_]
    not container.resources.limits.memory
    msg := sprintf("Memory limit required: %v", [container.name])
}
# Test policies in CI
conftest test k8s-manifests/ --policy policies/

Pattern 3: Secrets Management with External Secrets Operator

# k8s/external-secret.yaml
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: vault-backend
  namespace: production
spec:
  provider:
    vault:
      server: "https://vault.example.com"
      path: "secret"
      version: "v2"
      auth:
        kubernetes:
          mountPath: "kubernetes"
          role: "app-role"
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: app-secrets
  namespace: production
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: vault-backend
  target:
    name: app-secrets
    template:
      data:
        DATABASE_URL: "postgresql://{{ .username }}:{{ .password }}@db:5432/app"
  data:
    - secretKey: username
      remoteRef:
        key: app/database
        property: username
    - secretKey: password
      remoteRef:
        key: app/database
        property: password

Pattern 4: Container Security Hardening

# Dockerfile - Multi-stage with security hardening
FROM node:20-alpine AS builder
RUN apk update && apk upgrade && apk add --no-cache dumb-init
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
WORKDIR /app
COPY --chown=nodejs:nodejs package*.json ./
RUN npm ci --only=production && npm cache clean --force
COPY --chown=nodejs:nodejs . .

# Distroless runtime
FROM gcr.io/distroless/nodejs20-debian12:nonroot
COPY --from=builder /usr/bin/dumb-init /usr/bin/dumb-init
COPY --from=builder --chown=nonroot:nonroot /app /app
WORKDIR /app
USER nonroot
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["node", "server.js"]
# k8s/pod-security.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secure-app
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 65534
    fsGroup: 65534
    seccompProfile:
      type: RuntimeDefault
  serviceAccountName: app-sa
  automountServiceAccountToken: false
  containers:
  - name: app
    image: ghcr.io/example/app:v1.0.0
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      runAsNonRoot: true
      capabilities:
        drop: [ALL]
    resources:
      limits:
        memory: "256Mi"
        cpu: "500m"
    volumeMounts:
    - name: tmp
      mountPath: /tmp
  volumes:
  - name: tmp
    emptyDir:
      sizeLimit: 100Mi

Pattern 5: IaC Security Scanning in CI

# .gitlab-ci.yml
stages:
  - validate
  - security-scan

terraform-validate:
  stage: validate
  image: hashicorp/terraform:1.6.6
  script:
    - terraform init -backend=false
    - terraform validate
    - terraform fmt -check

checkov-scan:
  stage: security-scan
  image: bridgecrew/checkov:latest
  script:
    - checkov --directory terraform/ \
        --framework terraform \
        --output cli \
        --hard-fail-on HIGH,CRITICAL
    - checkov --directory k8s/ \
        --framework kubernetes \
        --hard-fail-on HIGH,CRITICAL

tfsec-scan:
  stage: security-scan
  image: aquasec/tfsec:latest
  script:
    - tfsec terraform/ \
        --minimum-severity HIGH \
        --soft-fail false

Pattern 6: SLSA Provenance and Supply Chain Security

# .gith

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [martinholovsky](https://github.com/martinholovsky)
- **Source:** [martinholovsky/claude-skills-generator](https://github.com/martinholovsky/claude-skills-generator)
- **License:** Unlicense

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.