К основному содержанию
хук официальный · GitHub

secrets-scanner — хук для GitHub Copilot: ловит утечки секретов

Сканирует изменённые за сессию файлы на утёкшие ключи и пароли перед коммитом. Пригодится, когда агент правит код быстро и легко тащит в него токен.

Установить в Claude Code · Вручную: положить файлы Все способы и платформы ↓
.claude/settings.json
Открыть на GitHub

Что делает secrets-scanner

Хук запускается на событии sessionEnd, то есть в конце сессии GitHub Copilot coding agent. Он собирает изменённые файлы через git diff, отбрасывает бинарники и lock-файлы и прогоняет каждую строку по шаблонам известных секретов: ключи AWS, GCP, Azure, токены GitHub, npm, Slack, Stripe, приватные ключи RSA и OpenSSH, строки подключения к PostgreSQL, MongoDB, MySQL, Redis, MSSQL, JWT и внутренние IP с портами. Всего больше двадцати категорий.

Режим задаётся переменной SCAN_MODE: warn только пишет находки в лог, block завершает работу с ненулевым кодом и не даёт агенту закоммитить. Область сканирования — SCAN_SCOPE со значениями diff или staged. Совпадения, похожие на заглушки вроде example, changeme или your_, пропускаются, а ложные срабатывания можно перечислить в SECRETS_ALLOWLIST. Логи пишутся в logs/copilot/secrets/scan.log в формате JSON Lines, а сами находки в логе обрезаны, чтобы не светить секрет повторно.

Зависимостей нет: скрипту хватает grep, file и git. Установка ручная — папку копируют в .github/hooks/, скрипту выдают право на выполнение, создают каталог логов и добавляют его в .gitignore. Если поставить этот хук вместе с Session Auto-Commit, порядок важен: сканер должен идти первым, иначе автокоммит сработает раньше проверки. Для блокировки в такой связке нужен именно SCAN_MODE=block.

Какие задачи решает

  • поймать ключ AWS, случайно попавший в изменённый файл
  • остановить коммит, пока в коде лежит токен GitHub
  • отсеять заглушки и примеры, чтобы не разбирать ложные срабатывания
  • получить журнал находок в JSON Lines для аудита
  • запретить автокоммит при обнаруженном секрете

Примеры запросов агенту

  • Включи secrets-scanner в режиме block, чтобы агент не коммитил секреты
  • Поставь SCAN_SCOPE=staged и проверь только файлы в индексе
  • Добавь test_key_123 в SECRETS_ALLOWLIST, это ложное срабатывание

Как установить secrets-scanner

Вручную: положить файлы

.claude/settings.json

Блок hooks: событие (PreToolUse, PostToolUse, Stop…) → команда. Личные — ~/.claude/settings.json

По шагам, с командами для каждой платформы: Хуки Claude Code: что это, где настраивать и как запретить опасную команду

Вопросы о secrets-scanner

Как установить secrets-scanner в GitHub Copilot?

Скопируйте папку хука в репозиторий командой cp -r hooks/secrets-scanner .github/hooks/, затем выдайте скрипту право на выполнение: chmod +x .github/hooks/secrets-scanner/scan-secrets.sh. После этого создайте каталог логов и добавьте его в .gitignore: mkdir -p logs/copilot/secrets и echo "logs/" >> .gitignore. Остаётся закоммитить конфигурацию хука в основную ветку.

Что делает secrets-scanner?

В конце сессии агента он сканирует изменённые файлы на утёкшие секреты: облачные ключи, токены платформ, приватные ключи, строки подключения и JWT. Находки пишутся в лог, а в режиме block сессия завершается с ошибкой до коммита.

Чем warn отличается от block?

warn только записывает находки в лог и ничего не останавливает. block завершает работу с ненулевым кодом, и агент не коммитит. Режим задаётся переменной SCAN_MODE.

Исходный текст

secrets-scanner · MIT
---
name: 'Secrets Scanner'
description: 'Scans files modified during a Copilot coding agent session for leaked secrets, credentials, and sensitive data'
tags: ['security', 'secrets', 'scanning', 'session-end']
---

# Secrets Scanner Hook

Scans files modified during a GitHub Copilot coding agent session for accidentally leaked secrets, credentials, API keys, and other sensitive data before they are committed.

## Overview

AI coding agents generate and modify code rapidly, which increases the risk of hardcoded secrets slipping into the codebase. This hook acts as a safety net by scanning all modified files at session end for 20+ categories of secret patterns, including:

- **Cloud credentials**: AWS access keys, GCP service account keys, Azure client secrets
- **Platform tokens**: GitHub PATs, npm tokens, Slack tokens, Stripe keys
- **Private keys**: RSA, EC, OpenSSH, PGP, DSA private key blocks
- **Connection strings**: Database URIs (PostgreSQL, MongoDB, MySQL, Redis, MSSQL)
- **Generic secrets**: API keys, passwords, bearer tokens, JWTs
- **Internal infrastructure**: Private IP addresses with ports

