# Concelier connector credentials matrix

Sprint: SPRINT_20260505_026_Connectors_vendor_credentials_backlog.md task B-CRED-001. Source of truth: each connector’s *Options.cs and *DependencyInjectionRoutine.cs under src/Concelier/__Libraries/StellaOps.Concelier.Connector.<Vendor>/. Operator decisions (per-row enable / defer / decline) are captured in B-CRED-002 using this matrix as input.

Reference-based credentials — kill plaintext at rest (SPRINT_20260703_003)

Custody review P0 #2. Connector secret-bearing config fields (apiToken / subscriptionToken — GitHub PAT, Red Hat subscription token) now accept a secret reference (builtin://… / vault://… / openbao://…) instead of a plaintext token. The reference is resolved in-host through the unified ISecretProvider (ADR-031/032) by SecretProviderRemoteCredentialResolver — the chosen alternative to the Platform HTTP bridge (AddPlatformRemoteCredentialResolver), so a feed pull needs no runtime dependency on the Platform WebService (air-gap posture). It plugs into the SAME IRemoteCredentialResolver seam the overlays already consume (TryGetCached step 1); a plain literal value is left inline (back-compat).

Platform credential store wiring (RFC-0001 §8.2)

The five credentialed connectors below resolve through the Platform store via IRemoteCredentialResolver (precedence step 1) ahead of env-var / source-config (step 2) and the connector’s natural fallback (step 3). All wiring landed under SPRINT_20260512_021 TASK-021-03/07 and the per-vendor verification sprints 052/053/054/055.

connector_idoverlay classplaintext schemastep-3 fallbacksprint
concelier:ghsaGhsaRuntimeOverlaysingle PAT (UTF-8 string)anonymous GitHub REST052
concelier:msrcMsrcRuntimeOverlay"{aadTenantId}:{clientId}:{clientSecret}"skip-with-WARN (Sprint 037)053
concelier:ciscoCiscoRuntimeOverlay"{clientId}:{clientSecret}"skip-with-WARN (Sprint 037)054
concelier:cveCveRuntimeOverlay"{apiOrg}:{apiUser}:{apiKey}"public cvelistV5 mirror055
concelier:redhatRedHatRuntimeOverlaysingle subscription token (UTF-8 string)anonymous Hydra021
excititor:redhat-csafRedHatCsafCredentialOverlaysingle subscription token (UTF-8 string)anonymous CSAF index021

Resolver invariants:

Reading the env-var column

Concelier services bind configuration through AddStellaOpsDefaults with EnvironmentPrefix = "CONCELIER_" (src/Concelier/StellaOps.Concelier.WebService/Program.cs:142). Standard .NET IConfiguration rules apply, so a config key concelier:sources:cisco:ClientId resolves from environment variable:

CONCELIER_concelier__sources__cisco__ClientId

(env prefix CONCELIER_, then the section path with : replaced by __). Equivalently you can set it under etc/concelier.yaml as concelier.sources.cisco.clientId. The matrix lists the config key (left of =) — operators wire the matching env var.

Geo / export-control note

Rows tagged geo: classified (e.g. fstec-bdu, nkcki) ingest from feeds operated by sanctioned or restricted entities. Enabling them requires legal/export-control review (EAR/OFAC, EU dual-use, local equivalents) before a credential or a route reaches production. The B-CRED-002 operator decision step must not override classified rows without sign-off captured in the sprint Decisions & Risks log.

How to read “auth mechanism”


Vendor advisories

