Mailgun 잠재적 침해 경고 후 메일 계정 보안 점검과 키 교체를 진행하는 유령 서버 관리자 일러스트

Mailgun 잠재적 침해 경고 후 Ghost EAUTH 535 점검과 복구

서버 운영 2026년 8월 19일

한 줄 결론: Ghost의 Failed to send emailEAUTH 535를 단순 SMTP 설정 오류로만 보면 안 된다. 메일 서비스 계정이 잠재적 침해 가능성으로 중지됐다면 기존 키 폐기, SMTP 비밀번호 변경, 사용자·세션·발송 로그 점검, 애플리케이션 보안 확인, 서비스 제공자의 재활성화 절차까지 함께 진행해야 한다.

Ghost 관리자 로그인을 시도하다가 인증 메일이 발송되지 않았다. 처음에는 SMTP 주소나 포트, TLS 설정 문제처럼 보였지만, 로그와 Mailgun 계정 상태를 함께 확인하면서 점검 범위가 훨씬 넓어졌다.

이 글은 실제 점검 과정을 바탕으로 작성했다. 다만 Mailgun의 잠재적 침해 경고만으로 Ghost 서버 침해가 확정된 것은 아니며, 게시글 변조 흔적과 Mailgun 계정 중지 사이의 직접적인 인과관계도 확인되지 않았다. 확인된 사실과 추정을 분리하면서 대응한 과정을 정리한다.

시작은 Ghost 로그인 메일 오류였다

Ghost 관리자 화면에는 다음 오류가 표시됐다.

Failed to send email.
Please check your site configuration and try again.

Ghost 로그에서는 관리자 인증 코드를 보내는 단계까지 진행된 뒤 다음 오류가 발생했다.

EAUTH
535 Authentication failed

Ghost 애플리케이션과 데이터베이스는 정상적으로 시작된 상태였다. 즉, 사이트 전체 장애보다는 메일 인증 단계에서 요청이 거부된 상황에 가까웠다.

Mailgun 대시보드에서는 계정이 잠재적 침해 가능성 때문에 일시 중지됐다는 안내가 표시됐다. 이 상태에서는 Ghost 쪽 SMTP 주소와 포트를 반복해서 수정해도 인증 요청이 계속 거부될 수 있다.

EAUTH 535가 의미하는 것

EAUTH와 SMTP 응답 코드 535가 함께 나온다면 네트워크 연결보다 먼저 다음 항목을 확인해야 한다.

  • SMTP 사용자명과 비밀번호가 현재 유효한가?
  • 오래된 비밀번호나 삭제된 SMTP 사용자를 사용하고 있지 않은가?
  • 메일 서비스 계정이나 도메인이 중지된 상태는 아닌가?
  • IP Allowlist가 정상 서버의 송신 IP까지 차단하고 있지 않은가?
  • 새 자격증명을 만들기만 하고 기존 키를 폐기하지 않은 것은 아닌가?

Mailgun의 계정 침해 대응 안내도 애플리케이션·호스팅·공개 저장소의 노출 가능성을 조사하고, 기존 API 키 삭제, SMTP 비밀번호 재설정, 알 수 없는 SMTP 사용자 제거, 계정 비밀번호 변경, 2단계 인증 적용 후 지원팀에 회신하도록 안내한다.

확인된 사실과 확인되지 않은 추정

보안 점검에서는 의심스러운 흔적과 실제로 입증된 사실을 분리해야 한다. 문자열 하나나 스팸 링크만으로 특정 취약점이 악용됐다고 단정하면 잘못된 원인에 매달릴 수 있다.

실제로 확인된 내용

  • Ghost 관리자 인증 메일 발송 단계에서 EAUTH 535가 발생했다.
  • Mailgun 계정이 잠재적 침해 가능성을 이유로 일시 중지돼 있었다.
  • Ghost는 당시 5.110 버전으로 운영되고 있었다.
  • 세 개의 공개 게시글에서 무관한 축구 유니폼 판매 링크가 발견됐다.
  • 한 게시글의 Head Code Injection에서 취약점과 PoC를 연상시키는 의심스러운 문자열이 발견됐다.
  • 외부 접근이 가능했던 백업이 있어 공개 경로에서 격리했다.
  • 공개 HTML과 Ghost API 응답에서는 Mailgun 비밀값이 그대로 노출된 흔적을 발견하지 못했다.

