Git 저장소의 모든 브랜치와 전체 커밋 히스토리에서 유출된 시크릿(API 키, 토큰, 비밀번호 등)을 찾는 Bash 스크립트입니다.
원격 저장소를 임시 디렉터리에 git clone --mirror로 받아서 검사하고, 끝나면 임시 디렉터리를 지웁니다.
| 파일 | 설명 | 필요한 도구 |
|---|---|---|
scan-secrets.sh |
grep 정규식과 파일 이름 목록으로 검사합니다. 결과를 텍스트 보고서로 저장합니다. |
git |
quick-scan.sh |
gitleaks로 검사합니다. gitleaks가 없으면 설치를 시도합니다. | git, gitleaks |
- Bash, Git
- 검사할 저장소에 대한 SSH 접근 권한 (클론 주소가
git@github.com:...형식입니다) quick-scan.sh를 쓰려면 gitleaks (macOS는brew install gitleaks)
- 검사할 저장소 목록을 수정합니다.
scan-secrets.sh: 파일 위쪽의REPOS배열quick-scan.sh: 파일 아래쪽의scan_repo호출
- 스크립트를 실행합니다.
bash scan-secrets.sh
bash quick-scan.sh두 스크립트 모두 인자를 받지 않습니다.
저장소마다 아래 순서로 검사합니다.
- 민감한 파일:
.env,.env.local,.env.production,config.json,secrets.json,credentials.json,application.yml,application.properties등이 히스토리에 한 번이라도 커밋된 적이 있는지 확인합니다. - 시크릿 패턴: 모든 커밋의 diff에서 아래 패턴을 찾습니다.
- Telegram 봇 토큰, chat_id
- 일반
api_key,api_secret,secret_key - 한국투자증권(KIS)
APP_KEY,APP_SECRET,CANO - 데이터베이스
password,DB_PASSWORD - AWS 액세스 키(
AKIA...),aws_secret_access_key - JWT 토큰
BEGIN ... PRIVATE KEY_TOKEN,_SECRET,_KEY로 끝나는 변수에 긴 값이 들어 있는 경우
- .gitignore:
.env,*.pem,*.key,__pycache__,*.pyc가 빠져 있으면 알려 줍니다. - 커밋 히스토리 요약: 최근 50개 커밋 그래프를 보고서에 넣습니다.
패턴을 추가하려면 PATTERNS 배열에 grep -E 형식의 정규식을 넣으면 됩니다. 파일을 추가하려면 SENSITIVE_FILES 배열에 파일 이름을 넣으면 됩니다.
scan-secrets.sh는 현재 디렉터리의 secret-scan-results/ 아래에 저장소별 보고서를 만듭니다.
secret-scan-results/<저장소 이름>-scan-report.txt
quick-scan.sh는 gitleaks 출력을 화면에만 보여 줍니다.
- 노출된 자격 증명을 즉시 폐기하고 새로 발급합니다.
- BFG Repo-Cleaner로 히스토리에서 지웁니다.
brew install bfg
bfg --delete-files .env
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --force --all- 보고서에는 발견된 시크릿 값이 그대로 들어갑니다.
secret-scan-results/를 커밋하지 마세요. 이 저장소에는.gitignore가 없으므로 직접 추가해야 합니다. quick-scan.sh는 gitleaks에--no-git옵션을 줍니다. 이 옵션은 커밋 히스토리를 따라가지 않고 디스크의 파일만 검사합니다. 따라서quick-scan.sh의 결과만으로 히스토리가 깨끗하다고 판단하면 안 됩니다.- 클론에 실패하면 스크립트 전체가 멈춥니다. 뒤에 적힌 저장소는 검사되지 않습니다.