Przejdź do treści

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:

  1. GitHub Copilot seats. Who has an active Copilot Business or Copilot Enterprise seat — assignment date, last activity, last IDE used.
  2. 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.).
  3. 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 using requests directly).
  4. AI Actions in workflow YAML. A static parse of every .github/workflows/*.yml looking for steps that call an AI provider's GitHub Action.
  5. 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).

  1. In Secruna, open Connections → Connect GitHub. (screenshot placeholder TODO)
  2. You are redirected to github.com/apps/rekognise/installations/new.
  3. 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)
  4. GitHub displays the requested permissions list (see below). Click Install.
  5. 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

  1. In GitHub → Organisation settings → GitHub Apps → Secruna → Configure → Uninstall. The installation is destroyed immediately and our installation token cannot be re-minted.
  2. In Secruna, open Connections and click Disconnect on the GitHub row.
  3. 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.
  • 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).