전제: 환경 변수는 모두 유출되었다고 본다
Zeabur는 8/28, 일부 프로젝트의 환경 변수에 무단 접근이 있었다고 공지했습니다. 여기에는 “API 키, 데이터베이스 접속 문자열, 클라우드 서비스 키” 같은 일반적인 자격 증명이 포함되었습니다(CodeCat이 전한 공지 내용). Zeabur는 9/7에 보안 업그레이드를 했지만, 10/14에 더 큰 보안 사고가 일어났고 이후 서비스 종료를 발표했습니다.
내 데이터가 영향을 받았는지 알 수 없으니, 가장 안전한 방법은 Zeabur 환경 변수에 넣어 둔 키를 모두 교체하는 것입니다.
순서: 돈과 직결되는 것부터, 나머지는 이전할 때
오늘 교체: 유출되면 바로 금전 피해로 이어지는 키.
| 종류 | 예 | 교체 후 확인할 것 |
|---|---|---|
| 결제 | Stripe 등 결제 서비스의 시크릿 키 | 최근 거래와 환불 내역 |
| AI API | OpenAI, Anthropic, Gemini API 키 | 청구서에 비정상 사용량이 없는지, 이참에 사용 한도도 설정 |
| 클라우드 계정 | AWS 액세스 키, GCP 서비스 계정 JSON, Cloudflare API 토큰 | 모르는 리소스가 생기지 않았는지 |
| 메일 발송 서비스 | SendGrid, Resend, Mailgun | 발송 기록 (사기 메일 발송에 악용될 수 있음) |
이전할 때 교체: 새 플랫폼에 새 키를 설정하고, 새 서비스가 정상인지 확인한 뒤 옛 키를 폐기합니다. 한 번만 바꾸면 되고 서비스도 멈추지 않습니다.
- 데이터베이스 비밀번호 (새 DB는 원래 새 비밀번호지만 다음 섹션의 함정에 주의)
- LINE Channel Secret과 Channel Access Token, Discord·Telegram 봇 토큰
- Google·Facebook 로그인의 OAuth 클라이언트 시크릿
- JWT/세션 서명 키: 바꾸면 모든 사용자가 한 번 로그아웃되는데, 정상입니다
- n8n에 저장된 각 서비스의 credentials (n8n 편 참고)
테스트에서 발견한 함정: 백업을 복원하면 옛 비밀번호도 돌아온다
Zeabur의 PostgreSQL 백업은 pg_dumpall로 만든 data.sql입니다. 같은 형식으로 테스트해 보니 파일 앞부분에 다음 두 줄이 있었습니다.
CREATE ROLE root;
ALTER ROLE root WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:...';
psql로 새 데이터베이스에 복원하면 root 비밀번호가 Zeabur의 옛 비밀번호로 돌아갑니다. 그 비밀번호가 보안 사고로 유출되었다면 새 데이터베이스도 안전하지 않습니다.
해결 방법 (둘 중 하나):
- 복원 전에
data.sql에서CREATE ROLE과ALTER ROLE두 줄을 지우기 - 복원 후 바로 비밀번호 바꾸기:
ALTER ROLE root WITH PASSWORD '새로운-긴-비밀번호';
더 좋은 방법은 pg_dump로 데이터베이스 자체만 백업하는 것입니다. 역할과 비밀번호가 따라오지 않습니다. 자세한 방법은 데이터베이스 편을 참고하세요.
이전 후 마무리
- GitHub의 Zeabur App 삭제: GitHub → Settings → Applications → Installed GitHub Apps → Zeabur → Uninstall. 모두 옮긴 뒤에 삭제하세요. 먼저 지우면 Zeabur의 서비스를 다시 배포할 수 없습니다
- 전용 서버의 SSH 키: Zeabur 전용 서버에 SSH 공개 키를 등록했다면 새 서버에서는 새 키 쌍을 쓰기
- Zeabur의 데이터 삭제: 백업이 내 손에 있는지 확인한 뒤 서비스, 볼륨, 프로젝트를 삭제하기. 환불을 신청할 때 계정 데이터 삭제도 함께 요청하고 서면 기록을 남기기
- 증거 남기기: 비정상 청구가 있는 명세서 스크린샷을 저장해 두세요. Zeabur에 보안 사고 보상을 신청할 때 필요합니다 (이전 가이드의 환불 섹션 참고)