출처 : https://purehacking.com/portal/index.php?q=node/26

원제 : Virus Detection in ModSecurity


modsecurity & clamav를 이용한 업로드파일 검사를 이전에 포스팅 했었는데 이번엔 lua 스크립트를 이용한 방법을

소개합니다. 위에서 소개한 방법에서 perl 스크립트에서 lua 스크립트를 이용하고 apachesecurity.net에서 제공하는

blacklist를 이용, 바이러스를 업로드한 ip를 blacklist 처리하는 방식의 동작을 하게됩니다.


lua 스크립트를 이용하기 위한 modsecurity rule

  1. SecRule FILES_TMPNAMES "@inspectFile /opt/modsecurity/bin/modsec-clamscan.lua" 
  2. "phase:2,t:none,log,deny"


적용전 확인해야 될 사항

1. clamscan이 아닌 clamdscan을 이용함 ( clamdscan을 이용하면 이미 떠 있는 clamd 데몬에 접근을 하게 되어 매번

바이러스 검사시에 생길 수 있는 필요없는 부하를 줄일 수 있습니다)

2. clamav유저를 apache (웹서버) 그룹에 포함 시킴

3. SecUploadFileMode direction을 0640으로 설정해 그룹이 접근 가능하게 함

4. blacklist를 이용해 해당 ip를 일정시간 차단함


lua 스크립트의 내용은 아래와 같습니다.

  1. --[[
  2.   This script can be used to inspect uploaded files for viruses
  3.   via ClamAV. To implement, use with the following ModSecurity rule:

  4.   SecRule FILES_TMPNAMES "@inspectFile /opt/modsecurity/bin/modsec-clamscan.lua" 
  5. "phase:2,t:none,log,deny"

  6.   Author: Josh Amishav-Zlatin
  7.   Requires the clamav-daemon and liblua5.1-rex-pcre0 Debian packages (or other
  8.   OS equivalent)
  9. ]]--
  10.  
  11. function main(filename)
  12.   local rex = require "rex_pcre"
  13.   local remote_addr = m.getvar("REMOTE_ADDR"); -- Retrieve remote IP address
  14.  
  15.   -- Configure paths
  16.   local clamscan  = "/usr/bin/clamdscan"
  17.   local blacklist = "/opt/modsecurity/bin/blacklist"
  18.   local duration  = "3600"
  19.  
  20.   -- The system command we want to call
  21.   local cmd = clamscan .. " --stdout --disable-summary"
  22.  
  23.   -- Run the command and get the output
  24.   local f = io.popen(cmd .. " " .. filename)
  25.   local l = f:read("*a")
  26.   m.log(9, l)
  27.  
  28.   -- Check the output for the FOUND or ERROR strings which indicate
  29.   -- an issue we want to block access on
  30.   local isVuln = rex.match(l, "FOUND")
  31.   local isError = rex.match(l, "ERROR")
  32.  
  33.   if isVuln ~= nil then
  34.     local b = io.popen(blacklist .. " block " .. remote_addr .. " " ..  duration)
  35.     return "Virus Detected"
  36.   elseif isError ~= nil then 
  37.     return "Error Detected"
  38.   else
  39.     return nil
  40.   end
  41. end
  42.  

lua 스크립트를 불러오는 rule은 적절히 수정해 사용하시면 되겠습니다. 당연한 얘기지만 좀더 정확한 이해와 적용을

위해서는 원문을 꼭 읽어보시기를 권합니다.


기존의 perl 스크립트를 이용한 modsecurity & clamav를 이용한 업로드파일 검사와 어떤 차이점이 있는지

시간나는대로 테스트 해보고 결과(?)를 알려드리겠습니다 :)

1. 소개

이전에 작성한 ModSecurity와 iptables를 이용한 ip 차단는 다른 modsecurity 와 fain2ban을 이용한 방법입니다.

(물론 fail2ban 역시 iptable을 이용하지만 modsec2ipt를 이용한 방법보다는 적용이 쉽다고 볼 수 있습니다; )

modsecurity가 정상 작동하고 있고 fail2ban역시 잘 작동하는 전제가 만족해야겠죠?