확인되지 않은 내용

  • 스팸 링크와 Code Injection이 삽입된 정확한 시점과 경로
  • 의심스러운 문자열과 실제 취약점 악용 사이의 관련성
  • Ghost 게시글 변조와 Mailgun 계정 중지가 같은 원인에서 발생했는지 여부
  • 과거 어느 시점에도 자격증명이 노출되지 않았다는 보장
  • 실제 계정 침입이나 데이터 유출 여부

따라서 이번 작업에서는 특정 공격으로 단정하지 않고, 자격증명이 노출됐을 가능성을 전제로 기존 값을 폐기하고 확인된 위험 요소를 각각 제거했다.

실제 대응 순서

1. 공개 백업과 변조 콘텐츠부터 격리

외부에서 접근 가능한 백업은 설정 파일, 콘텐츠 원본, 시스템 구조를 노출할 수 있다. 공개 접근이 가능했던 백업은 즉시 웹에서 분리하고, 사고 분석과 복구에 필요한 사본만 비공개 위치에 보관했다.

이후 변조가 확인된 게시글에서 무관한 외부 링크를 제거했다. Ghost에는 사이트 전체 Code Injection과 게시글별 Code Injection이 따로 있으므로 본문만 확인해서는 부족하다.

다음 영역을 함께 점검했다.

  • 게시글 본문과 HTML 카드
  • 게시글별 Head·Footer Code Injection
  • 사이트 전체 Code Injection
  • 테마 파일과 외부 스크립트
  • 공개 페이지의 최종 HTML
  • Ghost API 응답에 포함된 외부 링크

정리 후에는 공개 HTML과 API 응답에서 스팸 링크와 의심스러운 문자열이 더 이상 나타나지 않는지 다시 검사했다.

2. Ghost를 단계적으로 업그레이드

운영 중이던 Ghost를 5.110 → 5.130.6 → 6.57.1 순서로 업그레이드했다. 메이저 버전을 올릴 때는 데이터베이스 마이그레이션, 테마 호환성, 런타임 요구사항이 함께 바뀔 수 있어 각 단계의 정상 동작을 확인했다.

  • 애플리케이션과 데이터베이스 정상 시작
  • 관리자 화면 접근
  • 기존 게시글과 이미지 표시
  • 테마 레이아웃
  • RSS와 사이트맵 응답
  • Code Injection 적용 상태
  • 오류 로그 발생 여부

Ghost 공식 업데이트 안내는 업데이트 전 백업과 최신 버전 유지를 권장한다. 다만 버전 업그레이드만으로 이미 삽입된 스팸 링크나 노출된 자격증명이 자동 복구되지는 않으므로 콘텐츠 정리와 비밀값 교체는 별도로 해야 한다.

3. Mailgun API 키와 SMTP 자격증명을 각각 교체

Ghost에서 Mailgun을 사용한다면 비밀값이 하나라고 생각하기 쉽지만 역할이 다를 수 있다.

  • 대량 뉴스레터 발송: Mailgun API 키
  • 관리자·멤버 인증 메일: Ghost의 표준 메일 설정에 등록된 SMTP 자격증명

Ghost 뉴스레터 문서에 따르면 셀프호스팅 환경의 뉴스레터 발송은 Mailgun API를 사용하고, 인증 메일은 표준 메일 설정을 사용한다. 두 기능을 모두 사용한다면 API 키와 SMTP 비밀번호를 서로 다른 비밀값으로 보고 각각 점검해야 한다.

이번에는 다음과 같이 정리했다.

  1. 기존 Mailgun API 키를 폐기하고 새 키를 발급했다.
  2. SMTP 비밀번호를 재설정했다.
  3. Ghost 설정에 새 값을 반영했다.
  4. 사용하지 않는 중복 SMTP 사용자를 삭제했다.
  5. 실제 사용하는 발신 계정만 남겼다.
  6. 기존 자격증명이 더 이상 동작하지 않는지 확인 대상으로 남겼다.

새 키를 추가하는 것만으로는 회전이 끝난 것이 아니다. 노출 가능성이 있는 구 키를 삭제해야 교체가 완료된다.

4. Mailgun 계정 사용자와 세션 정리

