NGINX를 사용해 해외 IP 차단하기(서버 보안)

Arthur·2023년 10월 23일
1
post-thumbnail

작성하게 된 계기


게임 개발 프로젝트를 진행하면서 집에 남는 노트북에 우분투를 설치해 Rest API 서버를 직접 돌렸었습니다.
ASP.NET CORE를 사용 했는데 Nginx를 사용해서 외부 포트 80로 두고 내부 서버(5000번 포트)로 Request를 받도록 하는 했습니다.

Nginx는 프록시 용도로 사용했습니다.

하지만 여기서 문제가 발생했습니다.

접속을 시도하는 유저의 로그를 확인해보니 해킹 시도가 있었던 것입니다.
뒤 늦게 조치를 취하고 큰 피해를 받지는 않았습니다.

이번에 보안에 대한 큰 교훈을 얻고 이렇게 글로 작성하게 되었습니다.


❗❗ Ubuntu 20.04 기준으로 작성한 글입니다. 각 환경에 따라 세팅 값이 다를 수 있습니다. ❗❗



로그에 남겨진 해킹 시도


다행이도 유저의 접근과 에러에 대해 로그를 유지하고 있었습니다.

위 사진에서 밑에서 두 번째 202310/22 00:02:11 시간대의 로그를 보면, /boaform/admin/formLogin 이라고 적혀있습니다.

해당 내용을 구글에 검색해보니 해당 접근이 RCE 취약점 공격 중 하나라는 것을 알게되었습니다.
(boaform/admin/formlogin RCE 취약점 공격)

RCE(Remote Code Execution)은 원격코드 실행 명령어를 뜻합니다.
명령어를 통해 악의적인 코드를 실행시키고 특정 라우터를 봇넷으로 감염시켜 디도스(DDoS) 공격을 수행시킵니다.

이 공격은 무차별적으로 쏘아보낸 값 중 얻어걸린 라우터가 있으면 거기에 접속하는 해킹 방식이라고 합니다.

그렇다면 이 문제를 해결하는 방법은 무엇이 있을까 생각해봤습니다.



Nginx 해외 IP 차단


제가 배포를 하고 테스트 하는 서버는 해외의 접속을 허용할 필요가 없습니다.
그래서 가장 설정하기 쉽고 간편한 방법인 해외 IP를 전부 차단하는 방법을 적용하게 되었습니다.

차단하는 방법은 NGINX GeoIP를 사용하는 것입니다.
GeoIP는 데이터베이스로 나라에 대한 주소를 저장되어 이

  1. nginx에서 GeoIP 설정이 가능한지 확인

nginx -V
명령어를 입력해서 --with-http_geoip_module 이라는 값이 있는지 확인합니다.

없으면 아래의 명령어를 입력해서 설치합니다.

$ sudo apt install libnginx-mod-http-geoip geoip-database

  1. GeoIP.dat 파일이 있는지 확인

/usr/share/GeoIP 경로에 GeoIP.dat 파일이 있는지 확인합니다.

없으면 아래의 명령어를 입력해서 다운로드 받습니다.

$ sudo mkdir /usr/share/GeoIP
$ cd /usr/share/GeoIP
$ sudo wget https://centminmod.com/centminmodparts/geoip-legacy/GeoIP.dat.gz
$ sudo gunzip GeoIP.dat.gz

Nginx GeoIP모듈과 IP주소와 국가를 매핑해주는 geoip-database를 설치합니다.

$ sudo apt install libnginx-mod-http-geoip geoip-database
  1. nginx.conf에 GeoIP 설정 추가

sudo vi /etc/nginx/nginx.conf
명령어 창에 위와 같이 입력하고 http에 아래의 세팅 값을 입력해줍니다.
(꼭 vi로 수정하실 필요는 없고 다른 방법이 있으면 다른 방식으로 수정하셔도 괜찬습니다.)

http {
	
    # GeoIP Setting
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
    	default no;
        KR yes;
    }

	# .... 생략 ....

위와 같이 입력을 해주고 우선 문법이나 문제가 없는지 확인하기 위해

sudo nginx -t

를 입력해서 sysntax(문법) 혹은 다른 문제가 없는지 확인합니다.

그 다음에 NGINX를 다시 시작해주면 끝입니다.

  • sudo systemctl restart nginx
  • sudo service nginx restart
    • restart는 서버를 내리고 다시 사작하게 됩니다.
  • nginx -s reload
    • reload는 서버가 중단되지 않고 설정 파일만 불러와 다시 적용합니다.

위 명령어 중 하나를 입력 하시면 nginx가 다시 시작됩니다.

이 방법은 상당히 간단한 방법입니다.
다른 방법으로는 GeoIP 데이터를 새로 받아서 IP를 최신화 하는 것도 있다고 합니다.



작성하면서 느낀 점


보안적인 요소를 크게 고려하지 않고 있었는데, 갑자기 이런 문제가 발생했습니다.
초기에 발견해서 그나마 빠르게 조치를 할 수 있었습니다.

이번에 제일 깨달은 것들은

  • 서버를 배포하는 순간 해킹과 같은 공격에 노출된다.
  • 로그를 꼭 남겨서 문제가 있는 지점을 확인하자.
    • 저는 access.log와 error.log를 통해 해킹 위험을 확인했습니다.
  • 보안에 대한 문제는 최소한의 세팅은 꼭 하거나 대비를 하자.

이번 기회에 많은 교훈을 얻고 배울 수 있는 좋은 기회였습니다.



참고 자료


  • Nginx 해외서버 차단방법 => 링크
  • Nginx GeoIP 해외 IP 차단하기 => 링크
  • GeoIP Block NGINX Ubuntu 20.04 => 링크
  • boaform/admin/formlogin RCE 취약점 공격 => 링크
  • boaform? => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글