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
1. apache2 설치.
1 |
$ sudo apt-get install apache2 |
2. PHP5 설치
1 |
$ sudo apt-get install php5 |
3. Mysql 설치
1 |
$ sudo apt-get install mysql-server mysql-client |
4. PHP5 와 Mysql 연동을 위한 설치
1 |
$ sudo apt-get install php5-mysql |
phpinfo() 으로 설치된 환경 확인.
자 그럼 이제 mod_security를 설치해보자.
5. 필요 라이브러리 설치
1 |
$ sudo apt-get install libxml2 libxml2-dev libxml2-utils libaprutil1 libaprutil1-dev |
6. 64 Bit 사용자 일 경우 아래와 같이 링크를 걸어준다.
1 |
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libxml2.so.2 /usr/lib/libxml2.so.2 |
7. mod-security 설치
1 |
$ sudo apt-get install libapache-mod-security |
다시 phpinfo() 으로 정상적으로 설치 되었는지 확인.
mod_security2가 정상적으로 load 된것을 확인할수 있다.
8. 취약한 테스트 페이지 만들기.
Sql injection에 취약한 로그인페이지를 하나 만들어서 테스트 하자.
먼저 mysql 에 DB와 table를 만들고 계정도 하나 생성하자.
1 2 3 4 5 6 |
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 를 만들자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<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> |
apollo89 / logintest를 넣어 로그인하니, 정상적으로 로그인이 되었다.
이번에는 username에 ‘ or 1=1 — 넣어 sql injection 공격을 시도했더니..
공격이 성공되어 정상적으로 로그인이 되었다.
9. mod-security rule 설정
기본설정을 복사한다.
1 |
$ sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf |
/etc/modsecurity/modsecurity.conf 에서 아래 부분을 변경한다.
1 2 |
SecRuleEngine DetectionOnly -> SecRuleEngine On SecAuditEngine RelevantOnly -> SecAuditEngine On |
/etc/apache2/mods-enabled/mod-security.conf 에서 아래의 부분을 추가한다.
1 2 3 4 5 6 7 |
$ 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를 복사한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ 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 부분의 주석을 제거하면 된다.
설정방법은 위와 동일하다.
One Response to apache2 mod_security 설치 및 테스트