자격증명을 바꿔도 이전 계정 세션이 계속 유효하면 관리 화면 접근이 남을 수 있다. 등록된 사용자와 권한을 검토하고, 기존 로그인 세션을 모두 종료한 뒤 새 세션으로 다시 로그인했다.

계정 보안도 함께 강화했다.

  • Mailgun 계정 비밀번호 변경
  • 2단계 인증 활성화
  • 모르는 사용자와 불필요한 권한 확인
  • API 키와 SMTP 사용자 목록 재검토

Mailgun Control Panel 안내에서 사용자, MFA, 세션, API 키와 발송 로그의 관리 위치를 확인할 수 있다. 세션 종료는 API 키나 SMTP 비밀번호를 폐기하는 조치와 별개이므로 둘 다 수행해야 한다.

5. 발송 로그에서 실제 악용 흔적 확인

Mailgun Logs에서 다음 패턴이 있는지 확인했다.

  • 내가 보내지 않은 Accepted 또는 Delivered 이벤트
  • 익숙하지 않은 수신자와 제목
  • 평소와 다른 시간대의 발송
  • Rejected 또는 Failed 이벤트의 갑작스러운 증가
  • 특정 SMTP 사용자나 도메인에 집중된 이상 활동

Mailgun Email Events 문서는 수신자, 제목, 메시지 ID 등으로 이벤트를 검색할 수 있다고 안내한다. 로그 보존 기간은 요금제에 따라 다르므로, 현재 화면에 이상 기록이 없다는 사실만으로 과거 전체가 안전했다고 단정해서는 안 된다.

6. 고정 송신 IP에 IP Allowlist 적용

서버의 고정된 외부 송신 IP를 확인한 뒤 해당 주소만 허용하도록 IP Allowlist를 적용했다. 실제 IP 값은 문서나 공개 게시글에 남기지 않았다.

Mailgun IP Allowlist 안내에 따르면 등록한 IP는 HTTP API와 SMTP 연결 모두에 영향을 준다. 잘못된 IP를 등록하면 정상 SMTP 요청도 535 Authentication failed, API 요청은 401 Forbidden으로 거부될 수 있다.

따라서 IP가 자주 변하는 환경에서는 무조건 적용하면 안 된다. 고정 송신 IP가 확실하고 장애 시 관리 경로를 확보한 환경에서 사용하는 편이 안전하다.

7. Mailgun 지원팀에 재활성화 요청

서버와 Ghost 설정을 정리해도 Mailgun 측 일시 중지 상태가 자동으로 풀린다고 가정하면 안 된다. 지원팀에는 다음 내용을 요약해 전달했다.

  • Ghost를 지원 버전으로 업데이트한 사실
  • 공개 백업과 변조 콘텐츠를 격리·정리한 사실
  • 기존 API 키 폐기와 SMTP 비밀번호 재설정
  • 불필요한 SMTP 사용자와 기존 세션 정리
  • 계정 비밀번호 변경과 2단계 인증 적용
  • IP Allowlist 설정
  • 등록 사용자와 발송 로그 점검 결과
  • 계정 재검토와 발송 기능 재활성화 요청

지원 티켓에는 실제 키, SMTP 비밀번호, 전체 설정 파일을 붙이지 않았다. 조치 내용과 확인 결과만 전달했다.

재활성화 후 확인할 항목

애플리케이션 복구와 메일 서비스 계정 재활성화는 서로 다른 단계다. Mailgun이 아직 중지 상태라면 Ghost 설정이 올바르더라도 인증 메일은 계속 실패할 수 있다.

재활성화 안내를 받은 뒤에는 다음 순서로 최종 검증한다.

  1. Mailgun 대시보드에서 계정과 도메인 상태를 확인한다.
  2. 새 자격증명으로 최소 범위의 테스트 메일을 보낸다.
  3. Mailgun Logs에서 요청 처리 결과를 확인한다.
  4. 새 브라우저 세션에서 Ghost 관리자 인증 메일을 요청한다.
  5. 멤버 기능을 사용한다면 매직 링크 메일도 별도로 확인한다.
  6. 실패하면 Ghost 로그의 최신 SMTP 응답 코드를 다시 확인한다.
  7. 기존 키와 SMTP 비밀번호가 폐기됐는지 확인한다.