원문 링크: http://www.fail2ban.org/wiki/index.php/HOWTO_fail2ban_with_ModSecurity2.5


이글의 내용은 좀더 많은 테스트가 필요합니다. 예외처리가 가능하신분만 테스트 해보시기 바랍니다.


2. 설정

 /etc/fail2ban/jail.conf  파일을 열어서 아래부분을 추가합니다.

[modsec]
enabled = true
filter = modsec
action = iptables-multiport[name=ModSec, port="http,https"]
logpath = /var/log/apache/modsec_audit.log
bantime = 172800
maxretry = 1

logpath의 경로는 사용중인 modsecurity의 auditlog경로로 수정해 사용해야 합니다.



/etc/filter.d 디렉토리에 modsec.conf 파일을 만들고 내용을 아래처럼 추가합니다.

# Fail2Ban configuration file
#
# Author: Florian Roth
[Definition]
failregex = [.*?]s[w-]*s<HOST>s
ignoreregex =



modsecurity log중 "01-06-2009 20:37:29 User.Notice 87.230.26.178 Jan 6 20:37:39 lvps87-230-26-178 modsec: [06/Jan/2009:20:37:39 +0100] ij99L1fmGrIAAC5Q8n0AAAAJ 78.42.79.31 12531 87.230.26.17 8" 와 같은 부분이 정규표현식에서

걸러지게 됩니다.


modsecurity 설정중 SecAuditLogRelevantStatus부분을 코멘트 처리해 404 error(file not found)를 남길 수 있는

무고한(?) 사용자들에 대한 예외처리를 해야합니다. 그렇지 않다면 단순 404 error만 내도 fail2ban에 의해 ip가 차단 되겠죠.


SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"

3. 중요 사항

관련링크 2에 있는 포스트중 Brian Rectanus의 글 내용입니다.


modsecurity 설정중  SecAuditLogType를 serial이 아닌 concurrent로 해야 매우 클 수도 있는 auditlog파일을 한줄씩

처리가 가능하다고 합니다. 또한  error log 아래의 로그와 같은 부분중 해당 ip를 걸러내는 방법도 있다고 합니다.

[Mon Aug 10 11:16:40 2009] [error] [client 1.2.3.4] ModSecurity: Access denied with code 403 (phase 2). 
Pattern match "bar" at ARGS:foo. [file "/path/to/httpd.conf"] [line "948"] [id "123456"] [hostname "red-dwarf"]
[uri "/cgi-bin/dump"] [unique_id "SoBkCH8AAQEAAFCuJY4AAAFA"]
"[client 1.2.3.4]" 부분이 해당 ip니 적절히(?) 이용하면 되겠습니다.



관련 링크:

1. http://www.fail2ban.org/wiki/index.php/HOWTO_fail2ban_with_ModSecurity2.5

2. http://sourceforge.net/mailarchive/forum.php?thread_name=4A819479.9010501%40breach.com&forum_name=mod-security-users

1. ModSecurity Core Rule Set (이하 CRS )이 OWASP Project에 공식 포함
각종 문서화, 개발에 적합해 프로젝트의 홈페이지를 이전하게 되었다고 합니다.
OWASP는 (the free and open application security community )의 약자로 각종 보안정보, 프로그램에 관한
방대한(?) 자료를 가지고 있습니다.

새로운 다운로드 링크:
http://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project#tab=Download

2. Mail-list for CRS
CRS만의 별도 메일링 리스트를 운영합니다.
가입링크 :
https://lists.owasp.org/mailman/listinfo/owasp-modsecurity-core-rule-set

3. CRS 변경점
가장 최근 버전은 2.0.1이고 큰 변화가 있었습니다.
anomaly scoring mode 관련 변경점:
http://sourceforge.net/projects/mod-security/files/modsecurity-crs/2.0.1/CHANGELOG/download

4. CRS
Rule Update Tracking
OWASP project 페이지가 안정화 될때까지 https://www.modsecurity.org/tracker/ 의 traker를 이용합니다.

출처 / 관련 링크 :
http://modsecurity.org/
https://lists.sourceforge.net/lists/listinfo/mod-security-users