source_keyconnector pathauth mechanismhow to obtainenv var / config keyrate limitscostgeo
ghsaConnector.GhsaPAT-optional (anonymous GitHub REST global advisories by default; token raises rate limits)Optional: github.com → Settings → Developer settings → Personal access tokens; https://github.com/settings/tokensOptional concelier:sources:ghsa:ApiToken (also :BaseEndpoint, :PageSize, :MaxPagesPerFetch)code-tracked: RateLimitWarningThreshold=500 (warn under 500 remaining), SecondaryRateLimitBackoff=2 minfreenone
microsoft (MSRC)Connector.Vndr.MsrcOAuth2 client_credentials (Azure AD app) against api://api.msrc.microsoft.com/.defaultRegister an Azure AD app in your tenant; consent the MSRC Security Update Guide API. See https://api.msrc.microsoft.com/sug/v2.0/swagger and Microsoft’s MSRC SUG onboarding docs.concelier:sources:microsoft:TenantId, :ClientId, :ClientSecret, :Scope (default api://api.msrc.microsoft.com/.default)RequestDelay=250 ms, PageSize<=500, FailureBackoff=5 minfreenone
ciscoConnector.Vndr.CiscoOAuth2 client_credentials against https://id.cisco.com/oauth2/default/v1/tokenCisco API Console: https://apiconsole.cisco.com/ → register an app → enable “OpenVuln API” entitlement.concelier:sources:cisco:ClientId, :ClientSecret, :TokenEndpoint, :BaseUriPageSize<=100, RequestDelay=250 ms, RequestTimeout=30 s, retry attempts=5free (entitlement gated)none
oracleConnector.Vndr.Oraclenone-public (HTML calendar + advisory pages)n/a — public scrape of https://www.oracle.com/security-alerts/concelier:sources:oracle:CalendarUris[], :AdvisoryUris[], :RequestDelay (default 1 s)self-throttled at RequestDelay=1 sfreenone
adobeConnector.Vndr.Adobenone-public (HTML index scrape)n/a — public scrape of https://helpx.adobe.com/security/security-bulletin.htmlconcelier:sources:adobe:IndexUri, :AdditionalIndexUris[], :InitialBackfill, :WindowOverlapself-throttled; MaxEntriesPerFetch=100freenone
chromiumConnector.Vndr.Chromiumnone-public (Atom feed)n/a — public Atom at https://chromereleases.googleblog.com/atom.xmlconcelier:sources:chromium:FeedUri, :MaxFeedPages, :MaxEntriesPerPage (1–100)self-throttled; MaxEntriesPerPage<=100freenone
appleConnector.Vndr.Applenone-public (Apple Support security releases + detail pages)n/a — public endpoints https://support.apple.com/en-us/100100 + https://support.apple.com/en-us/<article>concelier:sources:apple:SoftwareLookupUri, :AdvisoryBaseUri, :LocaleSegment, :MaxAdvisoriesPerFetch=50self-throttled; allowlist/blocklist supportfreenone
vmwareConnector.Vndr.Vmwarenone-public (Broadcom Security Advisory portal HTML)n/a — public scrape of https://support.broadcom.com/web/ecx/security-advisory?segment=VCconcelier:sources:vmware:IndexUri, :MaxAdvisoriesPerFetch=50, :RequestDelay=250 ms, :HttpTimeout=2 minself-throttledfreenone
siemensConnector.Vndr.Siemensnone-public (CSAF documents over HTTPS)n/a — public CSAF feed at https://cert-portal.siemens.com/productcert/csaf/concelier:sources:siemens:BaseEndpoint, :UseProductionBackend, :SourceDbnot documented in codefreenone
intelConnector.Vndr.Intelnone-public (official CSAF JSON over GitHub)n/a - public GitHub Contents API at https://api.github.com/repos/intel/security-center/contents/advisories; advisory JSON downloaded from https://raw.githubusercontent.com/intel/security-center/...concelier:sources:intel:BaseEndpoint, :MaxAdvisoriesPerFetch, :UseProductionBackend, :SourceDbself-throttled by per-fetch cap; no credential requiredfreenone
amdConnector.Vndr.Amdnone-public (HTML PSIRT page) — production backend stub: fails closed until per-vendor fetcher landsn/a — public scrape target https://www.amd.com/en/resources/product-security.htmlconcelier:sources:amd:BaseEndpoint, :UseProductionBackend, :SourceDbn/a (fetcher not implemented)freenone

Cloud-platform coverage

AWS and GCP have no-credential public fetchers. The standalone azure connector was removed (2026-06-25) — it was an intentional no-op that produced 0 advisories; Azure CVEs are ingested by microsoft/MSRC. The seeded azure catalog row (enabled=false) remains for attribution/policy filtering only. See ../connector-disposition.md.

source_keyconnector pathauth mechanismhow to obtainenv var / config keyrate limitscostgeo
awsConnector.Cloud.Awsnone-public (RSS fetcher, Sprint 046)n/aconcelier:sources:aws:UseProductionBackend, :FeedUrl, :SourceDb, :MaxAdvisoriesPerFetchnone documentedfreenone
azureconnector removed 2026-06-25 (catalog row only, enabled=false)n/a (no connector; Azure CVEs ingested via microsoft/MSRC)n/a - Azure CVEs ingested via microsoft/MSRC connectorn/an/afreenone
gcpConnector.Cloud.Gcpnone-public (Atom fetcher, Sprint 046)n/aconcelier:sources:gcp:UseProductionBackend, :FeedUrl, :SourceDb, :MaxAdvisoriesPerFetchnone documentedfreenone

