ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MongoDB] DB 털림 (랜섬웨어)
    데이터베이스/Mongodb 2023. 3. 25. 18:32

     

    발견

    아침에 테스트 앱에서 데이터가 보이지 않았다. docker 컨테이너 문제인가 싶었으나, 확인해 보니 mongodb 컬렉션이 사라졌다. mongo db log를 확인해 보았다. dropDatabase..? 
     

    $ sudo docker logs mongodb -t --since 2023-03-23T20:30:00
    ...
    2023-03-23T22:42:37.906849231Z {"t":{"$date":"2023-03-23T22:42:37.906+00:00"},"s":"I",  "c":"COMMAND",  "id":20337,   "ctx":"conn1746","msg":"dropDatabase - starting","attr":{"db":"READ__ME_TO_RECOVER_YOUR_DATA"}}
    2023-03-23T22:42:37.907014406Z {"t":{"$date":"2023-03-23T22:42:37.906+00:00"},"s":"I",  "c":"COMMAND",  "id":20338,   "ctx":"conn1746","msg":"dropDatabase - dropping collection","attr":{"db":"READ__ME_TO_RECOVER_YOUR_DATA","namespace":"READ__ME_TO_RECOVER_YOUR_DATA.README"}}
    ...


    로그에 기록된 READ__ME 뭐시기를 확인했다.

    데이터 넣은지 삼일 만에 랜섬웨어 때문에 DB 컬렉션이 날아갔다. 개발 진행 중이라는 핑계로 보안적인 측면 신경 쓰지 않고 작업 진행한 내 잘못이다. 별거 없는 나부랭이 DB를 털어가다니... 이번 일을 통해 해킹은 상대를 가리지 않고 시도 때도 없이 발생하는 걸 체감하였다. 백업도 안 했기 때문에 데이터 복구할 방법은 없다 (개발 진행 중인 상태인걸 위안 삼아야 할지 🥲). 데이터는 버리기로 하고 이런 일이 발생한 원인과 예방 및 대응책을 정리했다.
     

    원인

    1. 모든 IP에서 AWS EC2 인스턴스에 접근할 수 있도록 허용했다.
    2. Mongo DB를 설치하고 계정 설정을 기본값으로 놔두었다. 권한 설정이 안되어있었기 때문에 누구나 DB 접근이 가능했다.

     

    대응

    피해 입은 인스턴스를 그대로 사용하기는 찝찝하여 이를 버리고 새 인스턴스를 생성했다.
     
    1. 생성한 인스턴스 보안 설정
    EC2 인스턴스 > 보안그룹 > 인바운드 규칙 편집에서 특정 IP에서만 접근할 수 있도록 특정하고 포트 번호를 설정한다. 외부에서는 핫스팟으로 인터넷을 연결하고, 그때마다 인바운드 규칙을 수정하기로 했다. (귀찮으므로 하루빨리 VPN 적용을 해야겠다...)
     
    2. 몽고 db 계정 설정
    docker compose를 통해 mogodb 계정 세팅하기로 했다. 우선 패키지부터 설치한다.

    $sudo apt install docker-compose

     
    그 다음 docker compose.yml 파일 작성.

    version: '3.0'
    services:
      mongodb:
        image: mongo
        # 컨테이너 실행시 재시작
        restart: always
        # 컨테이너명
        container_name: mongodb
        # 포트번호 설정
        ports:
           - "<컨테이너 외부 포트>:<컨테이너 내부 포트>"
        command: [--auth]
        environment:
           MONGO_INITDB_ROOT_USERNAME: <ROOT USER>
           MONGO_INITDB_ROOT_PASSWORD: <ROOT USER PASSWORD>
        volumes:
           - ./data/mongodb:/data/db

     
    docker-compose.yml에 설정된 내용 토대로 컨테이너 실행

    $ sudo docker-compose up -d

     
    어드민 계정과 별개로 쓰기/읽기 권한이 있는 유저 계정도 생성한다.

    use <db name>
    db.createUser(
      {
        user: "<user name>",
        pwd: "<user password>",
        roles:[
          {
            role: "readWrite",
            db: "<db name>"
          }
        ]
      }
    );

    이렇게 계정을 생성한 뒤에도 계정 입력을 하지 않고서 DB에 접속은 가능하다. 하지만 계정 입력을 안 했기 때문에 이전과 달리 DB에 큰 영향을 끼치는 명령어는 수행할 수 없다. 터미널에서 DB에 접속하기 위한 명령어는 다음과 같다.

     $ mongosh --port <포트번호> --authenticationDatabase <디비명> -u <계정명> -p
     $ password: <패스워드>

     
     

    추후 해야할 것

    1. vpn 설정
    2. 데이터 백업 설정

     
     


    참고 자료

     

    댓글

jaejade's blog ٩( ᐛ )و