Tutorial Instalasi ModSecurity pada CentOS 7


ModSecurity adalah Web Application Firewall (WAF) untuk web server Apache. Selain menyediakan kemampuan logging, ModSecurity dapat memonitor trafik HTTP secara real time dalam mendeteksi serangan. ModSecurity juga beroperasi sebagai Instrusion Detection System (IDS), memungkinkan Anda untuk bereaksi terhadap peristiwa mencurigakan yang terjadi pada sistem web Anda.


1. Pendahuluan

Panduan ini menggunakan OWASP ModSecurity Core Rule Set (CRS) versi 3.2. Tujuan proyek OWASP adalah untuk “memberikan seperangkat aturan deteksi serangan generik yang mudah dipasang yang memberikan perlindungan tingkat dasar untuk setiap aplikasi web,” dan CRS dimaksudkan untuk “melindungi aplikasi web dari berbagai serangan dengan minimum False Alerts”. Versi CRS ini membutuhkan ModSecurity 2.8.0 atau lebih tinggi. Konfigurasi dilakukan melalui kumpulan aturan untuk mencegah serangan umum seperti SQL Injection, remote code execution

2. Instalasi ModSecurity

# yum install mod_security

Contoh output :

Loaded plugins: downloadonly, fastestmirror, priorities, protectbase
Loading mirror speeds from cached hostfile
 * epel: www.gtlib.gatech.edu
 * base: mirror.skiplink.com
 * updates: centos.aol.com
 * addons: mirror.cs.vt.edu
 * extras: mirror.trouble-free.net
0 packages excluded due to repository protections
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package mod_security.x86_64 0:2.5.9-1.el5 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
================================================================
 Package                                  Arch                               Version                                   Repository                        Size
================================================================
Installing:
 mod_security                             x86_64                             2.5.9-1.el5                               epel                             935 k

Transaction Summary
============================================================================================================================================
Install      1 Package(s)         
Update       0 Package(s)         
Remove       0 Package(s)         

Total download size: 935 k
Is this ok [y/N]: y
Downloading Packages:
mod_security-2.5.9-1.el5.x86_64.rpm  | 935 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing     : mod_security    [1/1] 

Installed: mod_security.x86_64 0:2.5.9-1.el5
Complete!

Restart web server :

# /etc/init.d/httpd restart  atau
# service httpd restart

Cek versi ModSecurity yang diinstal :

# yum info mod_security

Contoh output :

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.biz.net.id
 * epel: mirror.xeonbd.com
 * extras: centos.biz.net.id
 * updates: centos.biz.net.id
Installed Packages
Name        : mod_security
Arch        : x86_64
Version     : 2.9.2
Release     : 1.el7
Size        : 980 k
Repo        : installed
From repo   : base
Summary     : Security module for the Apache HTTP Server
URL         : http://www.modsecurity.org/
License     : ASL 2.0
Description : ModSecurity is an open source intrusion detection and prevention eng inefor web applications. It operates embedded into the web server, acting as a powerful umbrella - shielding web applications from attacks.

3. Konfigurasi File

Ada beberapa file konfigurasi terkait dengan ModSecurity, antara lain :

a) File Konfigurasi Utama

Merupakan file konfigurasi utama untuk modul apache mod_security.

# /etc/httpd/conf.d/mod_security.conf

b) Direktori Konfigurasi

Berisi semua file konfigurasi lain untuk Apache mod_security.

# /etc/httpd/modsecurity.d/ 

c) Konfigurasi Core Rule Set (CRS)

Konfigurasi yang terdapat dalam file ini harus disesuaikan untuk persyaratan khusus sebelum penerapan.

# /etc/httpd/modsecurity.d/crs-setup.conf

d) Debugging ModSecurity Rules

Untuk mendebug rules mod_security dan masalah lainnya.

# /var/log/httpd/modsec_debug.log

e) File Log ModSecurity

Semua permintaan yang memicu peristiwa ModSecurity (seperti yang dideteksi) atau kesalahan server dicatat (“RelevantOnly”) masuk ke file ini.

# /var/log/httpd/modsec_audit.log 

4. Langkah Konfigurasi ModSecurity

Persiapan mendapatkan Core Rule Set (CRS)

# mkdir /etc/httpd/crs
# cd /etc/httpd/crs
# git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git 