CERTs

source_keyconnector pathauth mechanismhow to obtainenv var / config keyrate limitscostgeo
cccsConnector.Cccsnone-public (Drupal-style JSON API at cyber.gc.ca)n/a — public endpoints, `?lang=enfr`concelier:sources:cccs:Feeds[] (language+URI pairs), :MaxEntriesPerFetch=80, :RequestTimeout=30 s, :RequestDelay=250 ms, :FailureBackoff=1 minself-throttledfree
jpcert (JVN)Connector.Jvnnone-public (MyJVN public API)n/a — public API at https://jvndb.jvn.jp/myjvnconcelier:sources:jpcert:BaseEndpoint, :WindowSize=7d, :WindowOverlap=1d, :PageSize<=50, :RequestDelay=500 ms, :MaxOverviewPagesPerFetch=20code-tracked: MyJVN max page size = 50freenone
krcert (KISA)Connector.Kisanone-public (RSS + RSS-detail JSON-ish at knvd.krcert.or.kr)n/a — public RSS at https://knvd.krcert.or.kr/rss/securityInfo.doconcelier:sources:krcert:FeedUri, :DetailApiUri, :DetailPageUri, :RequestTimeout=30 s, :RequestDelay=250 ms, :MaxAdvisoriesPerFetch=20self-throttledfreenone from the connector — but feed host frequently unreachable from non-KR egress (deployment-network call)
cert-de (CERT-Bund / WID)Connector.CertBundnone-public (RSS + portal JSON, requires session-cookie bootstrap from wid.cert-bund.de/portal/)n/a — public RSS + SPA JSONconcelier:sources:cert-de:FeedUri, :PortalBootstrapUri, :DetailApiUri, :RequestTimeout=30 s, :RequestDelay=250 ms, :MaxAdvisoriesPerFetch=50self-throttledfreenone
cert-frConnector.CertFrnone-public (RSS at cert.ssi.gouv.fr)n/a — public RSS at https://www.cert.ssi.gouv.fr/alerte/feed/concelier:sources:cert-fr:FeedUri, :InitialBackfill=30d, :WindowOverlap=2d, :MaxItemsPerFetch=100, :RequestDelay=0self-throttled (zero default delay)freenone
cert-inConnector.CertInnone-public (paginated alerts JSON at cert-in.org.in)n/a — public API at https://www.cert-in.org.in/api/alertsconcelier:sources:cert-in:AlertsEndpoint, :WindowSize=30d, :WindowOverlap=2d, :MaxPagesPerFetch=5, :RequestDelay=500 msself-throttledfreenone from the connector — host occasionally geo-blocks non-IN egress (deployment-network call)
cert-atConnector.NationalCertnone-public (RSS at cert.at)n/a - public RSSconcelier:sources:cert-at:FeedUri, :AdditionalFeedUris, :InitialBackfill=365d, :WindowOverlap=2d, :MaxItemsPerFetch=100, :RequestDelay=0self-throttledfreenone
cert-beConnector.NationalCertnone-public (CCB advisories RSS)n/a - public RSSconcelier:sources:cert-be:FeedUri, :AdditionalFeedUris, :InitialBackfill=365d, :WindowOverlap=2d, :MaxItemsPerFetch=100, :RequestDelay=0self-throttledfreenone
cert-euConnector.NationalCertnone-public (CERT-EU security advisory RSS)n/a - public RSSconcelier:sources:cert-eu:FeedUri, :AdditionalFeedUris, :InitialBackfill=365d, :WindowOverlap=2d, :MaxItemsPerFetch=100, :RequestDelay=0self-throttledfreenone
cert-uaConnector.NationalCertnone-public (CERT-UA article RSS)n/a - public RSSconcelier:sources:cert-ua:FeedUri, :AdditionalFeedUris, :InitialBackfill=365d, :WindowOverlap=2d, :MaxItemsPerFetch=100, :RequestDelay=0; disabled by defaultself-throttledfreenone
cert-plConnector.NationalCertnone-public (CERT Polska RSS)n/a - public RSSconcelier:sources:cert-pl:FeedUri, :AdditionalFeedUris, :InitialBackfill=365d, :WindowOverlap=2d, :MaxItemsPerFetch=100, :RequestDelay=0; disabled by defaultself-throttledfreenone