Ghost 보안 문서에 따르면 새 기기의 스태프 로그인과 이메일 2단계 인증은 등록 이메일로 받은 코드에 의존한다. 따라서 SMTP 장애는 단순 알림 실패가 아니라 관리자 로그인 자체를 막을 수 있다.

자주 놓치는 실수

SMTP 포트와 TLS만 반복해서 바꾸기

EAUTH 535는 계정 상태나 자격증명 거부일 수 있다. 소켓 연결 오류와 인증 오류를 구분해야 한다.

새 키를 만들고 이전 키를 그대로 두기

새 키 발급은 기존 키 폐기와 함께 해야 한다. 영향을 받았을 가능성이 있는 값이 남아 있으면 회전의 목적을 달성하지 못한다.

관리자 화면 접속만으로 메일 복구를 판단하기

이미 로그인된 세션으로 관리자 화면에 들어갈 수 있어도 SMTP 발송이 정상이라는 뜻은 아니다. 새 세션에서 인증 메일이 실제 도착하는지 확인해야 한다.

송신 IP를 확인하지 않고 Allowlist 적용하기

프록시에서 보이는 방문자 IP와 서버가 Mailgun으로 나갈 때 사용하는 송신 IP는 다를 수 있다. 실제 송신 경로를 먼저 확인해야 한다.

현재 로그만 보고 과거 전체가 안전하다고 단정하기

로그 보존 기간은 요금제에 따라 제한된다. 확인 가능한 기간과 점검 범위를 기록해야 한다.

Ghost·Mailgun 보안 점검 체크리스트

  • [ ] 공개 경로에 백업이나 설정 파일이 없는가?
  • [ ] 게시글 본문과 게시글별 Code Injection을 확인했는가?
  • [ ] 사이트 전체 Code Injection과 테마 파일을 확인했는가?
  • [ ] 알 수 없는 외부 링크와 스크립트를 제거했는가?
  • [ ] Ghost와 사용 중인 컨테이너 이미지를 지원 버전으로 업데이트했는가?
  • [ ] 기존 API 키를 삭제하고 새 키로 교체했는가?
  • [ ] 모든 도메인의 SMTP 비밀번호를 재설정했는가?
  • [ ] 모르는 SMTP 사용자와 사용하지 않는 계정을 삭제했는가?
  • [ ] 계정 비밀번호를 바꾸고 2단계 인증을 적용했는가?
  • [ ] 기존 로그인 세션을 종료했는가?
  • [ ] 발송 로그에서 비정상 수신자·제목·시간대·발송량을 확인했는가?
  • [ ] 고정 송신 IP를 확인한 뒤 Allowlist를 적용했는가?
  • [ ] 자격증명 교체 후 기존 값이 폐기됐는지 확인했는가?
  • [ ] 지원팀에 완료한 조치와 재활성화 요청을 전달했는가?
  • [ ] 재활성화 후 Ghost 인증 메일과 멤버 매직 링크를 각각 테스트했는가?

마무리

이번 문제의 시작은 Ghost의 로그인 메일 전송 실패였다. 그러나 로그의 EAUTH 535, Mailgun 계정 일시 중지, 게시글의 스팸 링크와 Code Injection 흔적을 차례로 확인하면서 SMTP 설정 하나만 고쳐서 끝낼 문제가 아니라는 것을 알 수 있었다.

그렇다고 발견된 모든 현상을 하나의 해킹 사건으로 단정해서도 안 된다. 확인된 것은 Mailgun의 인증 거부와 콘텐츠 변조 흔적이며, 정확한 침입 경로와 두 사건의 연관성은 확인되지 않았다.

가장 안전한 대응은 특정 원인을 추측해 한 부분만 수정하는 것이 아니라, 공개 백업과 콘텐츠, Ghost 버전, API 키, SMTP 비밀번호, 사용자·세션, 발송 로그, 메일 제공자의 계정 상태를 하나의 흐름으로 점검하는 것이다.

Ghost에서 Failed to send emailEAUTH 535가 함께 발생한다면 SMTP 주소와 포트만 반복해서 바꾸지 말자. 메일 서비스의 계정 상태와 발송 로그, 자격증명, Ghost 콘텐츠와 Code Injection까지 범위를 넓혀 확인해야 한다.

태그