2022년 5월 1일 일요일

asp.net core 리퀘스트 빈도 제한하기

비밀번호 무차별 대입공격에 대한 정책이 보통은 웹서버에 할당되어 있는데

asp.net core도 iis위에 올라가면 그정책을 따라갈수 있다. 하지만 

그거는 iis express에 없다는거 nginx도 있기는 하지만 웹서버 정책에

따라가야하니까 땡이다..  아파치는 관심도 없구요.. (빨리 사라졌으면.. ㅋㅋ)

그래서 asp.net core는 초기설정 미들웨어에서 해당행위를 할수 있도록 nuget 패키지가 있다.

이름은 aspnetcoreratelimit 패키지 이다.

설치하고 다음을 따라간다.

--------------------------------------------------------

먼저 Startup.cs 에서 설정하는 2가지 메서드 ConfigureServices와 Configure 에서

ConfigureServices 가 먼저 불리므로 해당서비스를 올린다.

하단에 다음을 추가

//appsettings.json 사용
services.AddOptions();
//분석용메모리할당
services.AddMemoryCache();
//appseting.json에서 IP제한설정 읽어오기
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
//cache에 제한사항추가
services.AddInMemoryRateLimiting();            services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();


그다음 Configure 함수인데  !! 중요  다른설정보다 앞서서 다음을 호출 !!

app.UseIpRateLimiting();      // <--  리퀘스트 빈도제한 사용하기


이렇게 설정하고 이제 appsettings.json 에가서 다음규칙을 추가

"IpRateLimiting": {
    "EnableEndpointRateLimiting": true,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "QuotaExceededResponse": {
      "ContentType": "application/json",
      "Content": "자꾸이런식으로 할꺼야??"
    },
    "GeneralRules": [
      {
        "Endpoint": "*",
        "Period": "10s",
        "Limit": 20
      }
    ]
  }

자세한건 제작자 깃헙에 나와있지만 대충내용은 endpoint 기반으로 리퀘스트빈도를
제한하되 block된 요청을 일정시간이후에 재처리 안함으로하고
proxy가 있을수 있으니 실제 접속하는 ip를 기준으로 하고
속도제한 화이트리스트가 클라이언트 헤더에있다 (필요하면  화이트리스트 넣어라)
블록됬을때 응답 http status code는 429이고 
초과됬을때 application/json 타입으로 content에 있는 내용을 응답해라
(type지정 안하면 한글깨짐 그래도 깨지면 appsettings.json 파일을 텍스트편집기로
열어서 인코딩 타입을 UTF-8으로 변경하고 저장한다.) 

모든 Route에 적용하고 10초당 20회 요청만 처리해라

이다.

이외에도 그룹핑이나 화이트 리스트 특정메서드나 라우트에서만 동작 등등
세세한 설정도 가능하니 제작자 깃헙을 참조한다.
일단 나는 이정도만 있으면 어느정도의 공격을 차단할수 있다고 판단해서
깊게 들어가지 않음..  (몰라서 그런거라면.. 할말이..)

--------------------------------------------------------

제작자 깃허브

https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware#setup

댓글 없음:

댓글 쓰기