요즘 회사 서버에 악의적인 접근이 많아졌다. ( https://yiunsr.tistory.com/938 )

우선 flask-limiter (https://flask-limiter.readthedocs.io/en/stable/) 라는 것을 도입했다. 너무 많이 로그인을 시도하다 실패하는 경우 10분 동안 로그인 시도 자체를 제한하도록 설정했다.
 누군가 회사 사이트를 이메일/password 를 검증하는 형태로 사용중 인 것 같다. 해커가 여러 사이트에서 이메일을 수집하고 이 이메일을 회사 사이트에 로그인 시도해가면서  brute force 로 로그인을 시도해서 하나 얻어 걸리길 바라는 것 같다. 일반적으로 사람들은 여러 사이트에서 동일한 패스워드를 사용하는 경향이 있기 때문에 이러한 짓을 시도하는 것 같다.  회사 서버가 이런 일에 이용당하지 않도록 여러번 로그인 실패하는 경우 로그인 시도 자체를 제한 시켰다. 

 그리고 지속적으로 특정 URL 이 있는지 검사하는 공격들이 끊임 없이 들어 온다. 공격을 안 당한다고 해도 트래픽에 너무 부담이 되어서 IP 마다 트래픽을 제한하도록 설정했다. 이 것을 위해 limit_req (https://nginx.org/en/docs/http/ngx_http_limit_req_module.html ) 을 설정했다. 이것을 사용해서 짧은 시간에 너무 많은 트래픽을 요청하면 http code 429 에러를 자동으로 발생시켜준다. 

여기서 끝나면 좋겠지만 알수 없는 녀석이 계속 IP를 변경해 가면서 지속적으로 이상한 이름으로 회원가입을 하는 녀석이 나타났다. 이 녀석은 6시간의 주기를 가지고 계속 회원가입을 해서 앞에서 설정한 제한을 통과해서 동작했다. 도대체 무슨 의도인지 알 수 없으나 지속적으로 의미없는 이름으로 회원가입을 했다. 이 녀석을 막기 위해 많이 알아봤는데 이 IP 가 어떤 클라우드 회사의 IP 대역임을 알아냈다. 그래서 네트워크 자체를 차단하려고 방법을 찾았다. 일반사용자가 VPN을 사용하지 않는 한 클라우드 서비스의 IP를 가질 수는 없다.  (물론 내 회사 서비스가 다른 서버의 webhook 을 받기 때문에 막을 때 조심하긴 해야 한다. )

그래서 찾아보니 https://github.com/leev/ngx_http_geoip2_module  을 이용하면 ASN (https://www.cloudflare.com/ko-kr/learning/network-layer/what-is-an-autonomous-system/ ) 단위로 차단할 수 있다는 것을 알게되었다. 
https://github.com/leev/ngx_http_geoip2_module 대해 인터넷에 찾아보면 country 에 대한 예제만 많고 ASN을 막는 예제는 없는데 https://github.com/search?q=repo%3Aleev%2Fngx_http_geoip2_module+asn&type=issues 에 있는 것들을 찾아서 알아냈다. 

기존 country 를 막는 세팅에다 다음과 같이 asn 설정을 추가 할 수 있다. 

............

http {
	............

	geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
	    auto_reload 24h;
	    $geoip2_metadata_country_build metadata build_epoch;
	    $geoip2_data_country_code country iso_code;
	    $geoip2_data_country_name country names en;
	}
	geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb{
	    auto_reload 24h;
	    $geoip2_asn autonomous_system_number;
	}
	fastcgi_param COUNTRY_CODE $geoip2_data_country_code;
	fastcgi_param COUNTRY_NAME $geoip2_data_country_name;
	fastcgi_param ASN $geoip2_asn;
	
	
	map $geoip2_asn $geoip2_allowed_asn {
	    default yes;
	    # Servers Tech Fzco
	    216071 no;
	
	    # Hosting technology LTD
	    48282 no;
	
	    # OVH SAS
	    16276 no;
	
	    # IONOS SE
	    8560 no;
	}
	
		............
}
..........

 

여기서 끝나면 좋겠지만 또 다른 것들을 학습하고 있다. 공격을 시도하는  ip 를 공유하는 서비스들이 있다. 이 ip를 매일 다운받고 해당 ip를 막는 방법을 찾아보고 있다. 아직 이러한 방식이 효율적인지 의심이되고 너무 많은 ip를 막으면 이거 검사하는게 더 걸린 것 같다는 생각이 들어서 방법을 계속 찾고 있다. 

이놈의 녀셕들 때문에 의도치않게 내 서버관리 능력이 향상되는 것 같다.