fix(security): remove hardcoded Qdrant key + allowlist doc false-positives
CI / detect-changes (pull_request) Successful in 8s
CI / branch-name (pull_request) Successful in 1s
CI / guardrail-integrity (pull_request) Successful in 5s
CI / secret-scan (pull_request) Successful in 6s
CI / dep-audit (pull_request) Failing after 54s
CI / sbom-scan (pull_request) Failing after 1m3s
CI / build-sha-integrity (pull_request) Successful in 5s
CI / validate-canonical-controls (pull_request) Successful in 4s
CI / loc-budget (pull_request) Successful in 17s
CI / go-lint (pull_request) Failing after 13s
CI / python-lint (pull_request) Failing after 13s
CI / nodejs-lint (pull_request) Failing after 1m8s
CI / nodejs-build (pull_request) Successful in 3m0s
CI / test-go (pull_request) Successful in 1m0s
CI / iace-gt-coverage (pull_request) Successful in 22s
CI / test-python-backend (pull_request) Successful in 30s
CI / test-python-document-crawler (pull_request) Successful in 13s
CI / test-python-dsms-gateway (pull_request) Successful in 16s

secret-scan (gitleaks) had never run on a PR (broken checkout). A real Qdrant dev API key was hardcoded in 4 pre-existing files; removed in favour of env / gitea-secret references (scripts read QDRANT_API_KEY from os.environ; rag-ingest workflow references a gitea Actions secret). The remaining ~52 findings are doc curl examples + .env.example placeholders + a rule_key identifier, allowlisted in .gitleaks.toml (default ruleset kept). gitleaks now reports 0 findings.

ACTION REQUIRED: rotate the Qdrant dev API key — the leaked value is in git history.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-21 14:37:54 +02:00
parent 079bb56922
commit 5f8009e844
5 changed files with 28 additions and 4 deletions
+1 -1
View File
@@ -74,7 +74,7 @@ jobs:
-e "WORK_DIR=/tmp/rag-ingestion" \
-e "RAG_URL=http://bp-core-rag-service:8097/api/v1/documents/upload" \
-e "QDRANT_URL=https://qdrant-dev.breakpilot.ai" \
-e "QDRANT_API_KEY=z9cKbT74vl1aKPD1QGIlKWfET47VH93u" \
-e "QDRANT_API_KEY=${{ secrets.QDRANT_API_KEY }}" \
-e "SDK_URL=http://bp-compliance-ai-sdk:8090" \
alpine:3.19 \
sh -c "
+21
View File
@@ -0,0 +1,21 @@
# gitleaks configuration.
# Keeps gitleaks' default ruleset and adds an allowlist for known FALSE POSITIVES
# that surfaced once the CI checkout was fixed (secret-scan had never actually run
# on a PR before). Real leaked credentials are removed in code, NOT allowlisted.
[extend]
useDefault = true
[allowlist]
description = "Documentation curl examples, env templates, and non-secret identifiers"
paths = [
# API reference pages — curl examples with placeholder tokens, not real secrets
'''developer-portal/app/api/.*''',
'''developer-portal/app/development/.*''',
# Template env file — placeholder dev values (e.g. breakpilot123)
'''\.env\.example$''',
# Seed data: "rule_key" identifiers, not credentials
'''backend-compliance/compliance/data/template_rule_seed_data\.py$''',
# SDK deploy template — MINIO placeholder password
'''breakpilot-compliance-sdk/packages/cli/src/commands/deploy\.ts$''',
]
+2 -1
View File
@@ -18,6 +18,7 @@ Run with --dry-run to preview deletions without executing.
import argparse
import json
import os
import sys
import time
import requests
@@ -33,7 +34,7 @@ TARGETS = {
},
"production": {
"url": "https://qdrant-dev.breakpilot.ai",
"api_key": "z9cKbT74vl1aKPD1QGIlKWfET47VH93u",
"api_key": os.environ.get("QDRANT_API_KEY"),
},
}
+2 -1
View File
@@ -6,6 +6,7 @@ Uses persistent HTTP sessions and rate limiting for hosted Qdrant.
"""
import json
import os
import sys
import time
import requests
@@ -13,7 +14,7 @@ from urllib.parse import urljoin
SOURCE_URL = "http://macmini:6333"
TARGET_URL = "https://qdrant-dev.breakpilot.ai"
TARGET_API_KEY = "z9cKbT74vl1aKPD1QGIlKWfET47VH93u"
TARGET_API_KEY = os.environ.get("QDRANT_API_KEY", "")
BATCH_SIZE = 20
RATE_LIMIT_DELAY = 0.3 # seconds between batches
+2 -1
View File
@@ -1,8 +1,9 @@
"""Delete eu_2023_988 duplicate from production Qdrant."""
import httpx
import os
PROD_URL = "https://qdrant-dev.breakpilot.ai"
HEADERS = {"api-key": "z9cKbT74vl1aKPD1QGIlKWfET47VH93u"}
HEADERS = {"api-key": os.environ.get("QDRANT_API_KEY", "")}
# Delete
resp = httpx.post(