taco-secrets

A secret detection scanner that analyzes SBOM content for leaked credentials, API keys, and other sensitive data.

A secret detection scanner that analyzes SBOM content for leaked credentials, API keys, and other sensitive data.

Overview

PropertyValue
LanguageGo
FrameworkStandard library HTTP
Port8086 (health check)
ExposedInternal only
DependenciesMySQL
Repositorytacosec/taco-secrets

Architecture

taco-secrets is a periodic batch scanner that:

  1. Polls MySQL for SBOMs that haven't been scanned for secrets (by checking the secrets_scan_state table).
  2. Runs regex-based detection rules against the raw SBOM content.
  3. Masks matched secrets before persisting them -- raw secret values are never stored.
  4. Records scan state so each SBOM is only scanned once.

Key Packages

PackagePurpose
scanner/Secret detection engine: rules, scanner, masking, image name extraction
db/MySQL operations: fetch unscanned SBOMs, insert secrets, record scan state
config/Environment variable loading

Detection Rules

The scanner ships with 10 built-in rules:

RuleSeverityCategoryConfidence
AWS Access Key ID (AKIA...)Criticalcloud_credentialHigh
AWS Secret KeyCriticalcloud_credentialHigh
GitHub Token (ghp_/ghs_)Criticalapi_tokenHigh
GitLab Token (glpat-)Criticalapi_tokenHigh
Generic API KeyMediumgeneric_secretMedium
Password in env/configHighgeneric_secretMedium
Private Key (RSA/EC/DSA/OPENSSH/PGP)Criticalprivate_keyHigh
Database URL with credentialsHighdatabase_urlHigh
Slack Webhook URLMediumwebhookHigh
JWT TokenMediumauth_tokenMedium

Secret Categories

  • cloud_credential -- AWS, GCP, Azure credentials
  • api_token -- GitHub, GitLab, generic API tokens
  • generic_secret -- Passwords, secrets, tokens in config
  • private_key -- RSA, EC, DSA, OPENSSH, PGP private keys
  • database_url -- Database connection strings with embedded credentials
  • webhook -- Webhook URLs (Slack, etc.)
  • auth_token -- JWT tokens, session tokens

Masking

All matched secrets are masked before storage. The masker replaces the sensitive portion with asterisks while preserving enough context to identify the secret type. Raw secret values never reach the database.

Distributed Locking

taco-secrets uses MySQL advisory locks (GET_LOCK('taco_secrets', 0)) to prevent concurrent scan cycles when multiple instances are running.

Tables Owned

  • secrets -- Detected secrets with project_id, sbom_id, namespace, type, severity, category, masked match, confidence
  • secrets_scan_state -- Tracks which SBOMs have been scanned (sbom_id, findings_count, scanned_at)

Environment Variables

VariableRequiredDefaultDescription
MYSQL_DSNYes--MySQL connection string
SCAN_INTERVALNo2mTime between scan cycles
HEALTH_PORTNo8086Health check HTTP port

Health Check

GET /healthz -- Returns 200 OK when MySQL is reachable. Returns 503 if MySQL is down.