유출은 언젠가 일어난다고 치고 가. 흥미로운 질문은 '일어날까 말까' 가 아니라 '일어나면 어떻게 대응할까' 야.
응답 트리
| Leak 한 거 | 첫 액션 | 왜 지금 |
|---|---|---|
| API 키 (OpenAI, Anthropic 등) | provider 대시보드에서 즉시 회전 | 비용이 없고, 악용되면 청구서가 쌓임 |
| GitHub PAT | GitHub 설정에서 revoke | repo write 접근 = 공급망 침해 |
| DB 비밀번호 | 회전, 그다음 access 로그 체크 | 데이터가 새는 시간은 유출된 그 순간부터 시작 |
| SSH 키 | 모든 서버 authorized_keys 에서 제거, 새 키 생성 | 지우기 전까진 계속 접근 가능 |
| 앱 PIN / session 토큰 (이 퀘스트) | Track 7 에서 Revoke All 클릭 | session 이 즉시 죽음 |
| OAuth client secret | OAuth provider 에서 회전 | 모든 앱 인스턴스에 영향 |
회전 후 세 lookup
- Provider audit 로그. OpenAI, Anthropic 같은 곳이 키별 사용량을 보여줘. 유출된 시각과 회전한 시각 사이에 이상한 게 있어?
- 애플리케이션 로그. 이미 죽은 키나 토큰으로 들어온 뜻밖의 요청이 있어?
- Billing. 사용량이 튀었다면 누군가 네 키를 쓴 거야. 청구서는 보통 하루쯤 늦게 뜨니까 내일도 확인해.
할 수 없는 것
LLM provider 의 로그, 훈련 파이프라인, 제3자 캐시에서 시크릿을 지워낼 방법은 없어. 시크릿이 원격 서버로 넘어간 순간, 네가 통제 못 하는 기간 동안 여러 벌로 존재하게 돼. 통하는 대응은 회전뿐이야. 사과로는 안 돼.
Post-mortem 질문
"이 유출을 애초에 못 나가게 하려면 뭐가 필요했을까?" 답은 거의 항상 같아. "시크릿이 agent 가 읽을 수 있는 파일에 있으면 안 됐다." 그 답을 영구적인 변화로 옮겨. keychain 으로 옮기기, ignore 파일 갱신, 넓은 토큰 대신 권한을 좁힌 토큰.