Apache 2.4 에 mod_cband 와 웹 방화벽 ModSecurity 추가

Share

Last Updated on 3월 23, 2023 by Jade(정현호)


안녕하세요
이번 포스팅은 Apache 2.4 버전에 mod_cband 와 ModSecurity 추가에 대해서 확인해보도록 하겠습니다.

Mod_cband

mod_cband 는 Apache 웹 서버에서 트래픽 제어 및 트래픽 모니터링 기능을 제공 합니다.





여러개의 웹사이트를 운영하거나 웹호스팅 환경에서 도메인이나 유저가 얼만큼의 트래픽을 사용하는지 파악하거나 제한하기 위해서 사용됩니다.

도메인,사용자별,가상호스트별 트래픽 모니터링 및 대역폭 제한, 사용량 모니터링 등의 기능을 제공 합니다.


mod_cband 다운로드

소스를 다운로드 받을 수 있는 주소는 아래와 같으며, 소스코드 일부의 수정이 필요 합니다. 원본 소스코드에서 수정하거나 수정해놓은 소스를 이용하는 방법 2가지중 선택하시면 됩니다



( 수정코드 다운 )

OR

원본 소스 코드 다운 로드

https://fossies.org/linux/www/apache_httpd_modules/old/mod-cband-0.9.7.5.tgz


설치

[root]# tar xvzf mod-cband-0.9.7.5.tgz
[root]# cd mod-cband-0.9.7.5

[root]# ./configure --with-apxs=/usr/local/apache2.4/bin/apxs

다운로드 받은 소스코드 수정 없이 make 를 하게 되면 아래와 같이 에러가 발생됩니다

src/mod_cband.c: In function 'mod_cband_create_traffic_size':
src/mod_cband.c:1054: warning: comparison with string literal results in unspecified behavior
src/mod_cband.c:1054: warning: comparison with string literal results in unspecified behavior
src/mod_cband.c:1058: warning: comparison with string literal results in unspecified behavior
src/mod_cband.c:1058: warning: comparison with string literal results in unspecified behavior
src/mod_cband.c: In function 'mod_cband_get_dst':
src/mod_cband.c:1333: error: 'conn_rec' has no member named 'remote_ip'
src/mod_cband.c: In function 'mod_cband_get_remote_host':
src/mod_cband.c:1362: error: 'struct conn_rec' has no member named 'remote_ip'
src/mod_cband.c:1363: error: 'struct conn_rec' has no member named 'remote_ip'
src/mod_cband.c:1365: error: 'struct conn_rec' has no member named 'remote_addr'
apxs:Error: Command failed with rc=65536
make: *** [src/.libs/mod_cband.so] Error 1


mod-cband-0.9.7.5/src/mod_cband.c 파일을 vi 나 다른 편집기를 통해서 파일 안의 내용을 remote_ip 에서 client_ip 로 변경 하고, remote_addr 을 client_addr 로 변경 하고 compile(make)을 진행 하면 됩니다.

또는 수정된 코드를 다운로드 받아서 사용하시면 됩니다


빌드 및 설치


[root]# make ; make install


make 까지 완료 되었다면 모듈이 존재 하는지 확인 합니다.

[root]# cd /usr/local/apache2.4/modules/
[root]# ls -al mod_cband.so


httpd.conf 파일을 확인해 보면
LoadModulecband_module modules/mod_cband.so
=> 위와 같이 추가된 것을 확인할 수 있습니다.


band status 설정

아래와 같이 /cband-status 와 /cband-me 를 설정 합니다.

## cband status Page
<IfModule mod_cband.c>

<Location /cband-status>
SetHandler cband-status
Require all denied
Require ip 123.123.123.123
</Location>

<Location /cband-me>
SetHandler cband-status-me
Order deny,allow
Deny from all
Allow from all
</Location>

</IfModule>

※ SetHandler 설명
cband-status -> 관리자 페이지 입니다.
따라서 위와 같이 접근을 허용할 IP를 입력하거나 .htapasswd 를 통해서 접근제어가 필요 합니다.

cband-me -> 사용자 페이지 입니다.


Apache Auth 설정

.htpasswd 를 이용하여 ID/PW를 입력받아 접속을 제한 할수 있습니다.


Auth 인자 추가

아래와 같이 Auth 인자 값을 추가 합니다.


<IfModule mod_cband.c>

<Location /cband-status>
SetHandler cband-status
AuthName "cband Admin Page"
AuthType Basic
AuthUserFile /site/cband/.htpasswd
require valid-user
Require all denied
</Location>

<Location /cband-me>
SetHandler cband-status-me
Order deny,allow
Deny from all
Allow from all
</Location>

</IfModule>



.htpasswd 파일 생성

[root]# mkdir -p /site/cband
* 경로는 예시 입니다.


