Title: πŸ” Git Secret Leak Detection Group: Security & Crypto Icon: πŸ” Order: 6 > Complete guide for detecting, removing, and preventing sensitive data leaks in Git repositories. > ПолноС руководство ΠΏΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΡŽ, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Git-рСпозиториях. --- ## πŸ“‹ Table of Contents 1. [Installation & Configuration](#installation--configuration) 2. [Scanning Tools Overview](#scanning-tools-overview) 3. [Automated Scanning](#automated-scanning) 4. [Manual Search](#manual-search) 5. [Removing Secrets from History](#removing-secrets-from-history) 6. [Revoking Compromised Secrets](#revoking-compromised-secrets) 7. [Prevention & Best Practices](#prevention--best-practices) 8. [GitHub-Specific Tools](#github-specific-tools) 9. [CI/CD Integration](#cicd-integration) 10. [Secret Managers](#secret-managers) 11. [Language-Specific Examples](#language-specific-examples) 12. [Pre-Publication Checklist](#pre-publication-checklist) 13. [Emergency Incident Runbook](#emergency-incident-runbook) 14. [Quick Reference](#quick-reference) 15. [Resources & Links](#resources--links) --- ## Installation & Configuration ### Gitleaks β€” Установка / Installation Default ports: N/A (CLI tool) Config file: `.gitleaks.toml` (project root) ```bash # macOS brew install gitleaks # Install via Homebrew / Установка Ρ‡Π΅Ρ€Π΅Π· Homebrew # Linux β€” download binary / Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ wget https://github.com/gitleaks/gitleaks/releases/download/v8.18.2/gitleaks_8.18.2_linux_x64.tar.gz tar -xzf gitleaks_8.18.2_linux_x64.tar.gz sudo mv gitleaks /usr/local/bin/ # Docker docker pull zricethezav/gitleaks:latest # Pull Docker image / Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Docker-ΠΎΠ±Ρ€Π°Π· # Windows (Scoop) scoop install gitleaks ``` ### TruffleHog β€” Установка / Installation ```bash # Go version (recommended) / Go-вСрсия (рСкомСндуСтся) brew install truffleHog # Python legacy version / Python-вСрсия (ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ) pip install truffleHog # Docker docker pull trufflesecurity/trufflehog:latest ``` ### git-secrets (AWS) β€” Установка / Installation ```bash # macOS brew install git-secrets # Linux β€” from source / Из исходников git clone https://github.com/awslabs/git-secrets.git cd git-secrets sudo make install ``` ### detect-secrets (Yelp) β€” Установка / Installation ```bash pip install detect-secrets # Install via pip / Установка Ρ‡Π΅Ρ€Π΅Π· pip ``` ### GitGuardian CLI (ggshield) β€” Установка / Installation ```bash # macOS brew install gitguardian/tap/ggshield # pip pip install ggshield ``` ### git-filter-repo β€” Установка / Installation ```bash # pip pip3 install git-filter-repo # Install via pip / Установка Ρ‡Π΅Ρ€Π΅Π· pip # macOS brew install git-filter-repo # Manual download / Ручная установка wget https://raw.githubusercontent.com/newren/git-filter-repo/main/git-filter-repo chmod +x git-filter-repo sudo mv git-filter-repo /usr/local/bin/ ``` ### BFG Repo-Cleaner β€” Установка / Installation ```bash # macOS brew install bfg # Manual (requires Java) / Ручная установка (трСбуСтся Java) wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar ``` --- ## Scanning Tools Overview ### Comparison Table β€” Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π° инструмСнтов сканирования | Tool | Language | Method | Verified Secrets | Baseline Support | Best For / Π›ΡƒΡ‡ΡˆΠ΅ всСго для | |------|----------|--------|------------------|------------------|---------------------------| | **gitleaks** | Go | Regex + entropy | βœ… | ❌ | Fast repo scanning, CI/CD integration / БыстроС сканированиС, интСграция Π² CI/CD | | **TruffleHog** | Go | Regex + entropy + API verification | βœ… (active checks) | ❌ | Finding real (verified) secrets / Поиск Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… (Π²Π΅Ρ€ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ…) сСкрСтов | | **git-secrets** | Bash | Regex (AWS-focused) | ❌ | ❌ | AWS-centric projects, pre-commit hooks / AWS-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, pre-commit Ρ…ΡƒΠΊΠΈ | | **detect-secrets** | Python | Regex + entropy + plugins | ❌ | βœ… | Incremental scanning with baselines / Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ сканированиС с baseline | | **GitGuardian** | Python | Cloud ML + regex | βœ… (cloud) | ❌ | Enterprise, commercial environments / ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ срСды | > [!TIP] > For most projects, start with **gitleaks** for speed, and run **TruffleHog** with `--only-verified` for a second pass to reduce false positives. > Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ **gitleaks** для скорости, Π° Π·Π°Ρ‚Π΅ΠΌ **TruffleHog** с `--only-verified` для сниТСния Π»ΠΎΠΆΠ½Ρ‹Ρ… срабатываний. ### History Cleaning Methods β€” Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² очистки истории | Method | Speed | Complexity | Safety | Recommendation / РСкомСндация | |--------|-------|------------|--------|------------------------------| | **git-filter-repo** | ⚑ Fast | Medium | βœ… Safe | βœ… Recommended / РСкомСндуСтся | | **BFG Repo-Cleaner** | ⚑ Fast | Low | βœ… Safe | Good for simple cases / Π₯ΠΎΡ€ΠΎΡˆ для простых случаСв | | **git filter-branch** | 🐒 Slow | High | ⚠️ Risky | ❌ Legacy, avoid / Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ, ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ | --- ## Automated Scanning ### Gitleaks β€” Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ / Scanning ```bash gitleaks detect --source . --verbose # Basic scan / Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ сканированиС gitleaks detect --source . --report-path gitleaks-report.json # JSON report / ΠžΡ‚Ρ‡Ρ‘Ρ‚ Π² JSON gitleaks detect --source . --report-format sarif --report-path gitleaks.sarif # SARIF report (for GitHub) / ΠžΡ‚Ρ‡Ρ‘Ρ‚ Π² SARIF (для GitHub) gitleaks detect --source . --log-opts="origin/main" # Scan specific branch / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ gitleaks detect --source . --config .gitleaks.toml # Custom config / ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ gitleaks detect --source . --no-git # Scan without Git history / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π· Git-истории gitleaks detect --source . --log-opts="-- . ':!*.test.js'" # Ignore specific files / Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ gitleaks protect --staged --verbose # Pre-commit mode (scan staged) / Π Π΅ΠΆΠΈΠΌ pre-commit (ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ staged) ``` #### Gitleaks Configuration / ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Gitleaks `.gitleaks.toml` ```toml title = "gitleaks config" [extend] useDefault = true [allowlist] description = "Allowlist" paths = [ '''\.example$''', '''\.sample$''', '''test/''', '''docs/''' ] regexes = [ '''(fake|example|test|dummy)''', ] [[rules]] id = "custom-api-key" description = "Custom API Key" regex = '''(?i)api[_-]?key[_-]?([a-z0-9]{32,})''' entropy = 3.5 ``` --- ### TruffleHog β€” Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ / Scanning ```bash trufflehog git file://. --since-commit HEAD~100 --only-verified # Scan recent commits (verified only) / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ послСдних ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² trufflehog git file://. --json > trufflehog-report.json # Full history scan with JSON report / ПолноС сканированиС с ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠΌ trufflehog git https://github.com// # Scan remote repo / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ рСпозитория trufflehog git file://. --regex --rules custom-rules.json # Custom regex rules / ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ regex-ΠΏΡ€Π°Π²ΠΈΠ»Π° trufflehog filesystem /path/to/directory # Scan filesystem (non-Git) / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы (Π½Π΅ Git) trufflehog github --org= --token= # Scan GitHub organization / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GitHub-ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ``` --- ### git-secrets (AWS) β€” ИспользованиС / Usage ```bash git secrets --install # Install hooks into repo / Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ…ΡƒΠΊΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ # Install globally for all new repos / Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ глобально для всСх Π½ΠΎΠ²Ρ‹Ρ… Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² git secrets --install ~/.git-templates/git-secrets git config --global init.templateDir ~/.git-templates/git-secrets git secrets --register-aws # Register AWS patterns / Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ AWS-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ git secrets --add 'password\s*=\s*.+' # Add custom pattern / Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ git secrets --add --allowed 'password\s*=\s*"example"' # Add allowed exception / Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ git secrets --scan-history # Scan full history / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ git secrets --scan # Scan last commit / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ послСдний ΠΊΠΎΠΌΠΌΠΈΡ‚ git secrets --list # List registered patterns / Бписок зарСгистрированных ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² ``` --- ### detect-secrets (Yelp) β€” ИспользованиС / Usage ```bash detect-secrets scan > .secrets.baseline # Create baseline / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ baseline detect-secrets scan --baseline .secrets.baseline # Scan against baseline / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ baseline detect-secrets audit .secrets.baseline # Interactive audit / Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π°ΡƒΠ΄ΠΈΡ‚ detect-secrets scan file1.py file2.js # Scan specific files / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ detect-secrets scan --baseline .secrets.baseline --update # Update baseline / ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ baseline detect-secrets scan --exclude-files '\.example$' --exclude-files 'test/.*' # Exclude patterns / Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ ``` --- ### GitGuardian CLI (ggshield) β€” ИспользованиС / Usage ```bash ggshield auth login # Authenticate / Авторизация ggshield secret scan repo . # Scan repository / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСпозитория ggshield secret scan pre-commit # Pre-commit scan / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ pre-commit ggshield secret scan ci # CI scan / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ CI ggshield secret scan docker nginx:latest # Scan Docker image / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Docker-ΠΎΠ±Ρ€Π°Π·Π° ``` --- ## Manual Search ### Basic Git Commands β€” Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Git-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ #### Search by Content / Поиск ΠΏΠΎ содСрТимому ```bash git log -p --all -S "" # Search for string in history / Поиск строки Π²ΠΎ всСй истории git log -p --all -G "password\s*=\s*['\"].*['\"]" # Search with regex / Поиск с regex git log -p --all -S "" | grep -B 3 -A 3 "" # Search with context (Β±3 lines) / Поиск с контСкстом (Β±3 строки) git log --all --grep="password" # Search in commit messages / Поиск Π² сообщСниях ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ``` #### Search in Specific Files / Поиск Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… ```bash git log --all --full-history -p -- path/to/file.conf # File history / Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° git log --all --full-history -- "*.env" "*.conf" # All versions of file types / ВсС вСрсии Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ git show :path/to/file # Show file at specific commit / ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅ git log --diff-filter=D --summary | grep delete # Find when a file was deleted / Найти ΠΊΠΎΠ³Π΄Π° Ρ„Π°ΠΉΠ» Π±Ρ‹Π» ΡƒΠ΄Π°Π»Ρ‘Π½ ``` #### Search Deleted Files / Поиск ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ```bash git log --diff-filter=D --summary | grep delete | awk '{print $4}' # List all deleted files / Бписок всСх ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² git checkout ^ -- path/to/deleted/file # Restore deleted file for review / Π’ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» для просмотра ``` --- ### Pattern Search β€” Поиск ΠΏΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°ΠΌ #### Private Keys / ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ```bash git log -p --all | grep -i "BEGIN.*PRIVATE" -B 5 -A 10 # Any private key / Π›ΡŽΠ±ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ git log -p --all | grep -i "BEGIN RSA PRIVATE KEY" # RSA key / RSA-ΠΊΠ»ΡŽΡ‡ git log -p --all | grep -i "BEGIN OPENSSH PRIVATE KEY" # OpenSSH key / OpenSSH-ΠΊΠ»ΡŽΡ‡ ``` #### Passwords & Tokens / ΠŸΠ°Ρ€ΠΎΠ»ΠΈ ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ```bash git log -p --all | grep -Ei "(password|passwd|pwd)\s*[:=]" -B 2 -A 2 # Passwords / ΠŸΠ°Ρ€ΠΎΠ»ΠΈ git log -p --all | grep -Ei "(api[_-]?key|token|secret)\s*[:=]" -B 2 -A 2 # API keys & tokens / API-ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ git log -p --all | grep -Ei "authorization\s*:\s*bearer" -i # Bearer tokens / Bearer-Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ``` #### Credentials in URLs / Π Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹ доступа Π² URL ```bash git log -p --all | grep -E "https?://[^:]+:[^@]+@" -B 2 -A 2 # URL with embedded credentials / URL со встроСнными Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°ΠΌΠΈ ``` #### Email Addresses / Email-адрСса ```bash git log -p --all | grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" # Find email addresses / Поиск email-адрСсов ``` #### IP Addresses / IP-адрСса ```bash git log -p --all | grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" # Find IP addresses / Поиск IP-адрСсов ``` #### AWS Keys / AWS-ΠΊΠ»ΡŽΡ‡ΠΈ ```bash git log -p --all | grep -E "AKIA[0-9A-Z]{16}" # AWS Access Key ID / ID ΠΊΠ»ΡŽΡ‡Π° доступа AWS git log -p --all | grep -E "aws_secret_access_key" # AWS Secret Key reference / Бсылка Π½Π° сСкрСтный ΠΊΠ»ΡŽΡ‡ AWS ``` #### JWT Tokens / JWT-Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ```bash git log -p --all | grep -E "eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*" # JWT pattern / JWT-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ``` --- ### Search by File Type / Поиск ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ Ρ„Π°ΠΉΠ»Π° ```bash # Config files / ΠšΠΎΠ½Ρ„ΠΈΠ³-Ρ„Π°ΠΉΠ»Ρ‹ git log -p --all -- "*.conf" "*.config" "*.ini" "*.yaml" "*.yml" "*.toml" # Environment files / Π€Π°ΠΉΠ»Ρ‹ окруТСния git log -p --all -- "*.env" "*.env.*" ".envrc" # Credential files / Π€Π°ΠΉΠ»Ρ‹ с Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°ΠΌΠΈ git log -p --all -- "*credentials*" "*secret*" "*password*" # SSH keys / SSH-ΠΊΠ»ΡŽΡ‡ΠΈ git log -p --all -- "*.pem" "*.key" "*id_rsa*" "*id_ed25519*" # Certificate files / Π€Π°ΠΉΠ»Ρ‹ сСртификатов git log -p --all -- "*.p12" "*.pfx" "*.jks" "*.keystore" # Backup files (often contain secrets) / Π Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ (часто содСрТат сСкрСты) git log -p --all -- "*.bak" "*.backup" "*.old" "*~" ``` --- ### Advanced Search / Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ поиск #### By Author and Date / По Π°Π²Ρ‚ΠΎΡ€Ρƒ ΠΈ Π΄Π°Ρ‚Π΅ ```bash git log -p --all --author="" | grep -i "password" # Commits by author / ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΡ€Π° git log -p --all --since="2024-01-01" --until="2024-12-31" | grep -i "secret" # Commits by date range / ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π·Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ git log --all --shortstat | grep -B 1 "100[0-9]\+ insertion" # Large commits (potential dumps) / Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ (ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°ΠΌΠΏΡ‹) ``` #### Stash and Reflog / Stash ΠΈ Reflog ```bash git stash list # List stashes / Бписок сохранённых stash git stash show -p stash@{0} | grep -i "password" # Search in stash / Поиск Π² stash git reflog show --all | grep -i "sensitive" # Search in reflog / Поиск Π² reflog git show HEAD@{5}:path/to/file # Show file from reflog entry / ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈΠ· reflog ``` --- ## Removing Secrets from History > [!CAUTION] > **All methods below rewrite Git history.** After cleaning, you MUST `force push` and all collaborators MUST re-clone or `git reset --hard`. Coordinate with your team before proceeding! > **ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½ΠΈΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Git.** ПослС очистки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ `force push`, ΠΈ всС участники Π”ΠžΠ›Π–ΠΠ« Π·Π°Π½ΠΎΠ²ΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ `git reset --hard`. БогласуйтС с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ! ### Method 1: git-filter-repo (Recommended) / git-filter-repo (РСкомСндуСтся) #### Remove Files / Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ```bash git filter-repo --path path/to/secret.conf --invert-paths # Remove single file / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» git filter-repo --path secret1.conf --path secret2.key --invert-paths # Remove multiple files / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² git filter-repo --path-glob '*.env' --invert-paths # Remove by pattern / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρƒ git filter-repo --path secrets/ --invert-paths # Remove entire directory / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ``` #### Replace Content / Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТимоС Π² Ρ„Π°ΠΉΠ»Π°Ρ… ```bash # Create expressions file / Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» с Π·Π°ΠΌΠ΅Π½Π°ΠΌΠΈ (expressions.txt) # Format: literal:old_text==>new_text or regex:pattern==>replacement ``` `expressions.txt` ```text literal:==>REDACTED regex:api[_-]?key\s*=\s*['"]([^'"]+)['"]==>api_key="REDACTED" literal:smtp.gmail.com==>smtp.example.com ``` ```bash git filter-repo --replace-text expressions.txt # Apply replacements / ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½Ρ‹ ``` #### Remove Large Files / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ большиС Ρ„Π°ΠΉΠ»Ρ‹ ```bash git filter-repo --strip-blobs-bigger-than 10M # Remove files > 10MB / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ большС 10MB ``` #### Fix Author Info / Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°Π²Ρ‚ΠΎΡ€Π΅ `mailmap.txt` ```text Correct Name Correct Name Old Name ``` ```bash git filter-repo --mailmap mailmap.txt # Apply mailmap / ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ mailmap ``` #### Combined Operations / ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ```bash git filter-repo \ --path secrets/ --invert-paths \ --path '*.env' --invert-paths \ --replace-text expressions.txt \ --strip-blobs-bigger-than 10M ``` --- ### Method 2: BFG Repo-Cleaner / BFG Repo-Cleaner #### Remove Files / Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ```bash bfg --delete-files secret.conf # Single file / Один Ρ„Π°ΠΉΠ» bfg --delete-files "{secret.conf,password.txt,api_key.json}" # Multiple files / НСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² bfg --delete-files "*.env" # By pattern / По ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρƒ bfg --delete-folders secrets # Delete folders / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΠΈ bfg --delete-folders "{logs,temp,cache}" # Multiple folders / НСсколько ΠΏΠ°ΠΏΠΎΠΊ ``` #### Replace Strings / Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ строки ```bash # Create file with secrets (one per line) / Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» с сСкрСтами (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° строку) echo "" > passwords.txt echo "" >> passwords.txt echo "" >> passwords.txt bfg --replace-text passwords.txt # Replace with ***REMOVED*** / Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° ***REMOVED*** ``` #### Remove Large Files / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ большиС Ρ„Π°ΠΉΠ»Ρ‹ ```bash bfg --strip-blobs-bigger-than 10M # Remove files > 10MB / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ большС 10MB ``` > [!IMPORTANT] > After BFG, always run cleanup / ПослС BFG всСгда выполняйтС очистку: > ```bash > git reflog expire --expire=now --all > git gc --prune=now --aggressive > ``` --- ### Method 3: git filter-branch (Legacy β€” Not Recommended) / git filter-branch (Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ β€” Π½Π΅ рСкомСндуСтся) > [!WARNING] > `git filter-branch` is slow, error-prone, and officially deprecated. Use `git-filter-repo` instead. > `git filter-branch` ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ, ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ ошибкам ΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ устарСл. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `git-filter-repo`. #### Remove File / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ```bash git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch path/to/secret.conf' \ --prune-empty --tag-name-filter cat -- --all ``` #### Remove Directory / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ ```bash git filter-branch --force --index-filter \ 'git rm -r --cached --ignore-unmatch secrets/' \ --prune-empty --tag-name-filter cat -- --all ``` #### Replace Content / Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТимоС ```bash git filter-branch --tree-filter \ 'find . -name "*.conf" -exec sed -i "s//REDACTED/g" {} \;' \ --prune-empty --tag-name-filter cat -- --all ``` #### Cleanup after filter-branch / ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° послС filter-branch ```bash rm -rf .git/refs/original/ git reflog expire --expire=now --all git gc --prune=now --aggressive ``` --- ### Post-Cleanup Finalization / Ѐинализация послС очистки > [!CAUTION] > `--force` push will overwrite remote history. Ensure all collaborators are notified! > `--force` push ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ всС участники ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½Ρ‹! ```bash # 1. Verify result / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ gitleaks detect --source . --verbose git log --all --oneline | head -20 # 2. Force push (CAREFUL!) / Force push (ΠžΠ‘Π’ΠžΠ ΠžΠ–ΠΠž!) git push origin --force --all git push origin --force --tags # 3. Collaborators must re-clone / Участники Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ: rm -rf local-repo git clone https://github.com//.git # Or reset / Или ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ: cd local-repo git fetch origin git reset --hard origin/main git clean -fdx ``` --- ## Revoking Compromised Secrets > [!WARNING] > Removing secrets from Git history is NOT enough. Always revoke and rotate the compromised credentials immediately. > Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ сСкрСтов ΠΈΠ· истории Git ΠΠ•Π”ΠžΠ‘Π’ΠΠ’ΠžΠ§ΠΠž. ВсСгда ΠΎΡ‚Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΈ Ρ€ΠΎΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ скомпромСтированныС Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ### AWS Keys / AWS-ΠΊΠ»ΡŽΡ‡ΠΈ ```bash aws iam list-access-keys # List keys / Бписок ΠΊΠ»ΡŽΡ‡Π΅ΠΉ aws iam update-access-key --access-key-id --status Inactive # Deactivate / Π”Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ aws iam delete-access-key --access-key-id # Delete key / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ aws iam create-access-key # Create new / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ # Key rotation (best practice) / Ротация ΠΊΠ»ΡŽΡ‡Π΅ΠΉ (best practice) aws iam create-access-key --user-name # Update applications with the new key / ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ прилоТСния с Π½ΠΎΠ²Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ aws iam update-access-key --access-key-id --status Inactive # Test / ВСстируйтС aws iam delete-access-key --access-key-id ``` ### GitHub Personal Access Token / GitHub Personal Access Token ```bash # Web UI: # Settings β†’ Developer settings β†’ Personal access tokens β†’ Revoke # Or via API / Или Ρ‡Π΅Ρ€Π΅Π· API: curl -X DELETE \ -H "Authorization: token " \ https://api.github.com/applications//token # Create new / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ: # Settings β†’ Developer settings β†’ Personal access tokens β†’ Generate new token ``` ### Telegram Bot Token / Π’ΠΎΠΊΠ΅Π½ Π±ΠΎΡ‚Π° Telegram ```bash # @BotFather /mybots # Select bot / Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π±ΠΎΡ‚Π° # API Token β†’ Revoke current token # Generate new / Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ``` ### Google Cloud / OAuth ```bash # Web UI: # Google Cloud Console β†’ APIs & Services β†’ Credentials # Find compromised credential β†’ Delete / НайдитС скомпромСтированный credential β†’ Π£Π΄Π°Π»ΠΈΡ‚Π΅ # gcloud CLI gcloud auth revoke # Revoke auth / ΠžΡ‚ΠΎΠ·Π²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ gcloud iam service-accounts keys delete \ --iam-account=@.iam.gserviceaccount.com # Delete key / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ gcloud iam service-accounts keys create key.json \ --iam-account=@.iam.gserviceaccount.com # Create new key / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ``` ### SSH Keys / SSH-ΠΊΠ»ΡŽΡ‡ΠΈ ```bash # GitHub: Settings β†’ SSH and GPG keys β†’ Delete ssh-keygen -R # Remove from known_hosts / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· known_hosts vim ~/.ssh/authorized_keys # Remove public key / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ssh-keygen -t ed25519 -C "" # Generate new key pair / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ``` ### Database Passwords / ΠŸΠ°Ρ€ΠΎΠ»ΠΈ Π‘Π” ```sql -- MySQL/MariaDB ALTER USER ''@'' IDENTIFIED BY ''; FLUSH PRIVILEGES; -- PostgreSQL ALTER USER WITH PASSWORD ''; -- MongoDB db.updateUser("", {pwd: ""}) ``` ### Docker Registry Tokens / Π’ΠΎΠΊΠ΅Π½Ρ‹ Docker Registry ```bash # Docker Hub: Account Settings β†’ Security β†’ Access Tokens β†’ Revoke # Harbor / Private registry: # Delete robot account and recreate / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ robot account ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ ``` ### NPM Token / NPM-Ρ‚ΠΎΠΊΠ΅Π½ ```bash npm token revoke # Revoke / ΠžΡ‚ΠΎΠ·Π²Π°Ρ‚ΡŒ npm token create --read-only # Create new (read-only) / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅) npm token create --publish # Create new (publish) / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ (publish) ``` --- ## Prevention & Best Practices ### Pre-commit Hooks / Pre-commit Ρ…ΡƒΠΊΠΈ #### Using pre-commit Framework / ИспользованиС pre-commit framework ```bash pip install pre-commit # Install / Установка ``` `.pre-commit-config.yaml` ```yaml repos: - repo: https://github.com/gitleaks/gitleaks rev: v8.18.2 hooks: - id: gitleaks - repo: https://github.com/Yelp/detect-secrets rev: v1.4.0 hooks: - id: detect-secrets args: ['--baseline', '.secrets.baseline'] - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 hooks: - id: detect-private-key - id: check-added-large-files args: ['--maxkb=1000'] - id: check-merge-conflict - id: trailing-whitespace ``` ```bash pre-commit install # Install hooks / Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ…ΡƒΠΊΠΈ pre-commit run --all-files # Run manually / Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ``` #### Custom Bash Pre-commit Hook / ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ bash pre-commit Ρ…ΡƒΠΊ `.git/hooks/pre-commit` ```bash #!/bin/bash # Check for gitleaks / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° gitleaks if command -v gitleaks &> /dev/null; then gitleaks protect --staged --verbose if [ $? -ne 0 ]; then echo "❌ Gitleaks found secrets! Commit rejected." exit 1 fi fi # Check for large files / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° большиС Ρ„Π°ΠΉΠ»Ρ‹ MAX_SIZE=1048576 # 1MB in bytes / 1MB Π² Π±Π°ΠΉΡ‚Π°Ρ… for file in $(git diff --cached --name-only); do if [ -f "$file" ]; then size=$(wc -c < "$file") if [ $size -gt $MAX_SIZE ]; then echo "❌ File $file is too large: $size bytes" exit 1 fi fi done # Check for private keys / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ if git diff --cached | grep -E "BEGIN.*PRIVATE KEY"; then echo "❌ Private key detected in commit!" exit 1 fi echo "βœ… Pre-commit checks passed" exit 0 ``` ```bash chmod +x .git/hooks/pre-commit # Make executable / Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ исполняСмым ``` --- ### .gitignore β€” Recommended Template / Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ шаблон `.gitignore` ```gitignore # Secrets and credentials / Π‘Π΅ΠΊΡ€Π΅Ρ‚Ρ‹ ΠΈ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹ .env .env.* !.env.example *.pem *.key *.p12 *.pfx *.jks *.keystore id_rsa* id_ed25519* id_ecdsa* # Configs with secrets / ΠšΠΎΠ½Ρ„ΠΈΠ³ΠΈ с сСкрСтами *secret* *password* *credential* config/secrets.yml config/database.yml !config/database.yml.example # Cloud provider configs / ΠšΠΎΠ½Ρ„ΠΈΠ³ΠΈ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² .aws/ .azure/ .gcloud/ credentials.json service-account.json # Logs (may contain secrets) / Π›ΠΎΠ³ΠΈ (ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ сСкрСты) *.log logs/ *.log.* # Backups / Π Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ *.bak *.backup *.old *~ *.swp *.swo # Directories / Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ secrets/ private/ .secrets/ tmp/ temp/ # IDE .vscode/ .idea/ *.iml # OS .DS_Store Thumbs.db ``` --- ### Git Attributes for Sensitive Files / Git Attributes для Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² `.gitattributes` ```gitattributes # Never show diff for these files / Никогда Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ diff для этих Ρ„Π°ΠΉΠ»ΠΎΠ² *.pem diff=secret *.key diff=secret *secret* diff=secret .env* diff=secret ``` `~/.gitconfig` or `.git/config` ```ini [diff "secret"] textconv = echo "REDACTED" ``` --- ### Environment-Based Configuration / ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния #### Using dotenv / ИспользованиС dotenv `.env` (add to `.gitignore`) ```bash DATABASE_PASSWORD= API_KEY= ``` `.env.example` (safe to commit / бСзопасно ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ΡŒ) ```bash DATABASE_PASSWORD=your_password_here API_KEY=your_api_key_here ``` #### Docker Secrets / Docker-сСкрСты `docker-compose.yml` ```yaml version: '3.8' services: app: image: myapp secrets: - db_password secrets: db_password: file: ./secrets/db_password.txt ``` #### Kubernetes Secrets / Kubernetes-сСкрСты ```yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: password: # base64 encoded / Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ base64 ``` ```bash kubectl create secret generic mysecret --from-literal=password= # Create secret / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ сСкрСт ``` --- ## GitHub-Specific Tools ### GitHub Secret Scanning / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСкрСтов GitHub Automatically active for public repositories / АвтоматичСски Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ для ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π². **For private repos (requires GitHub Advanced Security) / Для ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… (Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ GitHub Advanced Security):** ```text Repository β†’ Settings β†’ Code security and analysis β†’ Enable Secret scanning β†’ Enable Push protection ``` ### GitHub Advanced Security API / GitHub Advanced Security API ```bash curl -X PUT \ -H "Authorization: token " \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos///vulnerability-alerts # Enable vulnerability alerts / Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ оповСщСния ΠΎΠ± уязвимостях ``` --- ## CI/CD Integration ### GitHub Actions Secret Scanning Workflow / GitHub Actions для сканирования сСкрСтов `.github/workflows/secret-scan.yml` ```yaml name: Secret Scanning on: push: branches: [ main, develop ] pull_request: branches: [ main ] jobs: gitleaks: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Run Gitleaks uses: gitleaks/gitleaks-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} trufflehog: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: TruffleHog OSS uses: trufflesecurity/trufflehog@main with: path: ./ base: main head: HEAD detect-secrets: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install detect-secrets run: pip install detect-secrets - name: Run detect-secrets run: | detect-secrets scan --baseline .secrets.baseline detect-secrets audit .secrets.baseline ``` --- ## Secret Managers ### HashiCorp Vault Default port: `8200` ```bash brew install vault # Install / Установка vault server -dev # Start dev server / Запуск dev-сСрвСра vault kv put secret/myapp password= # Store secret / Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ сСкрСт vault kv get secret/myapp # Retrieve secret / ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сСкрСт ``` ### AWS Secrets Manager ```bash # Create secret / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ сСкрСт aws secretsmanager create-secret \ --name MySecret \ --secret-string '{"username":"","password":""}' # Retrieve secret / ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сСкрСт aws secretsmanager get-secret-value --secret-id MySecret ``` ### SOPS (Secrets OPerationS) ```bash brew install sops # Install / Установка sops secrets.yaml # Create/edit encrypted file / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ/Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» sops -d secrets.yaml # Decrypt / Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ``` --- ## Language-Specific Examples ### Python (Django/Flask) ```python # settings.py import os from dotenv import load_dotenv load_dotenv() SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') DATABASE_PASSWORD = os.getenv('DB_PASSWORD') # NEVER / ΠΠ˜ΠšΠžΠ“Π”Π: # SECRET_KEY = 'django-insecure-hardcoded-key-123' ``` ### Node.js ```javascript // config.js require('dotenv').config(); module.exports = { apiKey: process.env.API_KEY, dbPassword: process.env.DB_PASSWORD }; // NEVER / ΠΠ˜ΠšΠžΠ“Π”Π: // const API_KEY = 'hardcoded-api-key-123'; ``` ### Go ```go package main import ( "os" "github.com/joho/godotenv" ) func main() { godotenv.Load() apiKey := os.Getenv("API_KEY") // NEVER / ΠΠ˜ΠšΠžΠ“Π”Π: // apiKey := "hardcoded-api-key-123" } ``` ### Ruby (Rails) ```ruby # config/database.yml production: password: <%= ENV['DATABASE_PASSWORD'] %> # NEVER / ΠΠ˜ΠšΠžΠ“Π”Π: # password: hardcoded_password_123 ``` ### PHP ```php load(); $apiKey = $_ENV['API_KEY']; // NEVER / ΠΠ˜ΠšΠžΠ“Π”Π: // $apiKey = 'hardcoded-api-key-123'; ?> ``` --- ## Pre-Publication Checklist ### Minimal Checklist / ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ чСклист ```bash # 1. Scan / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ gitleaks detect --source . --verbose trufflehog git file://. --only-verified # 2. Manual check critical files / Ручная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² git log -p --all -- "*.env" "*.conf" "*.yaml" git log -p --all -- "*secret*" "*password*" "*credential*" # 3. Verify .gitignore / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ .gitignore cat .gitignore | grep -E "(env|secret|password|key|credential)" # 4. Remove temporary files and logs / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π»ΠΎΠ³ΠΈ git clean -fdx rm -rf logs/ *.log tmp/ temp/ # 5. Create example files / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ example-Ρ„Π°ΠΉΠ»Ρ‹ cp .env .env.example # Replace real values with placeholders / Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ значСния Π½Π° плСйсхолдСры # 6. Commit changes / ΠšΠΎΠΌΠΌΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ git add .gitignore *.example git commit -m "Prepare for public release" # 7. Final scan / ЀинальноС сканированиС gitleaks detect --source . --verbose ``` ### Extended Checklist / Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ чСклист - [ ] Run `gitleaks detect` / Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ `gitleaks detect` - [ ] Run `trufflehog` / Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ `trufflehog` - [ ] Check all `*.env`, `*.conf`, `*.yaml` files / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ всС `*.env`, `*.conf`, `*.yaml` - [ ] Check logs and temp files / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ - [ ] Verify `.gitignore` is up-to-date / Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ `.gitignore` Π°ΠΊΡ‚ΡƒΠ°Π»Π΅Π½ - [ ] Create `.env.example`, `config.example`, etc. / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ `.env.example`, `config.example` ΠΈ Ρ‚.Π΄. - [ ] Remove all `*.log`, `*.bak`, `*.old` files / Π£Π΄Π°Π»ΠΈΡ‚ΡŒ всС `*.log`, `*.bak`, `*.old` Ρ„Π°ΠΉΠ»Ρ‹ - [ ] Check code comments for TODO with secrets / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π° TODO с сСкрСтами - [ ] Check `docker-compose.yml` for hardcoded values / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ `docker-compose.yml` Π½Π° hardcoded значСния - [ ] Check `README` for real data examples / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ `README` Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ - [ ] Check CI/CD configs (`.github`, `.gitlab-ci.yml`) / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ CI/CD ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ - [ ] Install pre-commit hooks / Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ pre-commit Ρ…ΡƒΠΊΠΈ - [ ] Add secret files to `.gitignore` / Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сСкрСтныС Ρ„Π°ΠΉΠ»Ρ‹ Π² `.gitignore` - [ ] Add `.gitattributes` for diff filtering / Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ `.gitattributes` для diff-Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ - [ ] Verify all secrets are in env variables / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ всС сСкрСты Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния - [ ] Update documentation with secret instructions / ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ с инструкциями ΠΏΠΎ сСкрСтам - [ ] Enable GitHub Secret Scanning (if available) / ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ GitHub Secret Scanning (Ссли доступно) - [ ] Create GitHub Actions for auto scanning / Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ GitHub Actions для автосканирования - [ ] Check all branches and tags / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ всС branches ΠΈ tags - [ ] Verify `node_modules/`, `vendor/` are in `.gitignore` / Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ `node_modules/`, `vendor/` Π² `.gitignore` - [ ] Final scan with all tools / ЀинальноС сканированиС всСми инструмСнтами --- ## Emergency Incident Runbook ### Production Runbook: Secret Leak Response / ЭкстрСнный ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΡ€ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ сСкрСтов > [!CAUTION] > If secrets have been pushed to a **public** repository, they are already compromised. Bots continuously scan GitHub for leaked credentials. Revoke and rotate ALL exposed secrets immediately β€” do NOT rely solely on history cleanup. > Если сСкрСты Π±Ρ‹Π»ΠΈ Π·Π°ΠΏΡƒΡˆΠ΅Π½Ρ‹ Π² **ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ** Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ скомпромСтированы. Π‘ΠΎΡ‚Ρ‹ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‚ GitHub Π½Π° ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ. ΠžΡ‚Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΈ Ρ€ΠΎΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π’Π‘Π• раскрытыС сСкрСты Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ β€” НЕ ΠΏΠΎΠ»Π°Π³Π°ΠΉΡ‚Π΅ΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° очистку истории. 1. **Immediately (0-1 min)** β€” Make the repository private / НСмСдлСнно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ```text GitHub: Repository β†’ Settings β†’ Danger Zone β†’ Change visibility β†’ Private ``` 2. **Within 5 minutes** β€” Revoke ALL compromised secrets / ΠžΡ‚ΠΎΠ·Π²Π°Ρ‚ΡŒ Π’Π‘Π• скомпромСтированныС сСкрСты ```bash # AWS aws iam update-access-key --access-key-id --status Inactive # GitHub Token # Settings β†’ Developer settings β†’ Tokens β†’ Revoke # Database β€” change passwords immediately / Π‘ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ``` 3. **Within 15 minutes** β€” Clean Git history / ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Git ```bash git filter-repo --path --invert-paths git push --force --all ``` 4. **Within 1 hour** β€” Full audit / ΠŸΠΎΠ»Π½Ρ‹ΠΉ Π°ΡƒΠ΄ΠΈΡ‚ ```bash # Check access logs / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈ доступа # Check for unusual activity / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ # Notify the team / Π£Π²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ``` 5. **Within 1 day** β€” Post-mortem / ΠŸΠΎΡΡ‚ΠΌΠΎΡ€Ρ‚Π΅ΠΌ - Document the incident / Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ - Update procedures / ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ - Set up automation to prevent recurrence / ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ для прСдотвращСния --- ## Quick Reference ### Scan (pick one) / Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ΄ΠΈΠ½) ```bash gitleaks detect --source . --verbose # Fastest / Π‘Π°ΠΌΡ‹ΠΉ быстрый # or / ΠΈΠ»ΠΈ trufflehog git file://. --only-verified # Most accurate / Π‘Π°ΠΌΡ‹ΠΉ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ # or / ΠΈΠ»ΠΈ detect-secrets scan # Baseline support / ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° baseline ``` ### Clean History (pick one) / ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° истории (Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ΄ΠΈΠ½) ```bash # Modern (recommended) / Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ (рСкомСндуСтся) git filter-repo --path secret.conf --invert-paths # Simple / ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ bfg --delete-files secret.conf git reflog expire --expire=now --all && git gc --prune=now --aggressive # Legacy (not recommended) / Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ (Π½Π΅ рСкомСндуСтся) git filter-branch --index-filter 'git rm --cached --ignore-unmatch secret.conf' --prune-empty -- --all ``` ### After Cleanup / ПослС очистки ```bash gitleaks detect --source . --verbose # Verify / ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° # Force push (CAREFUL!) / Force push (ΠžΠ‘Π’ΠžΠ ΠžΠ–ΠΠž!) git push origin --force --all git push origin --force --tags ``` ### Prevention / ΠŸΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ```bash pip install pre-commit # Install pre-commit / Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ pre-commit pre-commit install # Activate hooks / ΠΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ…ΡƒΠΊΠΈ # Add to .gitignore / Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² .gitignore echo ".env" >> .gitignore echo "*.log" >> .gitignore echo "*secret*" >> .gitignore ``` --- ## Sysadmin Operations ### Log Locations / РасполоТСниС Π»ΠΎΠ³ΠΎΠ² | Tool | Log Location / РасполоТСниС Π»ΠΎΠ³Π° | |------|----------------------------------| | gitleaks | stdout / report file (`--report-path`) | | TruffleHog | stdout / JSON (`--json`) | | git-secrets | stdout | | detect-secrets | `.secrets.baseline` | | pre-commit | stdout | | GitHub Actions | GitHub UI β†’ Actions tab | | Vault | `/var/log/vault/vault_audit.log` (when configured) | ### Logrotate Configuration / ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Logrotate `/etc/logrotate.d/vault` ```text /var/log/vault/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 vault vault sharedscripts postrotate systemctl reload vault 2>/dev/null || true endscript } ``` > [!NOTE] > Most secret scanning tools (gitleaks, TruffleHog, detect-secrets) are CLI tools that write to stdout or report files. They don't typically require logrotate. Configure logrotate only for long-running services like HashiCorp Vault. > Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ инструмСнтов сканирования (gitleaks, TruffleHog, detect-secrets) β€” CLI ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, ΠΏΠΈΡˆΡƒΡ‰ΠΈΠ΅ Π² stdout ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠ². Logrotate ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π½ΡƒΠΆΠ΅Π½. НастраивайтС logrotate Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΡ… сСрвисов Π²Ρ€ΠΎΠ΄Π΅ HashiCorp Vault. --- ## Resources & Links ### Tools / Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ - [gitleaks](https://github.com/gitleaks/gitleaks) - [TruffleHog](https://github.com/trufflesecurity/trufflehog) - [git-secrets](https://github.com/awslabs/git-secrets) - [detect-secrets](https://github.com/Yelp/detect-secrets) - [git-filter-repo](https://github.com/newren/git-filter-repo) - [BFG Repo-Cleaner](https://rtyley.github.io/bfg-repo-cleaner/) ### Documentation / ДокумСнтация - [GitHub Secret Scanning](https://docs.github.com/en/code-security/secret-scanning) - [GitLab Secret Detection](https://docs.gitlab.com/ee/user/application_security/secret_detection/) - [Pre-commit framework](https://pre-commit.com/) ### Secret Pattern Lists / Бписки сСкрСтных ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² - [GitGuardian Secret Patterns](https://github.com/GitGuardian/ggshield/tree/main/ggshield/core/scan/secret/secret_patterns) - [Gitleaks Rules](https://github.com/gitleaks/gitleaks/blob/master/config/gitleaks.toml) - [Common Regex Patterns](https://github.com/dxa4481/truffleHogRegexes/blob/master/truffleHogRegexes/regexes.json) --- **Last Updated / ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅:** February 2026 **Version / ВСрсия:** 2.0 > [!WARNING] > **Always treat a secret leak as a serious security incident.** Even after removing from Git history, secrets may have been indexed by search engines or cloned by attackers. **ALWAYS** revoke and recreate compromised secrets. > **ВсСгда считайтС ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ сСкрСтов ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹ΠΌ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠΌ бСзопасности.** Π”Π°ΠΆΠ΅ послС удалСния ΠΈΠ· истории Git, сСкрСты ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ проиндСксированы поисковиками ΠΈΠ»ΠΈ склонированы Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌΠΈ. **ВБЕГДА** ΠΎΡ‚Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΈ пСрСсоздавайтС скомпромСтированныС сСкрСты.