apache2 mod_security 설치 및 테스트

apache2 mod_security 설치 및 테스트

ModSecurity의 주요 특징은 다음과 같다.
o 요청(request) 필터링
– 클라이언트로부터 웹 요청이 들어올 때, 웹서버 또는 다른 모듈들이 처리하기 전에 ModSecurity가 요청 내용을 분석하여 필터링한다.
o 우회 방지 기술
– 경로와 파라미터를 분석하기 전에 정규화시켜 우회 공격을 차단한다.
– 즉, “//”, “\/”, “.”, “%00” 등 우회 공격용 스트링을 제거하고, 인코딩된 URL을 디코딩한다.
o HTTP 프로토콜 이해
– 엔진이 HTTP 프로토콜을 이해하기 때문에 전문적이고 정밀한 필터링을 수행할 수 있다.
o POST 페이로드(payload) 분석
– GET 방식 뿐만 아니라 POST 메소드를 사용해서 전송되는 컨텐츠도 분석 가능하다.
o 감사 로깅
– POST를 포함하여 모든 요청의 모든 상세한 부분들까지 추후 분석을 위해서 로깅될 수 있다.
– ModSecurity에서 차단기능을 비활성화 시킨 후, 강력한 로깅 기능만으로 침입탐지 시스템 역할을 수행할 수 있도록 한다.
o HTTPS 필터링
– 엔진은 웹서버에 임베디드되어 있기 때문에 복호화 한 후에 요청 데이터에 접근하여 HTTPS를 통한 공격도 필터링할 수 있다.

설치 환경
ubuntu 12.04 LTS 64bit
apache2_mod_security_1

1. apache2 설치.

$ sudo apt-get install apache2

2. PHP5 설치

$ sudo apt-get install php5

3. Mysql 설치

$ sudo apt-get install mysql-server mysql-client

4. PHP5 와 Mysql 연동을 위한 설치

$ sudo apt-get install php5-mysql

phpinfo() 으로 설치된 환경 확인.
apache2_mod_security_2

자 그럼 이제 mod_security를 설치해보자.

5. 필요 라이브러리 설치

$ sudo apt-get install libxml2 libxml2-dev libxml2-utils libaprutil1 libaprutil1-dev

6. 64 Bit 사용자 일 경우 아래와 같이 링크를 걸어준다.

$ sudo ln -s /usr/lib/x86_64-linux-gnu/libxml2.so.2 /usr/lib/libxml2.so.2

7. mod-security 설치

$ sudo apt-get install libapache-mod-security

다시 phpinfo() 으로 정상적으로 설치 되었는지 확인.
apache2_mod_security_3

mod_security2가 정상적으로 load 된것을 확인할수 있다.

8. 취약한 테스트 페이지 만들기.

Sql injection에 취약한 로그인페이지를 하나 만들어서 테스트 하자.

먼저 mysql 에 DB와 table를 만들고 계정도 하나 생성하자.

mysql -u root -p 
create database sample;
connect sample;
create table users(username VARCHAR(100),password VARCHAR(100));
insert into users values('apollo89','logintest');
quit;

먼저 테스트를 위한 login.php 를 만들자.

<html>
<body>
<?php
    if(isset($_POST['login']))
    {
        $username = $_POST['username'];
        $password = $_POST['password'];
        $con = mysqli_connect('localhost','root','password','sample');
        $result = mysqli_query($con, "SELECT * FROM `users` WHERE username='$username' AND password='$password'");
        if(mysqli_num_rows($result) == 0)
            echo 'Invalid username or password';
        else
            echo '<h1>Logged in</h1><p>A Secret for you....</p>';
    }
    else
    {
?>
        <form action="" method="post">
            Username: <input type="text" name="username"/><br />
            Password: <input type="password" name="password"/><br />
            <input type="submit" name="login" value="Login"/>
        </form>
<?php
    }
?>
</body>
</html>

apache2_mod_security_4

apollo89 / logintest를 넣어 로그인하니, 정상적으로 로그인이 되었다.

이번에는 username에 ‘ or 1=1 — 넣어 sql injection 공격을 시도했더니..
공격이 성공되어 정상적으로 로그인이 되었다.

9. mod-security rule 설정

기본설정을 복사한다.

$ sudo cp /etc/modsecurity/modsecurity.conf-recommended  /etc/modsecurity/modsecurity.conf

/etc/modsecurity/modsecurity.conf 에서 아래 부분을 변경한다.

SecRuleEngine DetectionOnly -> SecRuleEngine On
SecAuditEngine RelevantOnly -> SecAuditEngine On

/etc/apache2/mods-enabled/mod-security.conf 에서 아래의 부분을 추가한다.

$ cat /etc/apache2/mods-enabled/mod-security.conf
<IfModule security2_module>
	SecDataDir /var/cache/modsecurity
	Include "/etc/modsecurity/*.conf"
	Include "/usr/share/modsecurity-crs/*.conf"
	Include "/usr/share/modsecurity-crs/activated_rules/*.conf"
</IfModule>

/usr/share/modsecurity-crs/activated_rules 디텍토리를 생성하고 활성화 시킬 rule를 복사한다.

$ ls -la
total 56
drwxr-xr-x   8 root root  4096 Nov 26 17:22 .
drwxr-xr-x 276 root root 12288 Nov 26 16:15 ..
drwxr-xr-x   2 root root  4096 Nov 26 17:24 base_rules
drwxr-xr-x   2 root root  4096 Nov 26 16:15 experimental_rules
drwxr-xr-x   2 root root  4096 Nov 26 16:15 lua
-rw-r--r--   1 root root 12667 Jun 16  2011 modsecurity_crs_10_config.conf
drwxr-xr-x   2 root root  4096 Nov 26 16:15 optional_rules
drwxr-xr-x   3 root root  4096 Nov 26 16:15 util
$ sudomkdir /usr/share/modsecurity-crs/activated_rules
$ cd activated_rules
$ sudo ln -s /usr/share/modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf .
$ sudo ln -s /usr/share/modsecurity-crs/base_rules/modsecurity_41_sql_injection_attacks.data .
$ ls
modsecurity_41_sql_injection_attacks.data
modsecurity_crs_41_sql_injection_attacks.conf
$ sudo service apache2 restart
[sudo] password for apollo89: 
 * Restarting web server apache2  ... waiting                   [ OK ]

이제 다시 login.php 으로 접속해보자.

apollo89 / logintest를 넣어 로그인하니, 정상적으로 로그인이 되었다.

username에 ‘ or 1=1 — 넣어 sql injection 공격을 시도했더니..
에러가 뜨며 차단이 되었다.

윈도우의 경우 APMsetup 을 이용하여 설치했으며,
APMsetup7 버전에는 modsecurity2 가 포함되어있다.

설치후 httpd.conf설정 파일(C:\APM_Setup\Server\Apache\conf\httpd.conf )에서
#Include conf/extra/httpd-modsecurity.conf 부분의 주석을 제거하면 된다.

설정방법은 위와 동일하다.

참고 : https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_security-with-apache-on-debian-ubuntu

This entry was posted in Security/Hacking and tagged , . Bookmark the permalink.

One Response to apache2 mod_security 설치 및 테스트

댓글 남기기