개발하다가 DB 랜섬웨어 걸린썰...FEAT(Z_README_TO_RECOVER)

MinSeoCho·2022년 9월 25일
1

TIL

목록 보기
5/5

평화로운 주말... 나는 원래 controller에 자세한 설명과 여러 예외를 던질수 있게끔 코드를 수정할 생각이었음... 갑자기 팀원에게 db가 안된다는 말을 듣기전까진...


일단 들었을땐 그냥 어제 내가 nginx 설정으로 http로 들어오는 애들은 https로 바꾸게끔 설정을 해둬서 그럴거라 생각을 하여... proxy_pass설정을 하고 알려줬다..

(솔직히 이 문제도 없진 않았지 않을까 하고 nginx 알못이 쓴다)

그래서 nginx를 설정해주고 확인해줄 수 있어? 라 했는데... 여전히 아니라고 하기에...
db container 에 접속을 하고 나서...

스샷을 못찍었네...

Z_README_TO_RECOVER 이라는 스키마를 발견... 리서치를 해본 결과... 랜섬웨어라고 했다...걸린이유는

1. port 번호를 3306 그대로 설정했다.

2. root user의 비밀번호를 1234로 해뒀다.

3. 랜섬웨어는 아니지만 데이터를 못살린 이유 : dump를 안해뒀다. (volume만 설정했다..ㅠㅠ)

해결 방법

0. 그전에 할일

docker strop mariadb
docker rm mariadb
docker prune volume

#volume은 생성하지 않으면 임의로 생성되는데 그렇게 하기 싫어서...
docker volume create DB

#volume의 정보는
docker inspect DB

1. port 번호 바꾸기 & 비밀번호 수정

기존의 docker container 는

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -v mariadb:/var/lib/mysql --name mariadb mariadb:10.6

#docker container 정보는
docker inspect mariadb

이렇게 port 번호 3306 에 비밀번호 1234 였다...
후엔 다른 port 번호와 다른 비번으로 바꾸고 시도를 진행하였다..

실제 데이터는 아니지만 예시로

docker run -d -p 7777:3306 -e MYSQL_ROOT_PASSWORD=afdafasfd23324-v mariadb:/var/lib/mysql --name mariadb mariadb:10.6

이런식으로 바꾸어 주었다.

2. volume 설정 뿐 아니라 script & crontab을 이용하여 백업 설정

일단 설명하기 앞서 대부분의 내용은 아래의 블로그를 따라하여 작성하였습니다.

https://jsmun.com/97

# backup을 저장하기 위한 디렉토리 생성
sudo mkdir backup/
sudo mkdir backup/database

#스크립트
sudo vi /backup/DB.sh


#스크립트 내용
echo "============= 5일 지난 데이터 삭제 시작 ============="
# 5일이 지난건 지워버림
DEL_FILE=`date -d "-5 days" +%Y%m%d`


# 아래와 같이 작성한 이유는 나같은 경우는 crontab 을 2번하게 하였기 때문에
rm -rf /backup/database/*mysql_bak_dev_${DEL_FILE}*.sql
echo "============= 5일 지난 데이터 삭제 완료 ============="

echo "============= 변수 할당 시작 ============="
 DATE=`date +"%Y%m%d_%H%M"` # 나는 하루에 2번해서 구분하기 위해
 USER="{DB 접속계정}" # ex) USER="root"
 PASSWORD="{DB 계정의 비번}" # ex) PASSWORD="1234"
 DATABASE="{접속해야하는 database 이름}" # ex) DATABASE="data" 
 CONTAINER="{docker container 이름}" #ex) CONTAINER="mariadb"
 OUTPUT_PATH="/backup/database/mysql_bak_${DATABASE}_${DATE}.sql"
echo "============= 변수 할당 완료 ============="


echo "============= Database 백업 시작 ============="
 docker exec ${CONTAINER} /usr/bin/mysqldump -u${USER} -p${PASSWORD}  ${DATABASE} > ${OUTPUT_PATH}
 chown root.root  ${OUTPUT_PATH}
 chmod 755  ${OUTPUT_PATH}
echo "============= Database 백업 완료 ============="

# esc 누르고 :wq

#크론 잡 생성

#sudo crontab -e

#맨아래에

{원하는 분 : 0~59} {내가 원하는 시 : 0~23} {원하는 일 : 1~31} {원하는 월 : 1~12} {원하는 요일 : 0~7}

#ex) 30 17 * * * bash /backup/DB.sh
#ex) 30 00 * * * bash /backup/DB.sh
# 뜻은 매일 오후 5시 반에 backup/DB.sh 을 실행해주세요.
# 뜻은 매일 오전 12시 반에 backup/DB.sh 을 실행해주세요.
# 그리고 ctrl + x 저장하고 싶으면 y를 누르고 저장되는 파일 이름을 확인 후 enter를 누르면 저장된다.  

#=> 이렇게 하는 이유
# GNN nano로 열어서...

service crond restart

# 반영결과 확인
crontab -l

이렇게 설정을 하면 되는데.. 일단 나같은경우는 잘 백업이 되는지 확인이 하고 싶었음..
그래서 실행을 해봄

sudo sh /backup/DB.sh

#그리고 생성된 내용은
cat /backup/database/mysql_bak_dev_20220925_0723.sql 이렇게 해서 확인했다.
cat /{저장된 디렉토리들 루트서부터}/../../{실제 파일명}.sql


아래와 같이 잘 생성이 된걸 확인할 수 있다.

오늘의 결론

DB를 노출할때는 port번호와... 비번 조심...
솔직히 docker로 해둬서 다행인거 같기도 하고 아닌거 같기도 하고..
결론은...

내가 현실직장에서 친 사고가 아니라서 다행이다!

백업은 될수 있음 하루에 한번은 해두자...

profile
열심히 하자..!

1개의 댓글

comment-user-thumbnail
2025년 2월 17일

이번에 프로젝트 진행하면서 데이터베이스에 비트코인 내놓으라고 당했네요...
열심히 해결방법 알아야겠어요 ㅜㅜ

답글 달기