## Features

- **Two scan modes**: `warn` (log only) or `block` (exit non-zero to prevent commit)
- **Two scan scopes**: `diff` (modified files vs HEAD) or `staged` (git-staged files only)
- **Smart filtering**: Skips binary files, lock files, and placeholder/example values
- **Allowlist support**: Exclude known false positives via `SECRETS_ALLOWLIST`
- **Structured logging**: JSON Lines output for integration with monitoring tools
- **Redacted output**: Findings are truncated in logs to avoid re-exposing secrets
- **Zero dependencies**: Uses only standard Unix tools (`grep`, `file`, `git`)

## Installation

1. Copy the hook folder to your repository:

   ```bash
   cp -r hooks/secrets-scanner .github/hooks/
   ```

2. Ensure the script is executable:

   ```bash
   chmod +x .github/hooks/secrets-scanner/scan-secrets.sh
   ```

3. Create the logs directory and add it to `.gitignore`:

   ```bash
   mkdir -p logs/copilot/secrets
   echo "logs/" >> .gitignore
   ```

4. Commit the hook configuration to your repository's default branch.

## Configuration

The hook is configured in `hooks.json` to run on the `sessionEnd` event:

```json
{
  "version": 1,
  "hooks": {
    "sessionEnd": [
      {
        "type": "command",
        "bash": ".github/hooks/secrets-scanner/scan-secrets.sh",
        "cwd": ".",
        "env": {
          "SCAN_MODE": "warn",
          "SCAN_SCOPE": "diff"
        },
        "timeoutSec": 30
      }
    ]
  }
}
```

### Environment Variables

| Variable | Values | Default | Description |
|----------|--------|---------|-------------|
| `SCAN_MODE` | `warn`, `block` | `warn` | `warn` logs findings only; `block` exits non-zero to prevent auto-commit |
| `SCAN_SCOPE` | `diff`, `staged` | `diff` | `diff` scans uncommitted changes vs HEAD; `staged` scans only staged files |
| `SKIP_SECRETS_SCAN` | `true` | unset | Disable the scanner entirely |
| `SECRETS_LOG_DIR` | path | `logs/copilot/secrets` | Directory where scan logs are written |
| `SECRETS_ALLOWLIST` | comma-separated | unset | Patterns to ignore (e.g., `test_key_123,example.com`) |

## How It Works

1. When a Copilot coding agent session ends, the hook executes
2. Collects all modified files using `git diff` (respects the configured scope)
3. Filters out binary files and lock files
4. Scans each text file line-by-line against 20+ regex patterns for known secret formats
5. Skips matches that look like placeholders (e.g., values containing `example`, `changeme`, `your_`)
6. Checks matches against the allowlist if configured
7. Reports findings with file path, line number, pattern name, and severity
8. Writes a structured JSON log entry for audit purposes
9. In `block` mode, exits non-zero to signal the agent to stop before committing

## Detected Secret Patterns

| Pattern | Severity | Example Match |
|---------|----------|---------------|
| `AWS_ACCESS_KEY` | critical | `AKIAIOSFODNN7EXAMPLE` |
| `AWS_SECRET_KEY` | critical | `aws_secret_access_key = wJalr...` |
| `GCP_SERVICE_ACCOUNT` | critical | `"type": "service_account"` |
| `GCP_API_KEY` | high | `AIzaSyC...` |
| `AZURE_CLIENT_SECRET` | critical | `azure_client_secret = ...` |
| `GITHUB_PAT` | critical | `ghp_xxxxxxxxxxxx...` |
| `GITHUB_FINE_GRAINED_PAT` | critical | `github_pat_...` |
| `PRIVATE_KEY` | critical | `-----BEGIN RSA PRIVATE KEY-----` |
| `GENERIC_SECRET` | high | `api_key = "sk-..."` |
| `CONNECTION_STRING` | high | `postgresql://user:pass@host/db` |
| `SLACK_TOKEN` | high | `xoxb-...` |
| `STRIPE_SECRET_KEY` | critical | `sk_live_...` |
| `NPM_TOKEN` | high | `npm_...` |
| `JWT_TOKEN` | medium | `eyJhbGci...` |
| `INTERNAL_IP_PORT` | medium | `192.168.1.1:8080` |

See the full list in `scan-secrets.sh`.

## Example Output

### Clean scan

```
🔍 Scanning 5 modified file(s) for secrets...
✅ No secrets detected in 5 scanned file(s)
```

### Findings detected (warn mode)

```
🔍 Scanning 3 modified file(s) for secrets...

⚠️  Found 2 potential secret(s) in modified files:

  FILE                                     LINE   PATTERN                      SEVERITY
  ----                                     ----   -------                      --------
  src/config.ts                            12     GITHUB_PAT                   critical
  .env.local                               3      CONNECTION_STRING            high

💡 Review the findings above. Set SCAN_MODE=block to prevent commits with secrets.
```

