
스캔. 삭제. 깨끗한 커밋.
비밀을 찾아라. 고쳐라. 깨끗하게 커밋하라.
비밀 스캐너는 경보를 울리는 데는 능하지만, 문제를 해결하는 데는 별 도움이 되지 않습니다. 유출된 자격 증명 목록을 건네주고 정리는 당신에게 맡깁니다. Credactor는 이 순환을 완성합니다. 하드코딩된 비밀을 찾아 그 자리에서 다시 작성하여, 유출이 탐지에서 수정까지 단 하나의 명령으로 이루어집니다.
자격 증명을 소스 코드 밖에 두는 것은 선택이 아닌 기본 보안 관행입니다. Credactor는 커밋 전 로컬 머신에서든, 병합 전 CI에서든 이 기본을 저렴하게 유지할 수 있게 해줍니다. 단독으로 실행하거나, 이미 신뢰하는 스캐너와 함께 실행하세요.
# Credactor finds this:
db_password = "h8Tq2vKp9mRz4Wd"
# By default it rewrites the secret as a sentinel that fails loudly at runtime:
db_password = "REDACTED_BY_CREDACTOR"
# With --replace-with env, it writes a reference that reads from the environment:
db_password = os.environ["DB_PASSWORD"]
삭제는 작업 트리의 파일을 다시 작성합니다. 비밀이 이미 커밋되었다면, 키를 교체하고 기록도 정리하세요 (예:
git filter-repo사용). 파일을 다시 작성하는 것은 유출된 자격 증명을 폐기하는 것의 대체물이 아닙니다.
REDACTED_BY_CREDACTOR 센티넬, 또는 언어를 인식하는 환경 변수 참조 (Python, JavaScript/TypeScript, Go, Java/Kotlin, Ruby, PHP, shell) 예: os.environ["KEY"]. 교체는 유효한 코드입니다. 파일에 이미 일치하는 import (예: import os)가 없다면 추가하세요..bak 백업, 심볼릭 링크 경계 및 파일 권한 가드, 모든 출력에서 전체 비밀 마스킹. 안전한 백업을 작성할 수 없으면 Credactor는 파일을 무작정 다시 작성하는 대신 건너뛰며, 쓰기 중 충돌이 발생해도 원본은 그대로 유지됩니다.--ci 게이트, pre-commit 훅, Gitleaks, TruffleHog 또는 Betterleaks 보고서 수집. 이미 실행 중인 스캐너로 탐지하고, Credactor로 수정하세요.pip install credactor
Python 3.11+가 필요합니다. 다른 의존성은 없습니다. Linux, macOS, Windows에서 실행됩니다 (CI는 Linux와 Windows에서 테스트됨).
macOS와 Linux에서는 대신 Homebrew로 설치할 수 있습니다:
brew install rxb06/tap/credactor
이 formula는 자체 virtualenv에 설치하며 선택적 [encoding] 추가 기능을 포함하므로, Homebrew 설치도 비UTF-8 파일에서 비밀을 탐지합니다. 일반 pip install credactor는 이 추가 기능을 제외합니다. 동일한 범위를 원하면 pip install 'credactor[encoding]'으로 추가하세요.
소스에서:
git clone https://github.com/rxb06/credactor.git
cd credactor
pip install -e .
그러면 credactor는 어느 디렉터리에서든 작동합니다.
먼저
--dry-run을 실행하고 삭제하기 전에 발견 사항을 검토하세요. 오탐이 가능하며,--fix-all에서는 오탐이 다시 작성됩니다. 알려진 안전한 값은# credactor:ignore또는.credactorignore항목으로 억제하세요.
credactor --dry-run . # scan, change nothing
credactor . # scan, then redact interactively (y/n per finding)
credactor --fix-all . # redact everything after one confirmation
credactor --fix-all --yes . # redact non-interactively (CI / scripts)
credactor --ci . # read-only gate: exit 1 on findings
credactor --replace-with env . # redact to env-var references instead of the sentinel
훅은 스테이징된 콘텐츠만 게이트하므로, 이미 커밋된 비밀은 다시 플래그되지 않습니다. 저장소에 이미 있는 것을 확인하려면
credactor --scan-history .를 사용하세요.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/rxb06/credactor
rev: v2.7.4 # pin to the latest release tag
hooks:
- id: credactor
- uses: rxb06/[email protected]
이 action은 항상 --ci를 전달하므로 보고하고 게이트하지만 체크아웃을 다시 작성하지 않습니다. 발견 사항은 단계를 실패시킵니다. 게이트 없이 보고하려면 fail-on-findings: false를 설정하세요. 오류는 어느 경우든 단계를 실패시킵니다.
발견 사항에서 실패하는 대신 Code Scanning에 업로드:
- uses: rxb06/[email protected]
with:
format: sarif
upload-sarif: true
fail-on-findings: false
업로드를 위해 작업에는 permissions: security-events: write가 필요합니다. Gitleaks, TruffleHog 및 Betterleaks 보고서 수집을 포함한 모든 입력은 CI 통합 가이드를 참조하세요.
Credactor는 가장 자주 유출되는 자격 증명 유형을 탐지하고, 각각에 심각도를 할당하여 한눈에 분류할 수 있게 합니다.
| 카테고리 | 예시 | 심각도 |
|---|---|---|
| 클라우드 제공자 키 | AWS (AKIA…), GCP (AIza…), Stripe (sk_live_…), Slack (xoxb-…) | Critical |
| 플랫폼 토큰 | GitHub (ghp_, github_pat_), GitLab (glpat-), npm (npm_), PyPI (pypi-) | Critical |
| 개인 키 | PEM 블록 (-----BEGIN … PRIVATE KEY-----) | Critical |
| JWT | eyJ… 3세그먼트 토큰 | High |
| 연결 문자열 | 인라인 자격 증명이 있는 URL (scheme://user:pass@host) | High |
| 자격 증명 변수 | password = "…", api_key = "…", secret_key = "…" | High/Medium/Low |
| XML 속성 | <add key="Password" value="…" /> | High/Medium/Low |
| 고엔트로피 문자열 | 따옴표로 묶인 hex (32–64자) / Base64 (60자 이상) | Medium/Low |
결정적 제공자 토큰 (위의 접두사)은 엔트로피와 관계없이 플래그됩니다. 휴리스틱 탐지기 (JWT, 연결 문자열, hex, Base64)는 엔트로피 하한을 통과해야 합니다. 독립형 hex 또는 Base64는 따옴표로 묶인 경우에만 플래그됩니다. 따옴표 없는 고엔트로피 값은 자격 증명 이름이 지정된 변수에서만 잡히므로 git SHA와 체크섬은 제외됩니다. 전체 탐지 및 심각도 규칙은 매뉴얼을 참조하세요.
Credactor의 기본 규칙 세트는 전용 스캐너보다 좁으며, 일부 제공자 형식 (예: SendGrid, Twilio, Slack 웹훅)은 탐지되지 않습니다. 강점은 수정입니다. 가장 광범위한 탐지를 위해 Gitleaks, TruffleHog 또는 Betterleaks와 함께 사용하거나 단독으로 실행하세요.
Credactor는 단독으로도 충분하며, 함께 사용하면 더 강력해집니다. 이미 Gitleaks, TruffleHog 또는 Betterleaks를 실행 중이신가요? 그들의 보고서를 Credactor에 전달하면 결합된 세트를 삭제하고, 자체 발견 사항과 중복 제거합니다 (중복 시 더 높은 심각도가 우선). 한 번의 수정 패스로 귀하의 스캔과 그들의 스캔을 모두 커버합니다:
gitleaks dir . -f json -r gitleaks.json
credactor --from-gitleaks gitleaks.json --fix-all --yes .
betterleaks dir . -f json -r betterleaks.json
credactor --from-betterleaks betterleaks.json --fix-all --yes .
--from-gitleaks / --from-trufflehog / --from-betterleaks (또는 .credactor.toml의 [ingest] 테이블)는 디렉터리 대상을 요구합니다. 스캐너가 실행된 동일한 루트로 Credactor를 지정하세요. 보고서 경로는 작업 디렉터리를 기준으로 해석되며, 보고서는 스냅샷입니다. 삭제하거나 트리를 변경한 후에는 다시 생성하세요. CI 통합 가이드를 참조하세요.
--replacement를 통한 사용자 정의 교체 문자열; git 커밋 기록을 스캔하는 --scan-history--secure-delete (.bak을 덮어쓰고 제거; 일상적인 복구에 대한 장벽을 높이지만 포렌식 보장은 아님) 또는 저장소 외부에 백업을 저장하는 --secure-backup-dir# credactor:ignore 및 .credactorignore 허용 목록 (glob, file:line, 값 리터럴).credactor.toml을 통한 저장소별 구성.txt 포함); JSON을 포함하려면 --scan-json; 파일을 읽을 수 없을 때 실패하려면 --fail-on-error
.py.js.ts.jsx.tsx.sh.bash.env.cfg.ini.toml.yaml.yml.rb.go.java.php.cs.kt.tf.hcl.conf.config.properties.xml.pem.key.crt.txt
추가로 .env.* / .env-* 변형 (.env.local, .env.production) 및 SSH / 개인 키 파일 (id_rsa, id_dsa, id_ecdsa, id_ed25519)이 있으며, 모두 확장자가 아닌 파일 이름으로 매칭됩니다. JSON은 API 응답이 높은 오탐률을 생성하므로 기본적으로 제외됩니다. 포함하려면 --scan-json을 추가하세요. 명령줄에 직접 지정된 파일은 확장자가 이 목록에 없어도 스캔됩니다.
| 코드 | 의미 |
|---|---|
0 | 발견 사항 없음, 또는 모두 해결됨 |
1 | 해결되지 않은 발견 사항 |
2 | 오류 (예: 잘못된 경로, 위험한 --replacement, --ci --fix-all, 누락되거나 유효하지 않은 수집 보고서, 또는 읽을 수 없는 파일과 함께 --fail-on-error) |
보안 도구는 실행하기에 안전할 뿐만 아니라 설치하기에도 안전해야 합니다. Credactor의 빌드 및 릴리스 파이프라인은 처음부터 끝까지 강화되어 있습니다. 전체 세부 사항은 보안 문서를 참조하세요.