Last Updated on 1월 4, 2021 by 태랑(정현호)
* ModSecurity 내용은 아래쪽에 있습니다.
mod_cband는 트래픽 제어 및 트래픽 모니터링 제공
mod_cband 는 Apache 웹 서버에서 트래픽 제어 및 트래픽 모니터링 기능을 제공 합니다.
여러개의 웹사이트를 운영하거나 웹호스팅 환경에서 도메인이나 유저가 얼만큼의 트래픽을 사용하는지 파악하거나 제한하기 위해서 사용됩니다.
도메인,사용자별,가상호스트별 트래픽 모니터링 및 대역폭 제한, 사용량 모니터링 등의 기능을 제공 합니다.
소스를 다운로드 받을 수 있는 주소는 아래와 같으나 소스를 수정해야 합니다.
원본 소스코드에서 수정하거나 수정해놓은 소스를 이용하는 방법 2가지중 선택하시면 됩니다
( 수정코드 다운 )
원본 소스 코드 다운 로드
https://fossies.org/linux/www/apache_httpd_modules/old/mod-cband-0.9.7.5.tgz
설치
[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
<Location /cband-status>
<Location /cband-me>
cband-status -> 관리자 페이지 입니다.
따라서 위와 같이 접근을 허용할 IP를 입력하거나 .htapasswd 를 통해서 접근제어가 필요 합니다.
.htpasswd 를 이용하여 ID/PW를 입력받아 접속을 제한 할수 있습니다.
아래와 같이 Auth 인자 값을 추가 합니다.
Require all denied
.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:(패스워드 입력)
Adding password for user admin
패스워드 까지 만들어졌다면 아파치를 재시작 후 접속 해보면 ID/PW를 확인하는 창이 나오는 것을 확인 할 수 있습니다.
* Require all granted 같이 사용 할수 없음
* Auth 인자 옵션 사용시 Require all denied 을 사용해야함
cband 트래픽 설정 방법
설정 방법 1
설정 방법 2
(트래픽 공유)
<CBandUser abc>
Apache 압축전송( mod_deflate )
mod_deflate 는 웹 서버에서 출력하는 텍스트 컨텐츠를 압축하는 모듈로 입니다.
아파치 압축전송을 사용하게 되면 트레픽을 줄일뿐 아니라 실행속도도 향상시킬수 있습니다.

웹 방화벽 - ModSecurity 설치
ModSecurity 는 Apache 와 Nginx, IIS 등에서 사용 가능하며, 가장 널리 알려져 있는 http, https 서비스를 이용한 공격을 효과적으로 차단할 수 있는 웹 방화벽입니다.
공격의 종류로는 XSS, SQL Injection, Command Execute 등이며,
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
crs-setup.conf 파일 수정
[root]# vit crs-setup.conf
#SecDefaultAction "phase:1,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) 시킨다.
2) SecAuditEngine On | Off | RelevantOnly
그리고SecAuditLogRelevantStatus에 정의 된 상태코드와 일치하는 트랜젝션만 로깅
4) SecAuditLogParts
로그 파일에 기록할 항목을 정의한다. 예) SecAuditLogParts ABCFHZ
A audit log header (필수)
6) SecAuditLogType Serial | Concurrent 감사로깅 구조의 타입을 설정한다.
하나의 파일에만 기록되기 때문에 느려질 수 있다.
이 방식은 로그파일을 원격 ModSecurity Console host로 보낼 때 사용하는 방식이다.
7) SecDefaultAction "log, auditlog, deny, status:403, phase:2, t:lowercase"
룰이 매칭되면 기본적으로 취할 행동을 정의한다 룰이 특정 액션들에 대한 개별 룰을
위의 예는 룰이 매칭 되었을 때 차단하며 로그를 남기고, 403 상태코드 페이페이지를 보여주며 필터링 단계는 “2”이다.
기본적으로 대문자는 모두 소문자로 바뀌어 필터링 된다.
Request 값에서 Body 부분에 대한 처리를 어떻게 할 것인지 구성한다.
o On : RequestBody 접근을 시도한다.
POST값을 필터링하기 위해서는phase:2와 REQUESET_BODY 변수/로케이션, 3가지가 모두 구성되어야만 처리가 가능
Response 값에서 Body 부분에 대한 처리를 어떻게 할 것인지 구성한다.
o On : ResponseBody 접근을 시도한다. (그러나 MIME 타입과 일치해야만 한다.)
10) SecResponseBodyLimit
ModSecurity가 Response Body 크기로 할당할 수 있는 메모리 최대 크기를 설정한다.
11) SecReponseBodyMimeType mime/type
ResponseBody의 버퍼링을 위해 Mime 타입의 목록을 지우며, 처음에 위치시킨다.
관련된 글
Apache 악성 봇 차단 (SemrushBot)

Nginx 에 ModSecurity 설치 및 설정

Senior DBA(Mysql, Oracle) - 현재 위메프에서 많은 새로움을 경험중입니다
At WeMakePrice / Previous - Oracle Korea ACS Support / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io