### Findings detected (block mode)

```
🔍 Scanning 3 modified file(s) for secrets...

⚠️  Found 1 potential secret(s) in modified files:

  FILE                                     LINE   PATTERN                      SEVERITY
  ----                                     ----   -------                      --------
  lib/auth.py                              45     AWS_ACCESS_KEY               critical

🚫 Session blocked: resolve the findings above before committing.
   Set SCAN_MODE=warn to log without blocking, or add patterns to SECRETS_ALLOWLIST.
```

## Log Format

Scan events are written to `logs/copilot/secrets/scan.log` in JSON Lines format:

```json
{"timestamp":"2026-03-13T10:30:00Z","event":"secrets_found","mode":"warn","scope":"diff","files_scanned":3,"finding_count":2,"findings":[{"file":"src/config.ts","line":12,"pattern":"GITHUB_PAT","severity":"critical","match":"ghp_...xyz1"}]}
```

```json
{"timestamp":"2026-03-13T10:30:00Z","event":"scan_complete","mode":"warn","scope":"diff","status":"clean","files_scanned":5}
```

## Pairing with Other Hooks

This hook pairs well with the **Session Auto-Commit** hook. When both are installed, order them so that `secrets-scanner` runs first:

1. Secrets scanner runs at `sessionEnd`, catches leaked secrets
2. Auto-commit runs at `sessionEnd`, only commits if all previous hooks pass

Set `SCAN_MODE=block` to prevent auto-commit when secrets are detected.

## Customization

- **Add custom patterns**: Edit the `PATTERNS` array in `scan-secrets.sh` to add project-specific secret formats
- **Adjust sensitivity**: Change severity levels or remove patterns that generate false positives
- **Allowlist known values**: Use `SECRETS_ALLOWLIST` for test fixtures or known safe patterns
- **Change log location**: Set `SECRETS_LOG_DIR` to route logs to your preferred directory

## Disabling

To temporarily disable the scanner:

- Set `SKIP_SECRETS_SCAN=true` in the hook environment
- Or remove the `sessionEnd` entry from `hooks.json`

## Limitations

- Pattern-based detection; does not perform entropy analysis or contextual validation
- May produce false positives for test fixtures or example code (use the allowlist to suppress these)
- Scans only text files; binary secrets (keystores, certificates in DER format) are not detected
- Requires `git` to be available in the execution environment


```json
{
  "version": 1,
  "hooks": {
    "sessionEnd": [
      {
        "type": "command",
        "bash": ".github/hooks/secrets-scanner/scan-secrets.sh",
        "cwd": ".",
        "env": {
          "SCAN_MODE": "warn",
          "SCAN_SCOPE": "diff"
        },
        "timeoutSec": 30
      }
    ]
  }
}

```

© github · MIT · github/awesome-copilot

Похожие хуки

Всё по теме «Безопасность» →

Из того же набора732

Весь набор →
dataverse-python-modules Правило подкладывает агенту карту модулей PowerPlatform.Dataverse: клиент, конфиг, ошибки, OData и SQL. Пригодится, когда код на Python работает с Dataverse. ★ 40 418звёзд репо dataverse-python-file-operations Задаёт инструкции по загрузке файлов в Microsoft Dataverse через Python SDK. Помогает настроить чанкование для объектов больше 128 МБ и повтор запросов при сетевых сбоях. ★ 40 418звёзд репо dataverse-python-error-handling Правило подсказывает, как обрабатывать ошибки Dataverse SDK for Python: разбирать коды ответа и решать, когда повторять запрос. ★ 40 418звёзд репо dataverse-python-best-practices Правило для GitHub Copilot с рабочими шаблонами работы с Dataverse SDK для Python: авторизация, клиент, CRUD-операции. ★ 40 418звёзд репо dependency-license-checker Хук для GitHub Copilot, который в конце сессии агента сканирует новые зависимости и помечает копилефт-лицензии до коммита. ★ 40 418звёзд репо WG Code Sentinel Субагент для GitHub Copilot, который проверяет код и конфигурации на уязвимости и предлагает конкретные исправления. Пригодится перед мержем или релизом. ★ 40 418звёзд репо Expert Vue.js Frontend Engineer Субагент для GitHub Copilot, заточенный под Vue 3, Composition API, TypeScript и архитектуру компонентов. Помогает строить фронтенд, мигрировать с Vue 2 и оптимизировать рендеринг. ★ 40 418звёзд репо TypeScript MCP Server Expert Помогает писать MCP-серверы на TypeScript: структура проекта, инструменты, транспорты, отладка. Пригодится, когда нужен рабочий код, а не общие советы. ★ 40 418звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой