본문 바로가기
Security/보안가이드

[보안가이드] Nginx User-Agent 제한 설정 하기

by 선인장 🌵 2022. 4. 19.
728x90
728x90

Nginx User-Agent 제한 설정 하기

nginx를 이용하여 서비스 구동 시 해당 서비스에 여러 User-Agent(UA)로 접근이 된다.

이때 정상적으로 사용하는 사용자는 크게 상관이 없으나, 크롤러, 취약점 스캐너 혹은 공격 Tool 등을 이용하여 해당 서비스에 대해서 정보 수집을 하는 경우가 있다.

그런 경우 해당 서비스의 취약점 발견이 되거나 혹은 서비스 장애 등이 발생되어 현재 사용되는 서비스에 영향을 줄 수 있다.

Nginx에서는 이런 경우를 대비하기 위해 User-Agent 제한을 하거나 특정 User-Agent만 사용하도록 할 수 있다.

그럼 User-Agent 제한하는 방법에 대해서 한번 알아보도록 하자.

[보안가이드] Nginx User-Agent 제한 설정 하기

1. 서비스에 들어오는 User-Agent 확인 하기

우선 현재 우리 서비스에 들어오는 User-Agent가 어떻게 되는지 살펴보자.

살펴보기 위해서는 Access Log를 살펴보아야 한다. 

기본적인 Nginx Log 위치는 아래와 같으나, 설정에 따라 다를 수 있다. 

  • /var/log/nginx/access.log
# Log 설정 위치

$ vi /etc/nginx/nginx.conf

... 이하 생략 ...
error_log /var/log/nginx/error.log;

http {
    access_log  /var/log/nginx/access.log  main;
    
... 이하 생략 ...

해당 Log 위치에서 access.log를 보면 9번째 항목에 서비스에 접근한 User-Agent를 알 수 있다. 

# Access Log

192.168.0.28 - - [17/Apr/2022:22:12:56 +0900] "GET /test.html HTTP/1.1" 200 184 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15" "-"
728x90

2. User-Agent 제한 설정

Nginx의 기본 설정 파일인 nginx.conf 파일에 아래와 같이 설정하여 User-Agent(UA)에 대해서 제한을 설정할 수 있다.

기본 설정으로 사용하게 되면 User-Agent에 어떤 게 들어와도 정상적으로 서비스가 가능하다.

# 기본 설정

$ curl -i -X GET -H "User-Agent: paros" http://192.168.0.20/test.html
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 17 Apr 2022 13:51:07 GMT
... 이하 생략 ...


$ cat /var/log/nginx/access.log
192.168.0.28 - - [17/Apr/2022:22:51:07 +0900] "GET /test.html HTTP/1.1" 200 184 "-" "paros" "-"

2. User-Agent 제한 설정
2. User-Agent 제한 설정

현재 아래와 같이 적어 놓은 User-Agent는 일반적으로 많이 사용되는 취약점 스캐너, 공격 Tool에서 사용하는 User-Agent이다. 

  • grabber, cgichk, bsqlbf, sqlmap, nessus, arachni, metis, sql power injector, bilbo, absinthe, black widow, n-stealth, brutus, webtrends security analyzer, netsparker, python-httplib2, jaascois, pmafind, nsauditor, paros, dirbuster, pangolin, nmap nse, sqlninja, nikto, webinspect, blackwidow, grendel-scan, havij, w3af, hydra, ZmEu, openvas, Morfeus
 

Security Analyser User Agents

We have over 2,260 user agents for Security Analyser which you can browse and explore.

developers.whatismybrowser.com

그럼 이제 설정 후 테스트해보도록 하자.

해당 설정은 nginx.conf 파일 혹은 서비스 설정을 해놓은 conf 파일 내에서 server, location Context 부분 중 한 곳에 아래와 같이 설정 하자.

  • if ($http_user_agent ~* "Paros|ZmEu|nikto|dirbuster|sqlmap|openvas|w3af|Morfeus|Zollard|Arachni|Brutus|bsqlbf|Grendel-Scan|Havij|Hydra|N-Stealth|Netsparker|Pangolin|pmafind|webinspect") { return 404; }
# User-Agent 제한 설정

$ vi /etc/nginx/nginx.conf
... 이하 생략 ...
# User-Agent 제한
    if ($http_user_agent ~* "Paros|ZmEu|nikto|dirbuster|sqlmap|openvas|w3af|Morfeus|Zollard|Arachni|Brutus|bsqlbf|Grendel-Scan|Havij|Hydra|N-Stealth|Netsparker|Pangolin|pmafind|webinspect") {
        return 404;
    }


$ curl -i -X GET -H "User-Agent: paros" http://192.168.0.20/test.html
HTTP/1.1 404 Not Found
Server: nginx
Date: Sun, 17 Apr 2022 13:56:15 GMT
... 이하 생략 ...


$ cat /var/log/nginx/access.log
192.168.0.28 - - [17/Apr/2022:22:56:15 +0900] "GET /test.html HTTP/1.1" 404 162 "-" "paros" "-"

2. User-Agent 제한 설정
2. User-Agent 제한 설정

설정을 하고 나면 기본과 동일한 경우 설정에 포함된  User-Agent가 들어오게 되면 404 Not Found Error가 발생한다.

728x90

3. 특정 User-Agent 허용 설정

반대로 특정 User-Agent에 대해서만 설정하여 허용하는 방법도 있다.

이 방법은 어떻게 사용하느냐에 따라 다르겠지만, 가급적 Rest API 혹은 특정 서비스와 연동 등과 같이 특정 영역에서만 접근을 하는 경우에 허용 IP ACL과 같이 허용된 User-Agent를 통해서만 서비스가 되도록 할 때 사용하는 편이 좋을 것 같다.

# User-agent가 test가 아닌 경우, 접근 제한

$ vi /etc/nginx/nginx.conf
    if ($http_user_agent !~ "test") {
        return 404;
    }

# 미적용시
$ curl -i -X GET -H "User-Agent: test" http://test.com
HTTP/1.1 200 OK
Server: nginx
... 이하 생략 ...


# 적용시
$ curl -i -X POST -H "User-Agent: paros" http://test.com
HTTP/1.1 404 Not Found
Server: nginx
... 이하 생략 ...


$ cat /var/log/nginx/access.log
192.168.0.28 - - [17/Apr/2022:23:05:17 +0900] "GET /test.html HTTP/1.1" 404 162 "-" "paros" "-"
192.168.0.28 - - [17/Apr/2022:23:05:21 +0900] "GET / HTTP/1.1" 404 162 "-" "curl/7.79.1" "-"
192.168.0.28 - - [17/Apr/2022:23:05:25 +0900] "GET /test.html HTTP/1.1" 200 184 "-" "test" "-"

3. 특정 User-Agent 허용 설정
3. 특정 User-Agent 허용 설정

4. 정리

이제 쉽게 User-Agent 설정만을 통해서 서비스 접속에 대한 제한 / 허용 등을 하는 방법을 알아보았다.

설정하는 게 크게 어려움이 없기 때문에 가능하면 Nginx를 통해서 웹 서비스를 구축한다면 해당 내용을 잘 이용하여 처음부터 설정을 하고 사용할 수 있도록 하자.

물론 이 방법만으로는 모든 공격을 막아낼 수는 없지만, 그래도 정보수집 등과 같이 여러 취약점 도구 혹은 스캐너 등에서 무분별한 부분들은 차단이 가능함으로 조금이라도 공격에 대한 대비를 할 수 있을 것이다.

728x90
728x90


🌵댓글

 

loading