MY ELASTICSEARCH HAS BEEN HACKED

서론

오늘은 추석이지만 딱히 집에서 할 것이 없어서 열심히 글을 써 보려고 한다.

10일 전, 그러니깐 DarkLight 를 운영한지 정확하게 2일차인 2018년 9월 14일 오후 5시경에 서비스가 제대로 작동하지 않는다는 알림을 받게 되었다.

그 문제는 다른 기능은 모두 정상적으로 작동하는데 검색 부분에서 계속 서버에서 500 에러가 지속적으로 반환되는걸 인지하였다.

그러나 이땐 런닝머신 위에서 이 사실을 알게 되어서 운동을 중단하고 샤워를 한 뒤에 급하게 휴대폰을 이용해 무슨 일인지 서버에 접속해 보았다..

해킹, 당하다

처음에는 웹 서버 문제로 인식해서 에러가 발생한 부분의 코드를 계속 보았지만 로컬 테스트 서버와 연결했을 때 전혀 문제가 없음을 확인하고 다시 한번 에러를 보니..

Index not found… 이 말은 인덱스를 찾을 수 없습니다. 라는 메시지였다.

진짜 이 메시지를 본 순간 나는 우리집에 입대영장이 날아온 그 날과 비슷한 소름을 겪었다. (물론 대학생이라 입대 연기가 자동으로 가능했기에 별로 신경은 안써도 되었지만 이건 그게 아니였다.)

일단 이 즉시 ElasticSearch가 구동되고 있는 서버에 접속해서 무슨 일인지 로그를 뽑아본 순간..

서버해킹완료

하.. 이미 저장되어 있던 모든 데이터가 삭제되고 해커의 메시지인 readme 만 남아있었다.

일단 그 내용을 열어보니 이런 메시지만 남기고 해커는 빤스런했다.

서버해킹완료 메시지

일단 해커는 본인이 데이터를 백업하고 삭제했으며 본인에게 0.05BTC를 주면 된다고 복구 해준다고 한다.

0.05 BTC면 지금 시세로 대충 35만원 정도 하는데 그 돈이면 차라리 아이유 콘서트를 3번 더 갈 것이다.

왜 이런 사건이 벌어졌는가?

일단 이렇게 해커가 무단으로 침입한 원인을 찾기로 했다.

이런 일을 방지하기 위해 접속 과정에서 Credential 을 무조건 요구하고 있었는데 이 Credential이 유출되서 해커가 침입한 것이라면 엄청난 문제가 있었기 때문이다.

그래서 인증 로그를 살펴봤는데 그 당시 인증 로그가 남아있지 않았다…?

그래서 왜 그런지 방화벽을 본 순간 그 원인을 찾을 수 있었다. 방화벽에는 그 유명한 9200포트가 열려 있었다.

원래 내 성격상 정해진 포트를 사용하는걸 싫어해서 8000번대 포트로 설정을 변경하고 인증 서버를 거쳐 들어가게끔 설계를 해 두었다.

그러나 테스트를 위해서 잠깐 9200포트를 열어두고 그 설정을 변경하지 않은 상태로 유지하면서 이 사건이 벌어졌다.

말 그대로 앞문은 빵빵하게 보안 장치 다 걸어두고 있는데 뒷문은 그냥 열려있는 상태로 냅둔 것이다.

(물론 지금은 조치 완료하고 다시 모든걸 다 조사 했다)

데이터 손실 범위 산출

일단 DarkLight에서 ElasticSearch에 저장하는 데이터는 아래와 같았다.

  • 크롤러 스캔 결과
  • 도메인 주소 리스트

이 이외의 데이터는 모두 다른 곳에 저장되고 있으며 스캔 결과 내역 중 HTML 소스코드를 제외한 데이터는 모두 이중 백업되어 잘 살아 있음을 확인 하였다.

복구 과정

일단 HTML 소스코드가 모두 손실 되었고, 그 이외의 데이터는 모두 이중으로 백업이 되고 있어서 바로 복구가 가능한 상태였다.

그러나 서비스의 메인 기능 중 하나인 HTML 소스코드 보기 기능이 제공되지 못한다는게 큰 문제였다.

이 상태에서 내가 선택할 수 있는 선택지는 아래와 같았다.

  • HTML 소스코드 보기 기능을 서비스에서 제외한다.
  • 데이터를 보존한 상태에서 크롤러를 따로 작동시켜 HTML 소스코드만을 새로 돌리는 작업
  • 모든 데이터를 삭제하고 아예 처음부터 데이터를 쌓는 방법

여기서 1번 선택지의 경우에는 아예 처음부터 배제했던 방법이였다. 원래 제공하던 서비스를 말도 안되는 이유로 뺄 수는 없었기 때문이다.

그래서 일단 2번 선택지를 이용해 복구를 시도하였지만, 문제는 지금 시점과 당시 시점과의 소스코드 차이로 인해 스크린샷 데이터와 HTML 데이터가 불일치하는 현상이 발생하였다.

그래서 결국 기존에 저장된 데이터를 모두 백업한 뒤 서비스를 일시 정지하고 (정확히는 공사중 페이지로 Redirect 하였다) 사용자 데이터를 제외한 모든 데이터를 삭제한 뒤에 방화벽 설정을 변경한 뒤에 크롤러를 재가동시켰다.

이 과정에서 약 8시간 동안 서비스는 제공되지 못했고, 난 밤에 잠을 못잤다.

서비스 구동 과정에서 제대로 데이터가 저장되고 있는지 주기적으로 확인하고, 데이터에 이상은 없는지 확인하는 과정을 계속 수동으로 체크하는 과정을 거쳤다.

복구 완료

일단 지금은 복구가 99.98% 완료 되었다.

그 과정에서 손실된 0.02%의 데이터가 있지만 그건 어쩔 수 없기에.. 그냥 눈물을 머금기로 했다.

일단 꺼진 포트도 다시 봐야지 아니면 나처럼 주말에 쌩쇼를 할 수 있다는 점..

그리고 개인정보와 관련된 유출은 로그 확인 결과 없었다는 점..

이 과정에서 약 8시간 동안 서비스가 정지 되었다는 것과 파주에 놀러가서 이거 복구하느라 미쳐갔다는 것을..

뒷 이야기

그리고 나서 해커에게 이메일을 보내 보았다.

그러나 답장은 없었다.

그리고 이 해커는 한푼도 벌지 못했다 (이력을 확인해 보니 들어온 BTC가 하나도 없었다)