GitHub connector¶
What this connector reads¶
The GitHub connector reads five distinct AI signals from your GitHub organisation. Together they form the strongest single source of evidence about what AI is being built or consumed by your engineering team:
- GitHub Copilot seats. Who has an active Copilot Business or Copilot Enterprise seat — assignment date, last activity, last IDE used.
- AI library dependencies in repository SBOMs. Repositories whose dependency graph includes one of ~30 known AI SDKs (OpenAI, Anthropic, LangChain, LlamaIndex, Hugging Face, Cohere, Mistral, Vertex AI, etc.).
- AI URLs referenced in code. A code-search pass for known
AI service URLs (e.g.,
api.openai.com,api.anthropic.com,bedrock-runtime.*.amazonaws.com). Surfaces shadow usage that bypasses package managers (e.g., a Python script usingrequestsdirectly). - AI Actions in workflow YAML. A static parse of every
.github/workflows/*.ymllooking for steps that call an AI provider's GitHub Action. - DNS hits from passive cloud logs (when a GitHub Actions runner calls an AI URL during a workflow run, that hit shows up in the cloud passive collector and is correlated back to the GitHub repo through the runner identity — this stitches across connectors automatically).
We see repository names, file paths, package names, and Action versions — not source code contents beyond the lines that match the AI URL patterns.
What you (the customer) need to do¶
You will need a GitHub organisation owner (the role that can install GitHub Apps).
- In Secruna, open Connections → Connect GitHub. (screenshot placeholder TODO)
- You are redirected to
github.com/apps/rekognise/installations/new. - Choose the organisation to install to. Install on all repositories is recommended — discovery is read-only, and restricting to a subset means shadow signals living in non-installed repos go undetected. (screenshot placeholder TODO)
- GitHub displays the requested permissions list (see below). Click Install.
- You are redirected back to Secruna. The connection appears
as
active. The first discovery run starts within minutes.
Status note. Plan 16a uses a GitHub App, not an OAuth user grant. This is intentional: App installs survive when the installing user leaves the org, and they cannot read user private repositories that aren't owned by the org.
Permissions / scopes requested¶
GitHub Apps declare fine-grained permissions. Ours requests:
| Permission | Access | Why we need it |
|---|---|---|
| Metadata | Read | Required for any GitHub App; also used to list org repos. |
| Copilot | Read | List Copilot seats and last-activity timestamps via /orgs/{org}/copilot/billing/seats. |
| Dependency graph | Read | Pull SBOMs via /repos/{org}/{repo}/dependency-graph/sbom to detect AI library usage. |
| Code search | Read (org-level) | Run code-search queries scoped to your org for AI-URL string patterns. |
| Contents | Read (limited to .github/workflows/* only — see below) |
Fetch .github/workflows/*.yml files to parse Action references. |
| Actions | Read (if granted) | Tolerate 403 Forbidden cleanly — this permission is requested but the connector still works without it. |
A note on the Contents: Read permission. GitHub does not
allow restricting Contents: Read to a specific path inside a
repository at the App-permission level. Our connector only
calls /repos/{org}/{repo}/contents/.github/workflows and the
files inside that path. The App permission technically grants
read access to the whole repo, but the connector code never reads
anything outside the workflows directory. This is an honest gap
between what the platform allows us to declare and what we
actually exercise. We are open to publishing a static-analysis
proof of this scope if your security team asks for it (the
relevant code is packages/rekognise-core/src/rekognise/data_plane/github_connector/connector.py).
What we do NOT touch¶
- Source code outside
.github/workflows/is never fetched. The code-search API returns line snippets containing the AI URL patterns; we do not pull the surrounding file. - Issues, pull requests, discussions, wiki contents.
- Personal user data — we read aggregate Copilot seat metadata (assigned-by user, last activity) which already identifies the seat assignee, but we never call user-level APIs.
- Secrets — neither Actions secrets nor repository secrets.
- Repositories outside the organisations you installed the App on.
How to revoke access¶
- In GitHub → Organisation settings → GitHub Apps → Secruna → Configure → Uninstall. The installation is destroyed immediately and our installation token cannot be re-minted.
- In Secruna, open Connections and click Disconnect on the GitHub row.
- Within 90 days every artefact collected through this connection is purged. See data retention policy.
If you want to narrow coverage, you can change the App installation to a specific repo subset under the same flow (Configure → Repository access → Only select repositories). We respect that immediately on the next discovery run.
Troubleshooting¶
| Error you see | Likely cause | Fix |
|---|---|---|
Connection: failed — GitHub App JWT exchange failed |
Our App's private key has rotated and our control plane has not yet picked up the new value. | Email support — this is a Secruna-side issue. |
0 Copilot seats despite having a Copilot subscription |
Copilot is provisioned at the enterprise level rather than the org level, and the App was installed on an org without Copilot billing. | Install the App on the organisation that has the Copilot subscription. |
0 SBOM signals for repos that obviously use AI libraries |
Dependency graph not enabled on those repos. | Repository → Settings → Code security and analysis → Enable Dependency graph. |
0 code search hits |
Code search permission is org-wide; if the app installation does not include all repos, hits in excluded repos are invisible. | Re-configure the App to include all repositories (recommended) or accept the gap. |
0 workflow hits |
The connector silently tolerates 403 on the Contents API. If your org disables App-token access to repository contents, workflow scanning is skipped entirely. | This is by design — the other four signals continue to work. |
Related pages¶
- Subprocessor list — GitHub is a controller-controlled subprocessor (your org's GitHub account is yours; we read from it via the App install).
- DPA template — Annex II details the metadata categories produced by this connector, including Copilot seat assignee identifiers (these are personal data about your employees).