출처 : http://spamcleaner.org/en/misc/flood-http-mod_security.html

원제 : HTTP DDoS/flood attacks mitigation with ModSecurity
ModSecurity를 이용한 HTTP DDoS/flood 공격 완화 (방어, 대응보다는 완화에 가깝겠네요)

 ModSecurity와 iptables를 이용한 ip 차단에서 다룬 modsec2ipt를 이용해 과도한 연결을 시도하는 IP를 drop
(modsecurity의 drop - tcp reset 및 iptables를 이용한 drop(packet drop)하는 방법에 대해 기술하고 있는 문서 입니다.


기존에 차단 rule이 이미 있다면 아래 rule을 먼저 적용해야(modsecurity는 rule을 순차 적용 합니다) DDOS변수로

빠져나가게 되는 일을 막을 수 있습니다. rule에 사용된 지시자의 설명은 링크로 대체합니다.

SecAction initcol:ip=%{REMOTE_ADDR},nolog

SecRule REQUEST_LINE "^GET (?:/|.+.html|.+.php|.+.cgi|.+.pl) HTTP"
"nolog,setvar:ip.ddos=+1,deprecatevar:ip.ddos=100/10"

SecRule IP:DDOS "@gt 50" "log,exec:/path_to/modsec2ipt.pl"
SecRule IP:DDOS "@gt 25" "nolog,drop"


간단한 설명은 아래를 참고하세요.

SecAction initcol:ip=%{REMOTE_ADDR},nolog
#지속연결 collection의 초기화를 위해 initcol을 사용. 같은 아이피에서의 요청 횟수를 측정,
#ip collection을 위한
DDOS변수를 생성하고 각연결마다 숫자를 증가시킴(+1)

SecRule REQUEST_LINE "^GET (?:/|.+.html|.+.php|.+.cgi|.+.pl) HTTP"
"nolog,setvar:ip.ddos=+1,deprecatevar:ip.ddos=100/10"
#HTTP요청중 'GET'이고 웹서버의 루트 디렉토리("/"), html,php,cgi,pl파일만 필터링에 포함시킴

SecRule IP:DDOS "@gt 50" "log,exec:/path_to/modsec2ipt.pl"
SecRule IP:DDOS "@gt 25" "nolog,drop"
#DDOS변수가 25보다 크면 drop( tcp reset)시키고 50이 넘으면 modsec2ipt.pl를 이용해 iptables의
#drop chain(packet drop)으로
해당 IP를 넘겨줌


주의점 : 

* windows용 ModSecurity는 drop action은 동작하지 않습니다.

* rule과 매치되는 상황은 nolog로 설정해 불필요하게 log파일이 커지는 것을 방지 하는것이 좋습니다.
   (log flood로 이어지는 상황이 발생할 수도 있습니다)

* REQUEST_LINE과 threshold limit는 해당 서버의 설정에 맞게 적절히 수정해 사용해야 합니다.

정확한 이해와 사용을 위해서는 꼭 원문을 읽어보시기를 권합니다.


gotroot.com에서 *ASL 사용자에게 제공하던 modsecurity rule updater를 일반에게 공개했습니다.


자세한 설치방법등은 아래링크에서 볼 수 있습니다.
http://www.atomicorp.com/wiki/index.php/Atomic_ModSecurity_Rules

gotroot rule을 적용해 사용하시는 분들은 알아서(?) 잘 사용하시겠지만 그대로 적용하기엔 위험부담(?)이 약간
있습니다. 그럴경우 아래링크에서 업데이트 될 rule파일을 받아 검토후 적용하시면 되겠습니다.

http://downloads.prometheus-group.com/delayed/rules/

이하 원문입니다.
------------------------------------------------------
Automatic Rule Updater (cache)

And the config file for the same:

Automatic Rule Updater Config file (cache)

Installation instructions are available here:

Installation Instructions (cache)

원문 링크 : http://gotroot.com/tiki-read_article.php?articleId=288

-------------------------------------------------------


참고링크 :
http://free4u.wo.tc/8550
* ASL - Atomic Secured Linux : http://www.prometheus-group.com/products/asl.html
 


+ Recent posts