생성은 apache 디렉토리에 있는 htpasswd 를 사용 합니다

ID는 admin 으로 생성하는 예시 입니다.


[root]# cd /usr/local/apache2.4/bin

[root]# ./htpasswd -c /site/cband/.htpasswd admin
New password:(패스워드 입력)
Re-type new password:(패스워드 입력)
Adding password for user admin


패스워드 까지 만들어졌다면 아파치를 재시작 후 접속 해보면 ID/PW를 확인하는 창이 나오는 것을 확인 할 수 있습니다.




* Require all granted 같이 사용 할수 없음
* Auth 인자 옵션 사용시 Require all denied 을 사용해야함


cband 트래픽 설정 방법

설정 방법 1

아래와 같이 virtualhost 별로 설정 할수 있습니다.

<VirtualHost *:80>
DocumentRoot "웹 소스 위치"
ServerName 도메인주소
CBandLimit 300M # 허용 트래픽 양
CBandPeriod 1D # 몇 일간 적용할 것인지, 1일간 적용
CBandExceededURL http://도메인/error.html
<= 차단될 시 보여질 페이지
</VirtualHost>



설정 방법 2

※ 하나의 유저(abc) 혹은 도메인이 여러개의 서브 도메인을 사용하고 있는 경우
(트래픽 공유)

<CBandUser abc>
CBandUserLimit 100Mi
CBandUserPeriod 1D
</CBandUser>

<VirtualHost 192.168.0.1>
ServerName abc.com
ServerAlias www.abc.com
DocumentRoot /home/abc/public_html
ErrorLog logs/abc-err
CustomLog logs/abc-acc combined
CBandUser abc
</VirtualHost>


<VirtualHost 192.168.0.1>
ServerName abc2.com
ServerAlias www.abc2.com
DocumentRoot /home/abc2/public_html
ErrorLog logs/abc2-err
CustomLog logs/abc2-acc combined
CBandUser abc
</VirtualHost>



Apache 압축 전송(mod_deflate)

mod_deflate 는 웹 서버에서 출력하는 텍스트 컨텐츠를 압축하는 모듈로 입니다.

아파치 압축전송을 사용하게 되면 트레픽을 줄일뿐 아니라 실행속도도 향상시킬수 있습니다.

이전에 포스팅한 내용이 있어서 별도로 포스팅 대신에 위의 링크를 참조하시면 됩니다.
현재 포스팅에서 아파치 구성시 같이 구성 하였습니다.



웹 방화벽 - ModSecurity

ModSecurity 는 Apache 와 Nginx, IIS 등에서 사용 가능하며, 가장 널리 알려져 있는 http, https 서비스를 이용한 공격을 효과적으로 차단할 수 있는 웹 방화벽입니다.

공격의 종류로는 XSS, SQL Injection, Command Execute 등이며, 이를 차단하는 웹 보안에 있어서 최소한의 보안을 해주는 WAF 모듈입니다.

6년 전에 포스팅한 내용은 버전의 차이가 커서 갱신하기 보다는 여기에 새로운 버전으로 다시 기재 합니다.

참고) 예전 버전글 : https://hoing.io/126


선행 필요 패키지 설치

[root]# yum install -y pcre-devel libxml2-devel gcc


지금 진행 하는 포스팅 환경에서는 pcre 을 Source Compile 하여 설치 한 상태 입니다.

[root]# wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.44/pcre-8.44.tar.gz
[root]# tar zxvf pcre-8.44.tar.gz
[root]# cd pcre-8.44/

[root]# ./configure --prefix=/usr/local/pcre-8.44
[root]# make ; make install



ModSecurity 설치

포스팅 시점에서 설치된 버전은 2.9.3 입니다(2020.07 확인되는 버전)


파일 다운로드 및 압축 해제

[root]# mkdir -p /root/pkg
[root]# cd /root/pkg

[root]# wget https://www.modsecurity.org/tarball/2.9.3/modsecurity-2.9.3.tar.gz

[root]# tar zxvf modsecurity-2.9.3.tar.gz
[root]# cd modsecurity-2.9.3/apache2

* 경로는 임의의 경로 입니다.


Configure 및 Build 실행

[root]# ./configure --with-apxs=/usr/local/apache2.4/bin/apxs \
--with-pcre=/usr/local/pcre-8.44 \
--with-apr=/usr/local/apr-1.7.0/bin/apr-1-config \
--with-apu=/usr/local/apr-util-1.6.1/bin/apu-1-config


[root]# make; make install



Apache 설정 변경

Apache 의 httpd.conf 파일을 수정 합니다.


1) 아래 3개 Module 내용을 추가합니다.

LoadFile /usr/lib64/libxml2.so   
  <== mod_security 보다 먼저 Load 되어야 합니다