ICS / national CIS sources

source_keyconnector pathauth mechanismhow to obtainenv var / config keyrate limitscostgeo
kaspersky-icsConnector.Ics.Kasperskynone-public (RSS at ics-cert.kaspersky.com)n/a — public RSS at https://ics-cert.kaspersky.com/feed-advisories/concelier:sources:kaspersky-ics:FeedUri, :WindowSize=30d, :WindowOverlap=2d, :MaxPagesPerFetch=3, :RequestDelay=500 msself-throttledfreeclassified — Kaspersky is on multiple sanctions/advisory lists in the US/UK; export-control review required before enabling in those jurisdictions
fstec-bdu (Russia)Connector.Ru.Bdunone-public (downloads vulxml.zip archive over HTTPS)n/a — public archive at https://bdu.fstec.ru/files/documents/vulxml.zipconcelier:sources:fstec-bdu:BaseAddress, :DataArchivePath, :RequestTimeout=2 min, :FailureBackoff=30 min, :UserAgent, :AcceptLanguage, :MaxVulnerabilitiesPerFetch=500, :CacheDirectoryself-throttled (one archive download per cycle)freeclassified — FSTEC is a Russian Federal Service; OFAC/EU dual-use review required before enabling
nkcki (Russia)Connector.Ru.Nkckinone-public (HTML listing at cert.gov.ru/materialy/uyazvimosti/ + bulletin attachments)n/a — public scrapeconcelier:sources:nkcki:BaseAddress, :ListingPath, :RequestTimeout=90 s, :FailureBackoff=20 min, :MaxBulletinsPerFetch=5, :MaxListingPagesPerFetch=3, :MaxVulnerabilitiesPerFetch=250, :KnownBulletinCapacity=512, :RequestDelay=250 ms, :ListingCacheDuration=10 min, :UserAgent, :AcceptLanguage, :CacheDirectoryself-throttledclassified — NKTsKI (HKЦКИ) is the Russian national CERT; OFAC/EU dual-use review required before enabling

Primary databases (mixed — included for completeness because CYCLE-007 surfaced cve as AUTH-SKIPPED)

source_keyconnector pathauth mechanismhow to obtainenv var / config keyrate limitscostgeo
cveConnector.CveNo credential for public cvelistV5; optional API key for CVE Services; operator-supplied baseline zip / seed directory fallbackDefault no-credential mode drains a configured cvelistV5 baseline zip, then reads official public https://raw.githubusercontent.com/CVEProject/cvelistV5/main/cves/. Apply for CVE Services credentials only when using the authenticated API path.concelier:sources:cve:CveListV5Endpoint, optional :ApiOrg, :ApiUser, :ApiKey, :CveListV5BaselineZipPath, :CveListV5BaselineZipSha256, :SeedDirectory, :BaseEndpoint, :PageSize<=500, :MaxPagesPerFetch=5, :InitialBackfill=30d, :RequestDelay=250 ms, :FailureBackoff=10 minself-throttled; local baseline zip avoids public fetch for the corpus; public GitHub/raw path has anonymous HTTP limits; CVE Services advertises throttling but no hard numbers in codefreenone
debianConnector.Distro.Debiannone-public (DSA list/details; optional full security-tracker JSON corpus)n/a - public Debian Security Tracker endpoints. For parity with Debian CVE corpus coverage, enable the JSON tracker path or point it at an internal mirror.concelier:sources:debian:ListEndpoint, :DetailBaseUri, :SecurityPageBaseUri, :MaxAdvisoriesPerFetch=40, :FetchTimeout=45 s, :RequestDelay=0, :EnableJsonTracker=false, :JsonTrackerEndpoint, :JsonMaxAdvisoriesPerMapCycle=5000, :JsonTrackerReleases[]self-throttled by DSA per-fetch cap and JSON map-cycle cap; no credential requiredfreenone

Ecosystem aliases (OSV-routed — no credential needed)

