This custom integration automatically imports Ghost Security findings into runZero, creating assets for each repository and attaching vulnerability data derived from Ghost scans.
The integration now dynamically:
- Retrieves all repositories (and their deployments) from the Ghost API.
- Extracts hostnames from each project’s deployment environments.
- Fetches all findings and associates them with the appropriate repository using the
repo_idfield. - Creates
ImportAssetobjects in runZero, complete with hostnames, network interfaces, and vulnerabilities.
No manual mapping of repositories to IPs or hostnames is required.
- Superuser access to Custom Integrations.
- A configured Custom Integration Credential for the Ghost API.
-
A Ghost API key with read access to:
/v1/repos/v1/findings
-
API base URL:
https://api.ghostsecurity.ai/v1/
- Log in to your Ghost Security console.
- Navigate to your account or organization API Keys section.
- Generate a new key with read permissions for repositories and findings.
- Copy the key — you’ll use it as your
access_secretin runZero.
-
Go to runZero Credentials.
-
Choose Custom Integration Script Secrets.
-
Enter:
access_secret: your Ghost API keyaccess_key: any placeholder value (unused)
-
Save the credential.
- Go to Custom Integrations.
- Add a name (e.g.,
ghost-security) and optional icon. - Enable Custom integration script.
- Paste in the
custom-integration-ghost.starscript (latest version). - Click Validate to confirm syntax.
- Save the integration.
- Go to Ingest → Custom.
- Choose your Ghost credential and Ghost custom integration.
- Assign an Explorer to run the task.
- Set a schedule (e.g., daily or weekly sync).
- Save to start ingesting Ghost data.
-
The integration calls
GET /v1/reposto fetch all repositories.- Each repo’s project
deploymentsare parsed to extract hostnames (production, staging, etc.).
- Each repo’s project
-
It then calls
GET /v1/findingsto collect findings.- Each finding includes a
repo_idand optionalproject.deployments. - The script maps findings back to repositories using
repo_id.
- Each finding includes a
-
Assets are created for each repo in runZero with:
- Hostnames from Ghost deployments.
- Associated vulnerabilities for each finding.
| Ghost Field | runZero Field |
|---|---|
repo_id / repo_url |
Asset ID / Custom Attributes |
deployments (from projects) |
Asset Hostnames |
findings.* |
Vulnerabilities |
severity, confidence, attack_feasibility, remediation_effort |
Vulnerability Attributes |
attack_walkthrough, remediation, description |
Vulnerability Details |
- ✅ No manual repo mapping needed — the script auto-discovers deployments from Ghost.
- ⚙️ Supports pagination for large repo lists.
- 🧩 Each Ghost finding becomes a
Vulnerabilityin runZero. - 🕒 You can schedule periodic syncs to keep findings up to date.
- 🧾 All Ghost metadata (e.g.
repo_url,repo_id,project_id) is stored undercustom_attributesin each vulnerability.
-
Run locally for testing:
runzero script -f custom-integration-ghost.star --kwargs access_secret=<YOUR_GHOST_API_KEY>
-
Logs will show:
- Repositories discovered
- Findings processed
- Assets and vulnerabilities created
-
If no assets appear:
- Ensure your Ghost account has repositories with findings.
- Confirm the API key has access to
/v1/reposand/v1/findings.
Example asset in runZero created by this integration:
| Field | Example |
|---|---|
| Asset Name | juice-shop |
| Hostnames | juice.shop, staging.juice.shop, test.juice.shop |
| Vulnerabilities | 35 |
| Severity | High / Medium / Low |
| Source | Custom Integration: Ghost |
Would you like me to add a “Changelog” section at the bottom (summarizing this update vs. the old repo_map-based approach)? That can help future maintainers quickly see why the new version doesn’t use manual mappings anymore.