diff --git a/journey/troubleshooting/260308_env_backup_git_tracking_exposure_및_차단조치.md b/journey/troubleshooting/260308_env_backup_git_tracking_exposure_및_차단조치.md new file mode 100644 index 0000000..a479ff2 --- /dev/null +++ b/journey/troubleshooting/260308_env_backup_git_tracking_exposure_및_차단조치.md @@ -0,0 +1,81 @@ +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) diff --git a/journey/troubleshooting/260308_rb8001_env_파생파일_git_노출_이슈.md b/journey/troubleshooting/260308_rb8001_env_파생파일_git_노출_이슈.md new file mode 100644 index 0000000..2c10675 --- /dev/null +++ b/journey/troubleshooting/260308_rb8001_env_파생파일_git_노출_이슈.md @@ -0,0 +1,36 @@ +tags: [rb8001, env, git, secrets, troubleshooting] + +# 260308 rb8001 env 파생파일 git 노출 이슈 + +상위 원칙: +- [global-principles](../../../../0_VALUE/00_Principles/global-principles.md) +- [writing-principles](../../../../0_VALUE/02_Governance/writing-principles.md) + +## 문제 상황 + +- `rb8001` 저장소에서 `.env.backup`, `.env.bak.20260304032910`, `.env.bak.20260306193102`, `.env.deploy`가 git 원격에 포함된 사실이 확인됐습니다. +- 이 파일들에는 운영 비밀값 또는 배포 연결 정보가 포함돼 있어, 저장소 히스토리에 남는 보안 이슈가 발생했습니다. +- 현재 문제의 핵심은 `rb8001`에서 `.env` 파생 파일이 버전 관리 대상으로 들어갔다는 점입니다. + +## 재현 조건 + +- 서비스 루트에 `.env` 백업본 또는 `.env` 파생 파일이 생성된 상태였습니다. +- `.gitignore`는 `.env`만 제외하고 `.env.*`, `*.env.*`를 제외하지 않고 있었습니다. +- 그 상태에서 일반 커밋/푸시가 수행되면 `.env` 파생 파일이 원격에 포함될 수 있었습니다. + +## 영향 범위 + +- `rb8001` 원격 저장소 히스토리에 민감 정보가 포함된 env 파생 파일이 남았습니다. +- 운영자가 실제 비밀값이 들어간 로컬 백업본을 만들고 유지할 경우, 동일 유형 노출이 다시 발생할 가능성이 있었습니다. +- 이 사건은 `rb8001`에서 먼저 확인됐지만, 다른 저장소에도 유사 패턴이 있는지 후속 확인이 필요한 상태입니다. + +## 즉시 대응 상태 + +- `rb8001`에서는 `.gitignore`를 확장해 `.env` 파생 파일이 다시 추적되지 않도록 조치했습니다. +- 이미 추적되던 env 파생 파일은 git 인덱스에서 제거했고, 로컬 백업본도 삭제했습니다. +- 다만 원격 히스토리에 남은 민감값 폐기와 재발급 여부는 아직 닫히지 않았습니다. + +## 관련 문서 + +- [260308_env_backup_git_tracking_exposure_및_차단조치.md](./260308_env_backup_git_tracking_exposure_및_차단조치.md) +- [README](./README.md)