LoadModule unique_id_module   modules/mod_unique_id.so  
   <==mod_unique_id 도 필요합니다


LoadModule security2_module modules/mod_security2.so
   <== mod_security 모듈도 추가 합니다.



2) ModSecurity 내용을 추가 합니다

Include conf/modsecurity.conf

SecAction "id:900110,phase:1,pass,nolog,\
setvar:tx.inbound_anomaly_score_threshold=10000,\
setvar:tx.outbound_anomaly_score_threshold=10000"

SecAction "id:900000,phase:1,pass,nolog,\
setvar:tx.paranoia_level=1"



ModSecurity Core Rule Set 설정

관련 사이트

https://owasp.org/www-project-modsecurity-core-rule-set/
https://coreruleset.org/installation/


Core Rule Set 파일 다운로드

[root]# cd /usr/local/apache2.4/conf
[root]# wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
[root]# tar -xvzf v3.3.0.tar.gz

[root]# cd coreruleset-3.3.0
[root]# cp crs-setup.conf.example crs-setup.conf



crs-setup.conf 파일 수정

[root]# vit crs-setup.conf


중간에 아래의 SecDefaultAction 를 주석처리 하고 (96~97라인)

#SecDefaultAction "phase:1,log,auditlog,pass"
#SecDefaultAction "phase:2,log,auditlog,pass



더 아래에 403 정책이 추가된 SecDefaultAction 을 주석을 해제합니다.
116~117 라인

SecDefaultAction "phase:1,log,auditlog,deny,status:403"
SecDefaultAction "phase:2,log,auditlog,deny,status:403"



unicode.mapping 파일 복사

unicode.mapping 파일은 처음에 다운로드 받은 ModSecurity 디렉토리에 있습니다.

[root]# cd /root/pkg/modsecurity-2.9.3/

[root]# cp unicode.mapping /usr/local/apache2.4/conf/coreruleset-3.3.0



modsecurity.conf 파일 생성

[root]# cd /usr/local/apache2.4/conf/
[root]# vi modsecurity.conf



-- 아래 내용 추가


# === ModSec Core Rule Set Base Configuration
Include conf/coreruleset-3.3.0/crs-setup.conf


