tags: [env, secrets, git, security, troubleshooting]

# 260308 env backup git tracking exposure 및 차단조치

상위 원칙:
- [global-principles](../../../../0_VALUE/00_Principles/global-principles.md)
- [writing-principles](../../../../0_VALUE/02_Governance/writing-principles.md)

## 1. 목적
- `rb8001` 저장소에 `.env` 백업본과 배포용 env 파일이 git 원격에 포함된 경위를 기록합니다.
- 동일 유형 파일이 다시 원격에 올라가지 않도록 차단한 조치와 잔여 범위를 남깁니다.

## 2. Facts

### 2.1 `rb8001` 노출 사실
- 대상 파일: `.env.backup`, `.env.bak.20260304032910`, `.env.bak.20260306193102`, `.env.deploy`
- 원격 반영 커밋:
  - `b9731bfc68bd12d0bdefc74a1403a878433c6824` (`2026-01-02 12:53:52 +0900`): `.env.backup` 추가
  - `5f24b2bdb515b0a372cebaf62052f7086d41e739` (`2026-03-07 17:01:56 +0900`): `.env.bak.20260304032910`, `.env.bak.20260306193102`, `.env.deploy` 포함
- `5f24b2b`는 로컬 reflog 기준 같은 시각에 `refs/remotes/origin/main: update by push`가 확인됐습니다.

### 2.2 `rb8001` 원인성 설정 사실
- `/home/admin/robeing/rb8001/.gitignore`에는 기존에 `.env`만 있었고 `.env.*`, `*.env.*` 차단 규칙은 없었습니다.
- 저장소 내부 검색 기준, `.env.bak.*` 또는 `.env.backup` 생성을 지시하는 자동 스크립트/코드는 확인되지 않았습니다.
- `/home/admin/AGENTS.md`에는 환경변수 기준을 `/home/admin/infra-config/runtime.env`, `/home/admin/infra-config/secrets.env`로 두고, 서비스별 `.env`는 임시 로컬 오버라이드 전용이라고 명시돼 있습니다.

### 2.3 `rb8001` 즉시 조치 사실
- `2026-03-08`에 `.gitignore`를 아래 패턴까지 확장했습니다.
  - `.env.*`
  - `*.env`
  - `*.env.*`
  - 예외: `.env.deploy.example`
- 추적 중이던 `.env.backup`, `.env.bak.20260304032910`, `.env.bak.20260306193102`, `.env.deploy`를 git 인덱스에서 제거했습니다.
- 위 변경은 커밋 `5f0087d` (`chore: stop tracking env files`)로 `origin/main`에 push됐습니다.
- 로컬 파일도 `.env.backup`, `.env.bak.20260304032910`, `.env.bak.20260306193102`를 삭제했습니다.

### 2.4 워크스페이스 전수 확인 사실
- 백업본 실파일 확인:
  - `/home/admin/robeing/skill-news/.env.backup`
- git 추적 중인 `.env*` 확인:
  - `/home/admin/fluent-bit`: `.env`
  - `/home/admin/ivada_project/robeing-monitor`: `.env.deploy`, `.env.deploy.example`
  - `/home/admin/robeing/robeing-monitor`: `.env.deploy`, `.env.deploy.example`
  - `/home/admin/robeing/skill-calendar`: `.env.deploy`, `.env.deploy.example`
  - `/home/admin/robeing/skill-email`: `.env.deploy`, `.env.deploy.example`
  - `/home/admin/robeing/skill-embedding-repo`: `.env.deploy`, `.env.deploy.example`, `.env.example`
  - `/home/admin/robeing/skill-news`: `.env.backup`, `.env.deploy`, `.env.deploy.example`, `.env.example`
  - `/home/admin/robeing/skill-rag-file`: `.env.deploy`, `.env.deploy.example`, `.env.example`
  - `/home/admin/robeing/skill-slack`: `.env.deploy`, `.env.deploy.example`
  - `/home/admin/vMIR/LocalTerra`: `.env`
  - `/home/admin/vMIR/mirror-terra-web-dapp-ref`: `.env`, `.env.development`
  - `/home/admin/vMIR/vmir-web-app`: `.env`, `.env.development`
- `/home/admin/auth-server`는 `.git/config` 권한 문제로 이번 점검에서 추적 여부를 확정하지 못했습니다.

## 3. Interpretation
- `rb8001`의 직접 원인은 `.env`만 무시하고 `.env` 파생 파일을 무시하지 않은 `.gitignore` 공백입니다.
- `.env.bak.20260304032910`, `.env.bak.20260306193102`는 파일명과 내용상 `.env`의 시점별 수동 백업본으로 해석됩니다.
- 이 문제는 단일 저장소 실수라기보다, 여러 저장소에서 `.env`, `.env.deploy`, `.env.backup`를 버전 관리 대상으로 다뤄 온 운영 습관 문제로 봐야 합니다.
- 전역 원칙 문서가 요구하는 방향은 SSOT(Single Source of Truth, 단일 진실 공급원) 기반의 `runtime.env`/`secrets.env` 분리이며, 서비스 루트의 실제 비밀 env 파일을 git에 유지하는 방식과 충돌합니다.

## 4. Unresolved
- 이미 원격 히스토리에 포함된 민감값은 커밋 삭제만으로 무효화되지 않으므로, 실제 키 폐기와 재발급 여부를 별도로 확인해야 합니다.
- `skill-news`를 포함한 다른 저장소들의 `.env*` 추적 해제 범위는 아직 미적용 상태입니다.
- `auth-server`는 권한 문제를 해소한 뒤 `.env*` 추적 여부를 다시 확인해야 합니다.
- `.env.deploy`를 예제 파일만 남기고 모두 제거할지, SSOT 경로 참조 방식으로 전환할지 저장소별 운영 기준 정리가 필요합니다.

## 5. 다음 조치 후보
- 우선순위 1: 원격 히스토리에 노출된 Slack, OpenAI, Perplexity, Tavily, JWT 등 민감값 폐기 및 재발급
- 우선순위 2: `skill-news` 포함 나머지 저장소에도 동일한 `.gitignore` 확장과 git 추적 해제 적용
- 우선순위 3: 서비스별 `.env.deploy`를 예제 파일만 남기는 구조로 통일하거나, `/home/admin/infra-config` 참조 구조로 일원화

## 6. 검증 근거
- `git log --follow --date=iso --name-status -- .env.bak.20260304032910`
- `git show --stat --summary 5f24b2bdb515b0a372cebaf62052f7086d41e739`
- `git reflog --date=iso --all`
- `git ls-files '.env*'`
- `find /home/admin -path '*/.git' -prune -o -type f \( -name '.env.backup' -o -name '.env.bak.*' -o -name '.env.deploy' -o -name '.env' \) -print`

관련 문서:
- [260307 gateway SSOT(runtime/secrets) 분리 적용 및 검증](./260307_gateway_SSOT_runtime_secrets_분리_적용_및_검증.md)
- [README](./README.md)
