요즘 회사 서버에 악의적인 접근이 많아졌다. ( 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를 막으면 이거 검사하는게 더 걸린 것 같다는 생각이 들어서 방법을 계속 찾고 있다. 

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

<template>
    <div>
        <label ref="vueLabelRef">여기<label>
        <v-label  ref="vuetifyLabelRef">
    </div>
</template>

<script setup>
import { ref } from 'vue';

const vueLabelRef = ref(null);
const vuetifyLabelRef = ref(null);
</script>
  •  일반적인 vue3 에서 ref 로 연결된 elemet 에 대해  순수한 javascript element 접근하려면 vueLabelRef.value 이다.
  • 그런데 vuetify3 컴포넌트라면 vuetifyLabelRef.value.$el 을 해야 한다.

전에 나도 모르게 $el 코드를 많이 사용했었는데, 이런 차이가 있는 것을 오늘이야 정확히 알게 되었다. 

 따로 코딩 전용 AI를 사용한 것은 아닌데, 그냥 구글 gemini 를 통해 Rust 프로그램을 작성했다. 

어느 정도는 분명히 도움을 받았으나 생각했던 것 처럼 유용하지 않았다. 내가 회사에서 구글 gemini 를 통해 python pandas 를 했을 때 엄청 도움을 받았기 때문에 이번에도 큰 도움이 될 것이라고 생각했다. 그런다 어느 정도 확실히 한계가 느껴졌다. 

 이 이유는 분명하다. 내가 하려는 것이 다른 누구도 해 본적 없는 일이기 때문이다. 내가 회사에서 했던 pandas 의 경우 다른 누군가가 많이 했던 일이 었을 것이다. 그래서 인터넷에 그 사용예가 매우 많을 것이다. 그런데 내가 이 번 휴일 동안 했던 일은 누군가도 해 본적 없는 독특한 일이 었을것이다. 
 
 내가 이번에 하려고 했던 것은 rust tauri 를 이용해서 PC용과 안드로이드 앱을 만들기 였다. 그리고 그 앱은 오픈스트리트맵 데이터를 이용해서 오프라인 지도 앱을 만들려고 했다. 이를 위해 우선 osm.pbf 을 파싱해서 렌더링 하려는 일을 하려고 했다. 그런데 Rust 로 이런일을 하려는 라이브러리 자체가 부족했다. 그리고 그 예가 거의 없었다. 

  코딩 전용 AI 가 아니라서 가능한 unittest 단위의 함수를 작성하려고 했다. 분명히 어느 정도 도움을 받기도 했으나 내가 Rust 에 익숙하지 않다보니 한계가 있었다. 그리고 너무 많이 배경지식이 필요한지라 AI에게도 좀 버거웠나 보다.
 코딩 전용 AI 였으면 에러가 발생하면 자기스스로 알아서 고쳤을련지도 모르겠다. 그리고 하필 AI가 추전하는 라이브러리들이 하나같이 매뉴얼이 부족하고 사용예가 적은 거라서 인간인 나도 검색으로 해결할 수 없었다. 

아직은 AI가 복잡한 프로그램을 만들기에는 한계가 있나보다.