# === ModSecurity Core Rule Set Inclusion
Include conf/coreruleset-3.3.0/rules/*.conf

SecRuleEngine On
SecAuditEngine On
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLog /usr/local/apache2.4/logs/modsec_audit.log
SecUnicodeMapFile coreruleset-3.3.0/unicode.mapping 20127
SecAuditLogType Serial
SecAuditLogParts ABCFHZ
SecDataDir /tmp
SecStatusEngine On



Apache 재시작 및 룰셋 적용 확인

아파치 재시작 후 룰셋이 적용이 잘되는 지를 확인 합니다.


아파치 재시작

[root]# systemctl restart httpd



룰셋 적용 확인

브라우저에 아래와 같이 입력하여 접속을 시도 합니다.


http://IP주소/?a=<script>Test</script>

룰셋이 정상 적용된다면 아래와 같이 403 에러가 발생되게 됩니다





Audit 로그 내역

설정한 로그 디렉토리에서 ModSecurity 로그를 확인 합니다.

[root]# cd /usr/local/apache2.4/logs

[root]# tail -100f modsec_audit.log


403 에러 로그 내역

Message: Access denied with code 403 (phase 2). 
Pattern match "(?i)<script[^>]*>[\\s\\S]*?" at
REQUEST_HEADERS:Referer. 
[file "REQUEST-941-APPLICATION-ATTACK-XSS.conf"] 

<중략..>

[data "Matched Data: <script> found within REQUEST_HEADERS:Referer: 
http://IP주소/?a=<script>Test</script>"] 

[severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [tag "application-multi"] 

[tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"]

[client PC_IP_주소] ModSecurity: Access denied with code 403 (phase 2).

Pattern match "(?i)<script[^>]*>
[\\\\\\\\s\\\\\\\\S]*?" at REQUEST_HEADERS:Referer

[data "Matched Data: <script> found within 

REQUEST_HEADERS:Referer: http://IP주소/?a=<script>Test</script>"]

* SecAuditLog 경로는 Apache 설치 환경에 따라 다릅니다.



ModSecurity 추가 정보

ModSecurity 의 기본 환경설정 및 지시자에 대한 설명 입니다.


1) SecRuleEngine On | Off | DetectionOnly

ModSecurity 기능을 활성화(enable) 시킨다.
o On : ModSecurity 기능 활성화
o Off : ModSecurity 기능 비활성화
o DetectionOnly : 활성화는 하지만 차단하지 않고 탐지만 한다.



2) SecAuditEngine On | Off | RelevantOnly

감사 로깅에 대한 설정을 구성한다.
o On : 모든 트랜젝션 로깅
o Off : 모든 트랜젝션 로깅하지 않음
o RelevantOnly : Error 또는, Warning 의 트랜젝션
그리고SecAuditLogRelevantStatus에 정의 된 상태코드와 일치하는 트랜젝션만 로깅



3) SecAuditLog logs/modsec_audit.log

감사 로그 파일의 경로를 정의한다.
예) SecAuditLog /usr/local/apache2/logs/modsec_audit.log



4) SecAuditLogParts

로그 파일에 기록할 항목을 정의한다. 예) SecAuditLogParts ABCFHZ

A audit log header (필수)
B request header
C request body (request body가 존재하고 modsecurity가 request body를 검사하도록 설정되어 있는 경우에만)
D 보류중, response header의 중개 (현재 지원 안 됨)
E response body 중간 단계
(현재 modsecurity가 response body를 검사하며 감사로깅 엔진이 이를 저장하게끔 설정되어 있는 경우에만)
F 최종 response header
(마지막 컨텐츠 전달 과정에서 아파치에 의해 매번 추가 되는 날짜와 서버 헤더를 제외한)
G 실제 response body(현재 지원 안됨)
H 감사 로그 트레일러
I 이 옵션은 C를 대체하는 옵션이다. multipart/form-data 인코딩이 사용되었을때를 제외한
모든 경우엔 C와 같은 데이터를 기록한다.
J 보류중, multipart/form-data 인코딩을 사용하는 파일 업로드에 대한 정보를 포함할 때 효과가 있다.
Z 로그의 끝을 의미한다. (필수)



5) SecAuditLogRelevantStatus REGEX

감사로깅의 목적과 관련된 response 상태코드의 값을 설정한다.

o 매개변수에는 정규표현식이 들어간다.
예) SecAuditLogRelevantStatus ^[45]



6) SecAuditLogType Serial | Concurrent

감사 로깅 구조의 타입을 설정한다.
o Serial - 모든 로그는 메인 로그파일에 저장된다. 일시적으로 편리할 순 있지만
하나의 파일에만 기록되기 때문에 느려질 수 있다.
o Concurrent - 로그가 각 트랜잭션 별로 나누어 저장된다.
이 방식은 로그파일을 원격 ModSecurity Console host로 보낼 때 사용하는 방식이다.



7) SecDefaultAction

"log, auditlog, deny, status:403, phase:2, t:lowercase"
룰이 매칭되면 기본적으로 취할 행동을 정의한다 룰이 특정 액션들에 대한 개별 룰을
적용하거나 다른 SecDefaultAction이 정의되어있지 않다면 최초 지정된 SecDefaultAction의 설정을 따른다.

위의 예는 룰이 매칭 되었을 때 차단하며 로그를 남기고, 403 상태코드 페이페이지를 보여주며 필터링 단계는 “2”이다.

기본적으로 대문자는 모두 소문자로 바뀌어 필터링 된다.



8) SecRequestBodyAccess On | Off

Request 값에서 Body 부분에 대한 처리를 어떻게 할 것인지 구성한다.
o On : RequestBody 접근을 시도한다.
o Off : RequestBody 접근시도를 하지 않는다.
이 지시자는 Request 값에서의 POST_PAYLOAD를 검사할 때 필요하다.
POST값을 필터링하기 위해서는phase:2와 REQUESET_BODY 변수/로케이션, 3가지가 모두 구성되어야만 처리가 가능



9) SecReponseBodyAccess On | Off

Response 값에서 Body 부분에 대한 처리를 어떻게 할 것인지 구성한다.
o On : ResponseBody 접근을 시도한다. (그러나 MIME 타입과 일치해야만 한다.)
o Off : ResponseBody 접근시도를 하지 않는다.
이 지시자는 html 응답을 조사하기 위해 필요하다. "phase:4"의 처리 단계와 RESPONSE_BODY 변수/로케이션,
3가지가 설정되어 있지 않으면, response body를 검사할 수 없다.



10) SecResponseBodyLimit

ModSecurity가 Response Body 크기로 할당할 수 있는 메모리 최대 크기를 설정한다.
o SecRequestBodyLimit 524228
이 값을 넘어가면 서버는 500 내부 서버 오류 메시지만 표시할 것이다.



11) SecReponseBodyMimeType mime/type

Response 값에서 Body 값을 버퍼링할 MIME 타입을 설정한다.
o SecResponseBodyMimeType text/plain text/html // 기본값
Mime 타입은 복수로 추가할 수 있다.



12) SecReponseBodyMimeTypesClear

ResponseBody의 버퍼링을 위해 Mime 타입의 목록을 지우며, 처음에 위치시킨다.
o SecResponseBodyMimeType



연관된 다른 글

 

 

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x