- Introduced AGENTS.md, README.md, TASKS.md, and implementation_plan.md for Vexer, detailing mission, responsibilities, key components, and operational notes. - Established similar documentation structure for Vulnerability Explorer and Zastava modules, including their respective workflows, integrations, and observability notes. - Created risk scoring profiles documentation outlining the core workflow, factor model, governance, and deliverables. - Ensured all modules adhere to the Aggregation-Only Contract and maintain determinism and provenance in outputs.
		
			
				
	
	
	
		
			5.9 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			5.9 KiB
		
	
	
	
	
	
	
	
Concelier Cisco PSIRT Connector – OAuth Provisioning SOP
Last updated: 2025-10-14
1. Scope
This runbook describes how Ops provisions, rotates, and distributes Cisco PSIRT openVuln OAuth client credentials for the Concelier Cisco connector. It covers online and air-gapped (Offline Kit) environments, quota-aware execution, and escalation paths.
2. Prerequisites
- Active Cisco.com (CCO) account with access to the Cisco API Console.
 - Cisco PSIRT openVuln API entitlement (visible under “My Apps & Keys” once granted).citeturn3search0
 - Concelier configuration location (typically 
/etc/stella/concelier.yamlin production) or Offline Kit secret bundle staging directory. 
3. Provisioning workflow
- Register the application
- Sign in at https://apiconsole.cisco.com.
 - Select Register a New App → Application Type: 
Service, Grant Type:Client Credentials, API:Cisco PSIRT openVuln API.citeturn3search0 - Record the generated 
clientIdandclientSecretin the Ops vault. 
 - Verify token issuance
- Request an access token with:
curl -s https://id.cisco.com/oauth2/default/v1/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id=${CLIENT_ID}" \ -d "client_secret=${CLIENT_SECRET}" - Confirm HTTP 200 and an 
expires_invalue of 3600 seconds (tokens live for one hour).citeturn3search0turn3search7 - Preserve the response only long enough to validate syntax; do not persist tokens.
 
 - Request an access token with:
 - Authorize Concelier runtime
- Update 
concelier:sources:cisco:auth(or the module-specific secret template) with the stored credentials. - For Offline Kit delivery, export encrypted secrets into 
offline-kit/secrets/cisco-openvuln.jsonusing the platform’s sealed secret format. 
 - Update 
 - Connectivity validation
- From the Concelier control plane, run 
stella db jobs run source:vndr-cisco:fetch --dry-run. - Ensure the Source HTTP diagnostics record 
Bearerauthorization headers and no 401/403 responses. 
 - From the Concelier control plane, run 
 
4. Rotation SOP
| Step | Owner | Notes | 
|---|---|---|
| 1. Schedule rotation | Ops (monthly board) | Rotate every 90 days or immediately after suspected credential exposure. | 
| 2. Create replacement app | Ops | Repeat §3.1 with “-next” suffix; verify token issuance. | 
| 3. Stage dual credentials | Ops + Concelier On-Call | Publish new credentials to secret store alongside current pair. | 
| 4. Cut over | Concelier On-Call | Restart connector workers during a low-traffic window (<10 min) to pick up the new secret. | 
| 5. Deactivate legacy app | Ops | Delete prior app in Cisco API Console once telemetry confirms successful fetch/parse cycles for 2 consecutive hours. | 
Automation hooks
- Rotation reminders are tracked in OpsRunbookOps board (
OPS-RUN-KEYSswim lane); add checklist items for Concelier Cisco when opening a rotation task. - Use the secret management pipeline (
ops/secrets/rotate.sh --connector cisco) to template vault updates; the script renders a redacted diff for audit. 
5. Offline Kit packaging
- Generate the credential bundle using the Offline Kit CLI:
offline-kit secrets add cisco-openvuln --client-id … --client-secret … - Store the encrypted payload under 
offline-kit/secrets/cisco-openvuln.enc. - Distribute via the Offline Kit channel; update 
offline-kit/MANIFEST.mdwith the credential fingerprint (SHA256 of plaintext concatenated with metadata). - Document validation steps for the receiving site (token request from an air-gapped relay or cached token mirror).
 
6. Quota and throttling guidance
- Cisco enforces combined limits of 5 requests/second, 30 requests/minute, and 5 000 requests/day per application.citeturn0search0turn3search6
 - Concelier fetch jobs must respect 
Retry-Afterheaders on HTTP 429 responses; Ops should monitor for sustained quota saturation and consider paging window adjustments. - Telemetry to watch: 
concelier.source.http.requests{concelier.source="vndr-cisco"},concelier.source.http.failures{...}, and connector-specific metrics once implemented. 
7. Telemetry & Monitoring
- Metrics (Meter 
StellaOps.Concelier.Connector.Vndr.Cisco)cisco.fetch.documents,cisco.fetch.failures,cisco.fetch.unchangedcisco.parse.success,cisco.parse.failurescisco.map.success,cisco.map.failures,cisco.map.affected.packages
 - Shared HTTP metrics via 
SourceDiagnostics:concelier.source.http.requests{concelier.source="vndr-cisco"}concelier.source.http.failures{concelier.source="vndr-cisco"}concelier.source.http.duration{concelier.source="vndr-cisco"}
 - Structured logs
Cisco fetch completed date=… pages=… added=…(info)Cisco parse completed parsed=… failures=…(info)Cisco map completed mapped=… failures=…(info)- Warnings surface when DTO serialization fails or GridFS payload is missing.
 
 - Suggested alerts: non-zero 
cisco.fetch.failuresin 15m, orcisco.map.successflatlines while fetch continues. 
8. Incident response
- Token compromise – revoke the application in the Cisco API Console, purge cached secrets, rotate immediately per §4.
 - Persistent 401/403 – confirm credentials in vault, then validate token issuance; if unresolved, open a Cisco DevNet support ticket referencing the application ID.
 - 429 spikes – inspect job scheduler cadence and adjust connector options (
maxRequestsPerWindow) before requesting higher quotas from Cisco. 
9. References
- Cisco PSIRT openVuln API Authentication Guide.citeturn3search0
 - Accessing the openVuln API using curl (token lifetime).citeturn3search7
 - openVuln API rate limit documentation.citeturn0search0turn3search6