Masuk ke dalam direktori OWASP CRS

# cd /etc/httpd/crs/owasp-modsecurity-crs/

Pada direktori CRS OWASP, ditemukan file sampel dengan aturan “crs-setup.conf.example”. Anda perlu menyalin isinya ke file baru bernama “crs-setup.conf”.

# cp crs-setup.conf.example crs-setup.conf

Selanjutnya mengkonfigurasi Apache untuk menggunakan konfigurasi file tersebut yang dapat dilakukan dengan mengedit file konfigurasi utama ModSecurity:

# nano /etc/httpd/conf.d/mod_security.conf

Dan sesuaikan konfigurasi sebagai berikut :

# ModSecurity Core Rules Set configuration
    #IncludeOptional modsecurity.d/*.conf
    #IncludeOptional modsecurity.d/activated_rules/*.conf
     IncludeOptional /etc/httpd/crs/owasp-modsecurity-crs/crs-setup.conf
     IncludeOptional /etc/httpd/crs/owasp-modsecurity-crs/rules/*.conf

Restart Web Server

# /etc/init.d/httpd restart

Sesuaikan file konfigurasi sendiri dalam direktori conf.d.

# nano /etc/httpd/conf.d/mod_security.conf

Sesuaikan script berikut :

SecResponseBodyAccess On

Restart Web Server :

# /etc/init.d/httpd restart

5. ModSecurity Testing

Untuk menguji ModSecurity, dapat menggunakan file Image pada artikel : https://govcsirt.bssn.go.id/write-up-cyber-security-drill-test-sektor-pemerintah-2019-case-insiden-web-defacement/ atau Image dapat diundunh pada https://s.id/isoDrill2019 (password : dr11lbs5n2019).

Testing akses shell command pada server dengan alamat IP 192.168.1.80 :

# curl 192.168.1.80/index.php?exec=/bin/bash

Output :

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /index.php
on this server.</p>
</body></html>

Testing melakukan serangan SQL Injection :

# python sqlmap.py --url http://192.168.1.80/read.php?id=26 --dbs

Hasil yang diharapkan :

[13:24:24] [WARNING] GET parameter 'id' does not seem to be injectable
[13:24:24] [CRITICAL] all tested parameters do not appear to be injectable. Try to increase values for '--level'/'--risk' options if you wish to perform more tests. If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could try to use option '--tamper' (e.g. '--tamper=space2comment')
[13:24:24] [WARNING] HTTP error codes detected during run:

Berdasarkan pengujian diatas, ModSecurity berhasil mencegah akses illegal ataupun serangan SQL Injection.

6. Logging ModSecurity

# tail -f /var/log/httpd/modsec_audit.log

Hasil yang diharapkan :

--3e883d77-A--
[29/May/2019:13:27:47 +0700] XO4mY5S34ZFW3ALy@--gwQAAAAU 192.168.1.77 45828 192.168.1.80 80
--3e883d77-B--
GET /read.php?id=26%25%27%20UNION%20ALL%20SELECT%20NULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL--%20oeaq HTTP/1.1
Accept-Encoding: gzip,deflate
Host: 192.168.1.80
Accept: */*
User-Agent: sqlmap/1.2.5.15#dev (http://sqlmap.org)
Connection: close
Cache-Control: no-cache
--3e883d77-F--
HTTP/1.1 403 Forbidden
Content-Length: 210
Connection: close
Content-Type: text/html; charset=iso-8859-1
--3e883d77-E--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /read.php
on this server.</p>
</body></html>

7. Whitelist IP Address menggunakan ModSecurity

Untuk melakukan pembatasan ijin akses terhadap sebuah halaman tertentu, perlu adanya aturan tertentu, misalkan halaman login administrator hanya dapat diakses oleh IP Address tertentu. Untuk itu perlu dibuat sebuah file yang mengimplementasikan aturan tersebut.

Membuat file adminPage.conf :

# touch /etc/httpd/conf.d/admminPage.conf
# nano /etc/httpd/conf.d/admminPage.conf

Masukan konfigurasi sebagai berikut :

<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{REQUEST_URI} ^(.*)admin(.*)$
        RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.65$ ## IP Addr
        RewriteRule .* / [R=302,L]
        <LocationMatch "/administrator">
                SecRuleEngine   DetectionOnly
        </LocationMatch>
</IfModule>