These connectors are alias-only. Data ingestion is performed by Connector.Osv (source key osv), and the alias rows exist so operators can enable/disable per ecosystem from policy/UI and so attribution maps records to the correct source key. No credential is required, and “AUTH-SKIPPED” in CYCLE-007 reflects that they intentionally produce zero direct rows; counts come through the OSV connector.

source_keyconnector pathauth mechanismhow to obtainenv var / config keyrate limitscostgeo
hexConnector.HexOSV-aliasn/aconcelier:sources:hex:Ecosystem (default Hex)inherits OSV connector’s throttlingfreenone
npmConnector.NpmOSV-aliasn/aconcelier:sources:npm:Ecosystem (default npm)inherits OSVfreenone
pypiConnector.PyPiOSV-aliasn/aconcelier:sources:pypi:Ecosystem (default PyPI)inherits OSVfreenone
goConnector.GoOSV-aliasn/aconcelier:sources:go:Ecosystem (default Go)inherits OSVfreenone
govulnConnector.GoVulnOSV-aliasn/aconcelier:sources:govuln:Ecosystem (default Go)inherits OSVfreenone
mavenConnector.MavenOSV-aliasn/aconcelier:sources:maven:Ecosystem (default Maven)inherits OSVfreenone
cratesConnector.CratesOSV-aliasn/aconcelier:sources:crates:Ecosystem (default crates.io)inherits OSVfreenone
packagistConnector.PackagistOSV-aliasn/aconcelier:sources:packagist:Ecosystem (default Packagist)inherits OSVfreenone
pypaConnector.PyPaOSV-aliasn/aconcelier:sources:pypa:Ecosystem (default PyPI), :SourceDbinherits OSVfreenone
rubygemsConnector.RubyGemsOSV-aliasn/aconcelier:sources:rubygems:Ecosystem (default RubyGems)inherits OSVfreenone
rustsecConnector.RustSecOSV-aliasn/aconcelier:sources:rustsec:Ecosystem (default crates.io), :SourceDbinherits OSVfreenone
bundler-auditConnector.BundlerAuditOSV-aliasn/aconcelier:sources:bundler-audit:Ecosystem (default RubyGems), :SourceDbinherits OSVfreenone
chainguardConnector.ChainguardOSV-aliasn/aconcelier:sources:chainguard:Ecosystem (default Chainguard)inherits OSVfreenone
wolfiConnector.WolfiOSV-aliasn/aconcelier:sources:wolfi:Ecosystem (default Wolfi)inherits OSVfreenone

Removed legacy advisory sources

MITRE knowledge bases

Removed under PM Path 2 decision (Sprint 20260513_008, CON-MITRE-004). The Connector.MitreAttack and Connector.MitreD3fend libraries, tests, plugin manifests, and vuln.sources seed rows have all been deleted. The SourceDefinition static fields for mitre-attack / mitre-d3fend have been removed from src/Concelier/__Libraries/StellaOps.Concelier.Core/Sources/SourceDefinitions.cs. The consolidated baseline 001_v1_concelier_baseline.sql purges any rows left behind by the old MITRE seed and by the stella-public-cache mirror domain (the purge blocks at lines 2503-2550, folded in from the pre-1.0 028_remove_mitre_seed_sources.sql and 029_remove_mitre_from_mirror_domain.sql, which are archived and no longer embedded). Design proposal: docs/architecture/proposal-mitre-d3fend-scope.md.

source_keyconnector pathstatus
mitre-attackConnector.MitreAttackRemoved (Sprint 20260513_008, Path 2)
mitre-d3fendConnector.MitreD3fendRemoved (Sprint 20260513_008, Path 2)

Summary by mechanism

The CYCLE-007 “AUTH-SKIPPED” label therefore actually splits three ways for B-CRED-002:

  1. True credential gap (2 rows): microsoft, cisco.
  2. Network/geo policy gap (no credential needed) (10 rows): oracle, adobe, chromium, apple, vmware, cccs, jpcert, krcert, cert-de, cert-fr, cert-in, plus classified kaspersky-ics, fstec-bdu, nkcki.
  3. Implementation gap vs parent coverage: amd and siemens are direct implementation gaps; azure, rhel, nuget, and OSV ecosystem rows are parent/canonical coverage rows whose counts properly belong to microsoft, redhat, ghsa, or osv.

B-CRED-002 should split its operator decisions accordingly: only category (1) is unblocked by acquiring a credential. Categories (2) and (3) need network-policy and implementation-sprint decisions respectively.