웹 서버 운영 시 보안 취약점(파일 변조, 정보 노출 등)을 방지하기 위해 GET, POST를 제외한 불필요한 HTTP Method(PUT, DELETE, TRACE, OPTIONS)를 차단하는 방법을 정리합니다. IBM HTTP Server(Apache) 설정과 WAS(web.xml) 설정 두 가지 방식을 다룹니다.
0. 배경 지식 (Context)
기본적으로 웹 서버는 다양한 HTTP Method를 지원하지만, 실제 서비스에서는 대부분 GET과 POST만 사용합니다. 불필요한 메소드를 열어둘 경우 다음과 같은 보안 위험이 있습니다.
- PUT, DELETE: 악의적인 사용자가 서버의 파일을 생성, 수정, 삭제할 수 있음.
- TRACE: XST(Cross-Site Tracing) 공격에 악용되어 쿠키/세션 정보가 탈취될 수 있음.
- OPTIONS: 서버가 지원하는 메소드 정보를 노출함.
Test Environment
- OS: CentOS 7.2
- Web Server: IBM HTTP Server v8.5 (Apache 2.2 Base)
1. Web Server 레벨 차단 (httpd.conf)
가장 앞단의 웹 서버에서 원천 차단하는 것이 리소스 낭비를 막고 안전합니다. 두 가지 방법 중 하나를 선택하여 적용하십시오.
Method A: LimitExcept 지시어 사용 (권장)
특정 디렉토리나 URL 패턴에 대해 허용할 메소드를 정의하고 나머지는 거부하는 방식입니다.
# 1. 특정 디렉토리 기준 차단
<Directory "/WAS/htdocs">
Options FollowSymLinks
AllowOverride None
# GET, POST를 제외한 모든 메소드 거부
<LimitExcept GET POST>
Order allow,deny
Deny from all
</LimitExcept>
</Directory>
# 2. 전역(URL) 기준 차단 (Directory 설정이 모호할 때)
<Location "/*">
<LimitExcept GET POST>
Order allow,deny
Deny from all
</LimitExcept>
</Location>
버전별 문법 주의 (Note):
IHS v8.5(Apache 2.2)는
IHS v8.5(Apache 2.2)는
Order/Deny를 사용하지만, IHS v9.0(Apache 2.4) 이상에서는 Require all denied 문법을 사용해야 합니다.
Method B: Mod_Rewrite 사용
mod_rewrite 모듈을 사용하여 메소드 조건을 검사하고 강제로 에러 코드를 반환하는 방식입니다.
LoadModule rewrite_module modules/mod_rewrite.so
<IfModule mod_rewrite.c>
RewriteEngine On
# 조건: 요청 메소드가 GET 또는 POST가 아니라면
RewriteCond %{REQUEST_METHOD} !^(GET|POST)
# 규칙: 405 (Method Not Allowed) 에러 반환
RewriteRule .* - [R=405,L]
</IfModule>
2. WAS 레벨 차단 (web.xml)
웹 서버 설정이 불가능하거나, 애플리케이션(WAR) 단위로 제어가 필요한 경우 표준 배포 서술자(web.xml)를 사용합니다.
설정 방법
web.xml에 security-constraint를 추가하여 특정 메소드에 대한 접근을 제한합니다.
<security-constraint>
<web-resource-collection>
<web-resource-name>Restricted Methods</web-resource-name>
<url-pattern>/*</url-pattern>
<!-- 차단할 메소드 명시 -->
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>TRACE</http-method>
<http-method>OPTIONS</http-method>
<http-method>HEAD</http-method>
</web-resource-collection>
<!-- 중요: auth-constraint를 비워두면 누구에게도 권한을 주지 않음(차단) -->
<auth-constraint />
</security-constraint>
3. 검증 (Verification)
설정 적용 후 반드시 테스트를 통해 차단 여부를 확인해야 합니다. telnet 또는 curl을 사용합니다.
Telnet을 이용한 테스트
$ telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
# OPTIONS 메소드 요청 입력
OPTIONS / HTTP/1.0
Host: localhost
(엔터 두 번)
# 결과 확인 (403 Forbidden 또는 405 Method Not Allowed 확인)
HTTP/1.1 403 Forbidden
Date: Wed, 04 Jul 2018 01:44:40 GMT
...
Curl을 이용한 테스트 (간편)
# -X 옵션으로 메소드 지정, -I 옵션으로 헤더만 확인
curl -v -X OPTIONS http://localhost/
# 결과: < HTTP/1.1 403 Forbidden 확인
Next Step:
메소드 차단 외에도 ServerTokens Prod 설정을 통해 헤더에 노출되는 웹 서버 버전 정보를 숨기는 보안 조치를 추가로 검토해 보시기 바랍니다.