Concelier CERT-Bund Connector Operations
Last updated: 2025-10-17
Audience: Stella Ops operators running the Concelier CERT-Bund connector.
Runtime/catalog source ID: cert-de. Legacy cert-bund remains a compatibility-only configuration alias.
Germany’s Federal Office for Information Security (BSI) operates the Warn- und Informationsdienst (WID) portal. The Concelier CERT-Bund connector uses the runtime/catalog source ID cert-de, so the live fetch pipeline runs as source:cert-de:* while preserving the original German content.
1. Configuration Checklist
- Allow outbound access (or stage mirrors) for:
https://wid.cert-bund.de/content/public/securityAdvisory/rsshttps://wid.cert-bund.de/portal/(session/bootstrap)https://wid.cert-bund.de/portal/api/securityadvisory(detail/search/export JSON)
- Ensure the HTTP client reuses a cookie container (the connector’s dependency injection wiring already sets this up).
- The public RSS feed is the stable source for current advisory identity, title, category, publication date, and summary text. If
portal/api/securityadvisory?name=...returns the WID Angular shell instead of JSON, the connector maps from RSS metadata and keeps the detail URI as the canonical reference.
Example concelier.yaml fragment:
concelier:
sources:
cert-de:
feedUri: "https://wid.cert-bund.de/content/public/securityAdvisory/rss"
portalBootstrapUri: "https://wid.cert-bund.de/portal/"
detailApiUri: "https://wid.cert-bund.de/portal/api/securityadvisory"
maxAdvisoriesPerFetch: 50
maxKnownAdvisories: 512
requestTimeout: "00:00:30"
requestDelay: "00:00:00.250"
failureBackoff: "00:05:00"
Leave
maxAdvisoriesPerFetchat 50 during normal operation. Raise it only for controlled backfills, then restore the default to avoid overwhelming the portal.
The RSS-metadata fallback intentionally does not invent affected products or version ranges. Product/range fidelity still depends on the portal JSON/search/export APIs or an offline WID export snapshot.
2. Telemetry & Logging
- Meter:
StellaOps.Concelier.Connector.CertBund - Counters / histograms:
certbund.feed.fetch.attempts|success|failurescertbund.feed.items.countcertbund.feed.enqueued.countcertbund.feed.coverage.dayscertbund.detail.fetch.attempts|success|not_modified|failures{reason}certbund.parse.success|failures{reason}certbund.parse.products.count,certbund.parse.cve.countcertbund.map.success|failures{reason}certbund.map.affected.count,certbund.map.aliases.count
- Shared HTTP metrics remain available through
concelier.source.http.*.
Structured logs (all emitted at information level when work occurs):
CERT-Bund fetch cycle: … truncated {Truncated}, coverageDays={CoverageDays}CERT-Bund parse cycle: parsed {Parsed}, failures {Failures}, …CERT-Bund map cycle: mapped {Mapped}, failures {Failures}, …
Alerting ideas:
increase(certbund.detail.fetch.failures_total[10m]) > 0rate(certbund.map.success_total[30m]) == 0histogram_quantile(0.95, rate(concelier_source_http_duration_bucket{concelier_source="cert-de"}[15m])) > 5s
The WebService now registers the meter so metrics surface automatically once OpenTelemetry metrics are enabled.
3. Historical Backfill & Export Strategy
3.1 Retention snapshot
- RSS window: ~250 advisories (≈90 days at current cadence).
- Older advisories are accessible through the JSON search/export APIs once the anti-CSRF token is supplied.
3.2 JSON search pagination
# 1. Bootstrap cookies (client_config + XSRF-TOKEN)
curl -s -c cookies.txt "https://wid.cert-bund.de/portal/" > /dev/null
curl -s -b cookies.txt -c cookies.txt \
-H "X-Requested-With: XMLHttpRequest" \
"https://wid.cert-bund.de/portal/api/security/csrf" > /dev/null
XSRF=$(awk '/XSRF-TOKEN/ {print $7}' cookies.txt)
# 2. Page search results
curl -s -b cookies.txt \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-XSRF-TOKEN: ${XSRF}" \
-X POST \
--data '{"page":4,"size":100,"sort":["published,desc"]}' \
"https://wid.cert-bund.de/portal/api/securityadvisory/search" \
> certbund-page4.json
Iterate page until the response content array is empty. Pages 0–9 currently cover 2014-present. Persist JSON responses (plus SHA256) for Offline Kit parity.
Shortcut – run
python src/Tools/certbund_offline_snapshot.py --output src/__Tests/__Datasets/seed-data/cert-bundto bootstrap the session, capture the paginated search responses, and regenerate the manifest/checksum files automatically. Supply--cookie-fileand--xsrf-tokenif the portal requires a browser-derived session (see options via--help).
3.3 Export bundles
python src/Tools/certbund_offline_snapshot.py \
--output src/__Tests/__Datasets/seed-data/cert-bund \
--start-year 2014 \
--end-year "$(date -u +%Y)"
The helper stores yearly exports under src/__Tests/__Datasets/seed-data/cert-bund/export/, captures paginated search snapshots in src/__Tests/__Datasets/seed-data/cert-bund/search/, and generates the manifest + SHA files in src/__Tests/__Datasets/seed-data/cert-bund/manifest/. Split ranges according to your compliance window (default: one file per calendar year). Concelier can ingest these JSON payloads directly when operating offline.
When automatic bootstrap fails (e.g. portal introduces CAPTCHA), run the manual
curlflow above, then rerun the helper with--skip-fetchto rebuild the manifest from the existing files.
3.4 Connector-driven catch-up
- Temporarily raise
maxAdvisoriesPerFetch(e.g. 150) and reducerequestDelay. - Run
stella db fetch --source cert-de --stage fetch, then--stage parse, then--stage mapuntil the fetch log reportsenqueued=0. - Restore defaults and capture the cursor snapshot for audit.
4. Locale & Translation Guidance
- Advisories remain in German (
language: "de"). Preserve wording for provenance and legal accuracy. - UI localisation: enable the translation bundles documented in the UI guide if English UI copy is required. Operators can overlay machine or human translations, but the canonical database stores the source text.
5. Verification Checklist
- Observe
certbund.feed.fetch.successincrements after runs;certbund.feed.coverage.daysshould hover near the observed RSS window.certbund.detail.fetch.successmay store portal HTML when the WID detail API is serving the Angular shell. - Ensure summary logs report
truncated=falsein steady state —trueindicates the fetch cap was hit. - During backfills, watch
certbund.feed.enqueued.counttrend to zero. - Spot-check stored advisories in PostgreSQL (schema
vuln) to confirmlanguage="de"and reference URLs match the portal detail endpoint. - For entries mapped from RSS fallback metadata, confirm aliases include any CVEs present in the RSS title or summary and affected-package counts are zero until JSON/export data is available.
- For Offline Kit exports, validate SHA256 hashes before distribution.
