
개인 프로젝트 용도로 PostgreSQL을 Docker 환경에 올려두었습니다.
그런데 어느날 서버의 CPU 이용률이 300%까지 치솟으면서 굉음을 일으켰습니다.
로그를 확인해보니
...
2024-07-22 19:30:01.081 KST [7815] DETAIL: Connection matched file "/var/lib/postgresql/data/pg_hba.conf" line 128: "host all all all scram-sha-256"
2024-07-22 19:30:01.583 KST [7816] FATAL: password authentication failed for user "postgres"
2024-07-22 19:30:01.583 KST [7816] DETAIL: Connection matched file "/var/lib/postgresql/data/pg_hba.conf" line 128: "host all all all scram-sha-256"
2024-07-22 19:30:02.003 KST [7817] FATAL: password authentication failed for user "postgres"
...
무수히 많은 접속 시도가 일어나고 있는 것을 확인할 수 있었고,
공부하면서 들어보기만 했던 무차별 대입 공격(brute force attack)을 당하고 있음을 인지하였습니다.
이를 대처하기 위해서 진행 했던 방법들을 정리해보겠습니다.
일반적으로 잘 알려진 포트를 대상으로 공격이 이루어지는 경우가 많기 때문에 우선 외부 접속 포트를 변경하였습니다.
아래는 기존 데이터를 유지하면서 PostgreSQL 컨테이너의 포트를 변경하는 방법입니다.
docker stop <container-name>
docker rm <container-name>
docker run --name <container-name> -e POSTGRES_PASSWORD=<password> -d -p <외부 접속 포트>:5432 -v <볼륨 마운트 위치> postgres:latest
Fail2Ban을 사용하여 비정상적인 로그인 시도를 제한할 수 있습니다.
sudo apt-get install fail2ban
/etc/fail2ban/jail.local 파일에 PostgreSQL 관련 설정을 추가합니다.
[postgresql]
enabled = true
port = <외부 접속 포트>
filter = postgresql
logpath = <postgresql 로그 파일 경로>
maxretry = 3
/etc/fail2ban/filter.d/postgresql.conf 파일을 생성하고 다음 내용을 추가합니다.
[Definition]
failregex = .*FATAL: password authentication failed for user .* \[host=.*\]
ignoreregex =
Fail2Ban 서비스를 재시작합니다.
sudo systemctl restart fail2ban
이와 같은 설정을 통해 Docker 환경에서 PostgreSQL 서버를 보다 안전하게 운영할 수 있습니다.