
Analysez les bases de code et les projets GCP pour détecter les identifiants API exposés.
Analysez les bases de code, les projets GCP et les pipelines CI pour détecter les identifiants Google API exposés — avant qu'ils ne soient exploités.
Le problème : Google a activé rétroactivement l'accès à l'API Gemini sur des clés API existantes (Maps, Places, etc.) conçues pour être publiques et intégrées dans du code côté client. Lorsque quelqu'un de votre équipe active Gemini dans le même projet GCP, ces clés déjà publiques deviennent silencieusement des identifiants Gemini — exposant votre projet à une utilisation non autorisée de l'IA et à des incidents de facturation de plus de 80 000 $ (contexte).
Ce que fait keyguard :
keyguard scan — trouve les chaînes d'identifiants dans les fichiers source et l'historique Git en utilisant regex + détection d'entropiekeyguard audit — se connecte aux projets GCP actifs et signale les clés API qui ont actuellement accès à Geminikeyguard ci — analyse les logs et variables de GitHub Actions, CircleCI et GitLab CI pour les identifiants divulguéspip install keyguard-scan
Ou clonez et installez en mode développement :
git clone https://github.com/arzaan789/keyguard.git
cd keyguard
pip install -e ".[dev]"
# Scan current directory and git history
keyguard scan .
# Audit your live GCP projects
keyguard audit
# Scan CI platforms
keyguard ci
keyguard scanAnalyse les fichiers source et l'historique Git à la recherche d'identifiants exposés en utilisant regex + filtrage d'entropie de Shannon. Les placeholders de faible entropie comme "REPLACE_ME" ou "XXXXXXXX" sont automatiquement ignorés.
# Scan a directory (files + full git history)
keyguard scan .
# Files only, skip git history
keyguard scan . --no-git-history
# Export to JSON and SARIF
keyguard scan . --output json --output sarif --out-file report
# Show actual key values (not redacted)
keyguard scan . --no-redact
# Use a custom config file
keyguard scan . --config /path/to/.keyguard.toml
Codes de sortie : 0 = propre, 1 = résultats, 2 = erreur
keyguard auditSe connecte aux projets GCP actifs via les API Cloud Resource Manager, Service Usage et API Keys. Signale les clés qui sont sans restriction (accès silencieux à Gemini) ou qui autorisent explicitement generativelanguage.googleapis.com alors que Gemini est activé sur le projet.
L'authentification utilise par défaut les Application Default Credentials — exécutez d'abord gcloud auth application-default login.
# Audit all accessible GCP projects
keyguard audit
# Audit specific project(s)
keyguard audit --project my-project-id --project another-project
# Use a service account key file
keyguard audit --gcp-credentials /path/to/key.json
# Export JSON findings
keyguard audit --output json --out-file gcp-findings.json
Résultats :
CRITICAL — la clé n'a aucune restriction d'API + Gemini est activé (le scénario de mise à niveau silencieuse Maps→Gemini)HIGH — la clé autorise explicitement generativelanguage.googleapis.com (intentionnel mais potentiellement intégré dans du code client)keyguard ciAnalyse les logs des plateformes CI et les variables stockées pour les identifiants exposés. Prend en charge GitHub Actions, CircleCI et GitLab CI.
# Scan all configured platforms
keyguard ci
# Scan one platform only
keyguard ci --platform github
# Narrow to a specific repo
keyguard ci --repo my-org/api-service
# Export JSON findings
keyguard ci --output json --out-file ci-findings.json
Ce qu'il analyse :
keyguard watchRéanalyse les fichiers à chaque modification. Utile pendant le développement.
keyguard watch .
keyguard rules listListe toutes les règles de détection actives.
keyguard rules list
keyguard config checkValide un fichier de configuration .keyguard.toml.
keyguard config check
keyguard config check --config /path/to/.keyguard.toml
Créez un fichier .keyguard.toml à la racine de votre projet :
[scan]
paths = ["."]
exclude = ["tests/fixtures/", "**/*.example"]
scan_git_history = true
[output]
format = ["terminal", "json"]
redact = true
[notify]
slack_webhook = "https://hooks.slack.com/services/..."
[rules]
disabled = []
# CI platform authentication and scope
[ci]
github_token = "ghp_xxxxxxxxxxxxxxxxxxxx"
circleci_token = "CCIPAT_xxxxxxxxxxxxxxxx"
gitlab_token = "glpat-xxxxxxxxxxxxxxxxxxxx"
gitlab_url = "https://gitlab.com" # override for self-hosted GitLab
max_runs = 10 # recent runs/pipelines per repo
[ci.github]
orgs = ["my-org"]
repos = ["my-org/specific-repo"] # optional: scan specific repos only
[ci.circleci]
orgs = ["my-org"]
[ci.gitlab]
groups = ["my-group"]
Keyguard utilise une approche regex + entropie de Shannon. Chaque règle définit :
AIza[0-9A-Za-z\-_]{35} pour les clés API Google)Les règles intégrées détectent :
| ID de règle | Ce qu'il trouve |
|---|---|
google-api-key | Clés API Google (AIza...) — y compris les clés Maps ayant obtenu silencieusement un accès Gemini |
gcp-service-account-key | Clés privées RSA de comptes de service GCP |
google-oauth-client-secret | Secrets clients OAuth2 Google (GOCSPX-...) |
Vous pouvez ajouter des règles personnalisées dans .keyguard.toml :
[[rules.extra]]
id = "my-internal-token"
description = "Internal service token"
pattern = "tok-[0-9a-f]{32}"
entropy_min = 3.5
severity = "high"
tags = ["internal"]
name: keyguard scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # full history for git scan
- run: pip install keyguard-scan
- run: keyguard scan .
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: keyguard
name: keyguard credential scan
entry: keyguard scan --no-git-history
language: system
pass_filenames: false
docker run --rm -v $(pwd):/repo ghcr.io/arzaan789/keyguard scan /repo
Terminal (par défaut) — tableau coloré regroupé par sévérité.
JSON — tableau de résultats lisible par machine :
keyguard scan . --output json --out-file findings.json
SARIF — s'intègre avec l'onglet Sécurité de GitHub et d'autres outils SAST :
keyguard scan . --output sarif --out-file findings.sarif
Webhook Slack — publie un résumé lorsque des résultats sont détectés :
[notify]
slack_webhook = "https://hooks.slack.com/services/..."
git clone https://github.com/arzaan789/keyguard.git
cd keyguard
pip install -e ".[dev]"
pytest
143 tests, 0 échecs.
Structure du projet :
keyguard/
scanner/ # file + git history scanners
engine/ # regex + entropy detection (rules, matcher)
output/ # terminal, JSON/SARIF, webhook
auditor/ # GCP API client + audit logic
ci/ # GitHub Actions, CircleCI, GitLab CI scanners
cli.py # Click CLI entry point
config.py # .keyguard.toml loader
MIT