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

Last Updated on 1월 4, 2021 by 태랑(정현호)


* ModSecurity 내용은 아래쪽에 있습니다.


mod_cband는 트래픽 제어 및 트래픽 모니터링 제공



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





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


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



소스를 다운로드 받을 수 있는 주소는 아래와 같으나 소스를 수정해야 합니다.



원본 소스코드에서 수정하거나 수정해놓은 소스를 이용하는 방법 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  




Apache 2.4 에서는 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 파일을 열어서  
안의 내용을 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 
     =>  위와 같이 추가된 것을 확인할 수 있습니다.










cband 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 -> 사용자 페이지 입니다.








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

아래와 같이 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 등이며, 
이를 차단하는 웹 보안에 있어서 최소한의 보안을 해주는 Apache 모듈입니다.



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

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







필요 패키지 설치


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



지금 진행 하는 환경에서는 pcre 을 Source Compile 하여 설치 한 상태 입니다.
------------------------------------------------------------------------
wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.44/pcre-8.44.tar.gz
tar zxvf pcre-8.44.tar.gz
cd pcre-8.44/
./configure --prefix=/usr/local/pcre-8.44
make ; make install
------------------------------------------------------------------------







mod_security 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







Config 및 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 설정 변경 (httpd.conf)



httpd.conf 파일을 변경 합니다.



아래 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 모듈도 추가 해 줍니다.






ModSecurity 내용 추가

httpd.conf 파일에 내용을 추가 합니다.

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

아래 내용 추가 



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"







Mod_Security 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 로그 내역 

[root]# cd /usr/local/apache2.4/logs
[root]# tail -100f modsec_audit.log


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 설치 환경에 따라 다릅니다.








Mod_Security 추가 정보 - 기본 환경설정 및 지시자



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






관련된 글

Apache 악성 봇 차단 (SemrushBot)

Nginx 에 ModSecurity 설치 및 설정

답글 남기기