백엔드

[DB 해킹] MySQL DB 털린 썰 풉니다 (RECOVER_YOUR_DATA)

KyuminKim 2024. 12. 23. 20:51

배경

프로젝트 수행 중, 팀원의 알림을 받았다!

 

🙋‍♀️프론트엔드에서 API 요청 날렸는데, 에러가 뜨네요 ~ 

 

EC2에 평화롭게 접속해 서버 로그를 확인하니..

DB에 문제가 있는 것을 발견했다

 

mysql에 접속해 로그를 살펴보니

없다!

DataBase가 없다!

 


DB 해킹

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| RECOVER_YOUR_DATA  |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

 

RECOVER_YOUR_DATA 가 뭐지? 

 

mysql> use RECOVER_YOUR_DATA;
mysql> select * from RECOVER_YOUR_DATA;

+--------------------------------------------------------------------------------------+
| text                                                                                 |
+--------------------------------------------------------------------------------------+
| All your data is backed up.                                                          |
| You must pay 0.0084 BTC to bc1qnalw529tvk33ltttn5sjww6s8q5szppl79a868                |
| In 48 hours, your data will be publicly disclosed and deleted.                       |
| (more information: go to https://is.gd/yotuqu) |                                     |
| After payment send mail to us: dzen+22wlf@onionmail.org                              | 
| and we will provide a link for you to download your data.                            | 
| Your DBCODE is: 22WLF                                                                |
+--------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

 

🤷‍♀️ 비트코인 ? 디코드 ? 

그렇다 .............. 해킹당한 것이다 ....


대처

1. DB 해킹된 이유

1. root 계정, 비밀번호 1234 사용 (개발 진행중)

2. DB가 모든 IP에 대해 열려있다 

 

2. 개발환경

  • AWS EC2 (Amazon Linux 2023)
  • MySQL (Version 14.14)
  • Docker (Server Version  25.0.6)

 

3. 대처

(0. 최대한 빠른 팀원에게의 알림)

🙇‍♀️죄송합니다 프론트엔드분들 .... 빨리 서버 복구하겠습니다

 

다행히 개발 진행 중이었고, release도 나오지 않았다.

DB에는 테스트 더미 데이터만 존재했다 

(정말, 정말 다행이다.)

 

 

1. DB 완전삭제 이후 재설치

다른 블로거의 글을 참고해 MySQL을 완전삭제했다.

$ yum remove -y mysql-community-*
$ rm -rf /var/lib/mysql
$ rpm -e mysql80-community-release

$ find / -name 'mysql*rpm' # 삭제할 파일
$ rm -fr (바로 위에 찾은 파일 경로)

 

 

2. MySQL에 접속 IP 제한 (외부 접속 x)

EC2에서만 MySQL이 접속 가능하도록, 즉 내부 접속만을 허용해주었다.

 

보안그룹은 외부 접속에 대한 규칙이므로

3306 포트 (0.0.0.0) 를 삭제했다!

보안그룹 중 3306 포트 (MySQL) 삭제

 

 

3. DB 비밀번호 수정

Strong한 비밀번호를 설정해주었다.

$ mysql -u root -p 

SET GLOBAL validate_password_policy = 'STRONG';
SET GLOBAL validate_password_length = 16;
SET GLOBAL validate_password_mixed_case_count = 2;
SET GLOBAL validate_password_number_count = 2;
SET GLOBAL validate_password_special_char_count = 2;

ALTER USER 'root'@'localhost' IDENTIFIED BY '(비밀번호)';

 

16자 이상, 대소문자 2자 이상, 숫자 2자 이상, 특수문자 2자 이상으로 설정해,

다시 비밀번호를 설정할 때에도 복잡하게 하도록 설정했다.


여담

아쉽다. 비슷한 블로그를 보니

침착하게

var/log/mysql/error.log를 통해 로그를 확인하고, 어떤 IP에서 접속했는지 확인했어야 했다.

 

해당 블로그를 더 살펴보니

$ mysqlbinlog /var/lib/mysql/binlog.0* > binlog.sql

명령어로 MySQL 서버 기록을 복구할 수 있다고 한다!

(흥미롭다)

 

 

또,

개발 진행 중이니, 간단한 비밀번호를 설정해 편하게 썼었다. (1234)

아뿔싸, IP, Port를 열어두었다면 반드시 보안을 신경써야 겠다고 반성했다.

 

DB 백업이나, DB 암호화도 고려해 DB에 대한 더 많은 보안 요소를 고려하고

백엔드 코드에서도 보안 요소를 고려해봐야겠다!


참고자료

CentOS MySQL 완전삭제 https://heeseong.co.kr/entry/CentOS7-mysql-80-완전-삭제

 

비슷한 문제를 겪은 블로그 https://hyotatofrappuccino.tistory.com/49