Cara Menginstal ModSecurity Pada Apache Linux Distro Debian/Ubuntu

ModSecurity adalah modul keamanan open-source yang populer untuk server web Apache. Modul ini berfungsi sebagai firewall aplikasi web (WAF) yang melindungi situs Anda dari berbagai serangan. Dalam tutorial ini, kita akan membahas langkah-langkah untuk menginstal dan mengkonfigurasi ModSecurity pada server Apache di sistem operasi Debian atau Ubuntu.

Dengan mengikuti panduan ini, Anda akan dapat meningkatkan keamanan server web Anda dengan menambahkan lapisan perlindungan tambahan terhadap ancaman umum seperti injeksi SQL, cross-site scripting (XSS), dan berbagai jenis serangan web lainnya.


Mengapa Menggunakan ModSecurity?

  1. Aplikasi web secara inheren tidak aman. Jika Anda adalah admin WordPress, Anda mungkin sering mendengar berita tentang peretas yang mengeksploitasi kerentanan dalam plugin dan tema WordPress.
  2. ModSecurity adalah WAF yang paling banyak digunakan di dunia, dipakai oleh lebih dari satu juta situs web.
  3. Berbeda dengan firewall berbasis host lainnya seperti iptables, UFW, dan Firewalld yang bekerja pada layer 3 dan 4 model OSI, ModSecurity fokus pada lalu lintas HTTP (layer 7 model OSI) dan mengambil tindakan berdasarkan konten permintaan dan respons HTTP.

Langkah 1: Instalasi ModSecurity dengan Apache di Debian/Ubuntu

  1. Instal modul ModSecurity untuk Apache:
    sudo apt install libapache2-mod-security2
  2. Aktifkan modul:
    sudo a2enmod security2
  3. Restart Apache:

    sudo systemctl restart apache2

Langkah 2: Konfigurasi ModSecurity

  1. Rename file konfigurasi:

    Pada file konfigurasi /etc/apache2/mods-enabled/security2.conf Anda dapat melihat baris seperti pada gambar diatas yang diberi tanda panah.  Ini berarti apache akan membaca semua file yang berakhiran *.conf pada folder /etc/modsecurity/. Oleh sebab itu kita harus merubah namanya ke agar file tersebut dapat berfungsi.

    sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
  2. Edit file konfigurasi:
    Anda dapat menggunakan vi, vim atau nano sesuai yang ada pada server Anda.
    sudo nano /etc/modsecurity/modsecurity.conf
  3. Ubah SecRuleEngine DetectionOnly menjadi SecRuleEngine On
  4. Ubah SecAuditLogParts ABDEFHIJZ menjadi SecAuditLogParts ABCEFHJKZ
  5. Restart Apache:
    sudo systemctl restart apache2

Langkah 3: Instalasi OWASP Core Rule Set (CRS)

  1. Download CRS terbaru:
    wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
  2. Ekstrak file dan pindahkan ke direktori yang sesuai:
    tar xvf v3.3.0.tar.gz
    sudo mkdir /etc/apache2/modsecurity-crs/
    sudo mv coreruleset-3.3.0/ /etc/apache2/modsecurity-crs/
  3. Konfigurasi Apache untuk menggunakan CRS terbaru: Edit file /etc/apache2/mods-enabled/security2.conf dan tambahkan hal-hal seperti berikut ini. Kemudian simpan, hasilnya seperti terlihat pada gambar dibawah yang diberikan tanda box merah.
    IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-3.3.0/crs-setup.conf
    IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-3.3.0/rules/*.conf
  4. Cek konfigurasi apache dulu, bila sudah oke kemudian Restart Apache:
    sudo apache2ctl -t
    sudo systemctl restart apache2

Langkah 4: Mempelajari Cara Kerja OWASP CRS

Mari kita lihat file konfigurasi CRS, yang memberikan dokumentasi yang baik tentang cara kerja CRS.

sudo nano /etc/apache2/modsecurity-crs/coreruleset-3.3.0/crs-setup.conf

Anda dapat melihat bahwa OWASP CRS dapat berjalan dalam dua mode:

  • Mode mandiri. Ini adalah mode tradisional yang digunakan dalam CRS v2.x. Jika permintaan HTTP cocok dengan aturan, ModSecurity akan segera memblokir permintaan HTTP tersebut dan berhenti mengevaluasi aturan yang tersisa. 
  • Mode penilaian anomali. Ini adalah mode default yang digunakan dalam CRS v3.x. ModSecurity akan memeriksa permintaan HTTP terhadap semua aturan, dan menambahkan skor ke setiap aturan yang cocok. Jika ambang batas tercapai, maka permintaan HTTP dianggap sebagai serangan dan akan diblokir. Skor default untuk permintaan masuk adalah 5 dan untuk respon keluar adalah 4.
           

Ketika berjalan dalam mode penilaian anomali, ada 4 tingkat paranoia.

  • Tingkat paranoia 1 (default) 
  • Tingkat paranoia 2 
  • Tingkat paranoia 3 
  • Tingkat paranoia 4 

Dengan setiap peningkatan tingkat paranoia, CRS mengaktifkan aturan tambahan yang memberikan Anda tingkat keamanan yang lebih tinggi. Namun, tingkat paranoia yang lebih tinggi juga meningkatkan kemungkinan memblokir beberapa lalu lintas yang sah karena kesalahan deteksi.


Ini adalah dua konsep dasar yang perlu Anda pahami sebelum menggunakan CRS. Sekarang kita dapat menutup file tersebut. Aturan CRS individual disimpan di direktori /etc/apache2/modsecurity-crs/coreruleset-3.3.0/rules/. Setiap aturan yang cocok akan meningkatkan skor anomali.

Langkah 5: Pengujian

Untuk memeriksa apakah ModSecurity berfungsi, Anda dapat meluncurkan serangan injeksi SQL sederhana pada situs web Anda sendiri. (Harap dicatat bahwa melakukan pengujian keamanan pada situs web orang lain tanpa izin adalah ilegal.) Masukkan URL berikut di browser web Anda.

https://yourdomain.com/?id=3 or 'a'='a'

Jika ModSecurity berfungsi dengan baik, server web Apache Anda harus mengembalikan pesan kesalahan 403 forbidden.



Dan dalam log audit (/var/log/apache2/modsec_audit.log), Anda dapat melihat baris berikut di bagian H, yang berarti ModSecurity mendeteksi dan memblokir serangan injeksi SQL ini menggunakan OWASP CRS v3.3.0.

Action: Intercepted (phase 2)



Ketika ModSecurity berjalan dalam mode DetectionOnly, ia tidak akan memblokir serangan injeksi SQL ini.


Langkah 6: Memahami Log ModSecurity

Penting untuk menganalisis log ModSecurity, sehingga Anda akan tahu jenis serangan apa yang diarahkan ke aplikasi web Anda dan mengambil tindakan yang lebih baik untuk mempertahankan diri terhadap pelaku ancaman. Ada dua jenis log utama di ModSecurity:

  • debug log: disabled by default.
  • audit log: /var/log/apache2/modsec_audit.log

Untuk memahami log audit ModSecurity, Anda perlu mengetahui 5 fase pemrosesan di ModSecurity, yaitu:

  • Fase 1: Memeriksa header permintaan 
  • Fase 2: Memeriksa body permintaan 
  • Fase 3: Memeriksa header respons 
  • Fase 4: Memeriksa body respons 
  • Fase 5: Tindakan (logging/memblokir permintaan berbahaya) 

Ada juga dua jenis file logging.

  • Serial: satu file untuk semua log. Ini adalah default. 
  • Konkuren: beberapa file untuk logging. Ini dapat memberikan kinerja penulisan yang lebih baik. Jika Anda dapat melihat halaman web Anda melambat setelah mengaktifkan ModSecurity, Anda dapat memilih untuk menggunakan jenis logging konkuren. 

Peristiwa dalam log dibagi menjadi beberapa bagian.

  • Bagian A: header log audit 
  • Bagian B: header permintaan 
  • Bagian C: body permintaan 
  • Bagian D: dicadangkan 
  • Bagian E: body respons perantara 
  • Bagian F: header respons akhir 
  • Bagian G: dicadangkan 
  • Bagian H: trailer log audit 
  • Bagian I: alternatif body permintaan ringkas, yang mengecualikan file 
  • Bagian J: informasi tentang file yang diunggah 
  • Bagian K: setiap aturan yang cocok dengan suatu peristiwa, dalam urutan kecocokan 
  • Bagian Z: batas akhir 

Jika Anda menjalankan situs web dengan lalu lintas tinggi, log audit ModSecurity dapat menjadi terlalu besar dengan sangat cepat, sehingga kita perlu mengonfigurasi rotasi log untuk log audit ModSecurity. Buat file konfigurasi logrotate untuk ModSecurity.

sudo nano /etc/logrotate.d/modsecurity 

Tambahkan baris-baris berikut ke file ini.

/var/log/apache2/modsec_audit.log
{
rotate 14
daily
missingok
compress
delaycompress
notifempty
}

Ini akan merotasi file log setiap hari (daily), mengompres versi lama (compress). 14 file log sebelumnya akan disimpan (rotate 14), dan tidak ada rotasi yang akan terjadi jika file kosong (notifempty). Simpan dan tutup file.

Langkah 7: Menangani Kesalahan Deteksi Positif

ModSecurity adalah firewall aplikasi web generik dan tidak dirancang untuk aplikasi web tertentu. Set aturan inti OWASP juga merupakan set aturan generik tanpa aplikasi tertentu yang dimaksud, jadi kemungkinan Anda akan melihat kesalahan deteksi positif setelah mengaktifkan ModSecurity dan OWASP CRS. Jika Anda meningkatkan tingkat paranoia di CRS, akan ada lebih banyak kesalahan deteksi positif.

Misalnya, secara default, CRS melarang injeksi perintah Unix seperti memasukkan sudo di halaman web, yang cukup umum di blog saya. Untuk menghilangkan kesalahan deteksi positif, Anda perlu menambahkan pengecualian aturan ke CRS.

Pengecualian Aturan Khusus Aplikasi Ada beberapa pengecualian khusus aplikasi yang sudah dibangun yang disertakan dengan OWASP CRS. Edit file crs-setup.conf.

sudo nano /etc/apache2/modsecurity-crs/coreruleset-3.3.0/crs-setup.conf

Kemudian lihat ke bagian Pengecualian Aturan Khusus Aplikasi dan temukan baris-baris berikut.

#SecAction \
# "id:900130,\
# phase:1,\
# nolog,\
# pass,\
# t:none,\
# setvar:tx.crs_exclusions_cpanel=1,\
# setvar:tx.crs_exclusions_drupal=1,\
# setvar:tx.crs_exclusions_dokuwiki=1,\
# setvar:tx.crs_exclusions_nextcloud=1,\
# setvar:tx.crs_exclusions_wordpress=1,\
# setvar:tx.crs_exclusions_xenforo=1"

Misalnya, jika saya ingin mengaktifkan pengecualian WordPress, baris-baris di atas harus diubah menjadi berikut. Harap berhati-hati dengan sintaksnya. Tidak boleh ada komentar antara t:none,\ dan setvar:tx.crs_exclusions_wordpress=1". (Karakter garis miring terbalik \ di akhir menunjukkan bahwa baris berikutnya adalah kelanjutan dari baris saat ini.)

SecAction \
"id:900130,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.crs_exclusions_wordpress=1"
# setvar:tx.crs_exclusions_cpanel=1,\
# setvar:tx.crs_exclusions_drupal=1,\
# setvar:tx.crs_exclusions_dokuwiki=1,\
# setvar:tx.crs_exclusions_nextcloud=1,\
# setvar:tx.crs_exclusions_xenforo=1"

Simpan dan tutup file. Kemudian uji konfigurasi Apache.

sudo apache2ctl -t

 Jika pengujian berhasil, restart Apache agar perubahan berlaku.

sudo systemctl restart apache2

Perhatikan bahwa jika Anda memiliki beberapa aplikasi seperti (WordPress, Nextcloud, Drupal, dll) yang diinstal di server yang sama, maka pengecualian aturan di atas akan diterapkan ke semua aplikasi. Untuk meminimalkan risiko keamanan, Anda harus mengaktifkan pengecualian aturan hanya untuk satu aplikasi. Untuk melakukan itu, pergi ke direktori /etc/apache2/modsecurity-crs/coreruleset-3.3.0/rules/.

cd /etc/apache2/modsecurity-crs/coreruleset-3.3.0/rules/

Ubah nama file REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.

sudo mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

Kemudian edit file ini.

sudo nano REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

Tambahkan baris berikut di bagian bawah file ini. Jika WordPress Anda menggunakan sub-domain blog.yourdomain.com dan header permintaan yang dikirim dari browser pengunjung berisi sub-domain ini, maka ModSecurity akan menerapkan pengecualian aturan untuk WordPress.

SecRule REQUEST_HEADERS:Host "@streq blog.yourdomain.com" "id:1000,phase:1,setvar:tx.crs_exclusions_wordpress=1"

Jika Anda telah menginstal Nextcloud di server yang sama, maka Anda juga dapat menambahkan baris berikut dalam file ini, sehingga jika pengunjung mengakses sub-domain Nextcloud Anda, ModSecurity akan menerapkan pengecualian aturan Nextcloud.

SecRule REQUEST_HEADERS:Host "@streq nextcloud.yourdomain.com" "id:1001,phase:1,setvar:tx.crs_exclusions_nextcloud=1"

Simpan dan tutup file ini. Kemudian uji konfigurasi Apache.

sudo apache2ctl -t

Jika pengujian berhasil, restart Apache agar perubahan berlaku.

sudo systemctl restart apache2

Pengecualian Aturan Kustom 

Mengaktifkan pengecualian aturan khusus aplikasi yang sudah dibangun mungkin tidak menghilangkan semua kesalahan deteksi positif. Jika demikian, Anda perlu memeriksa log audit ModSecurity (/var/log/apache2/modsec_audit.log), memeriksa aturan mana yang menyebabkan kesalahan deteksi positif dan menambahkan pengecualian aturan kustom Anda di file REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.

Bagian H dalam log audit memberi tahu Anda aturan mana yang cocok. Misalnya, jika saya mencoba menggunakan HTML <code>...</code> di formulir komentar, ModSecurity memblokir komentar saya. Log berikut memberi tahu saya bahwa permintaan HTTP cocok dengan aturan di REQUEST-941-APPLICATION-ATTACK-XSS.conf (baris 527). ID aturan adalah 941310. URI permintaan adalah /wp-comments-post.php.



Ini terdeteksi sebagai serangan filter XSS dengan pengkodean yang salah. Namun, saya ingin pengguna dapat menggunakan tag HTML <code>...</code> dan <pre>...</pre> di formulir komentar, jadi saya membuat pengecualian aturan. Tambahkan baris berikut di bagian bawah file REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.

SecRule REQUEST_URI "@streq /wp-comments-post.php" "id:1002,phase:1,ctl:ruleRemoveById=941310"

Baris ini memberi tahu ModSecurity bahwa jika URI permintaan adalah /wp-comments-post.php, maka jangan terapkan aturan ID 941310. Simpan dan tutup file. Kemudian uji konfigurasi Apache.

sudo apache2ctl -t

Jika pengujian berhasil, restart Apache agar perubahan berlaku.

sudo systemctl restart apache2

Jika kesalahan deteksi positif cocok dengan beberapa ID aturan, Anda dapat menambahkan pengecualian aturan dalam satu baris seperti ini:

SecRule REQUEST_URI "@streq /wp-admin/post.php" "id:1003,phase:1,ctl:ruleRemoveById=941160,ctl:ruleRemoveById=941310,ctl:ruleRemoveById=942100"

Catatan: Tidak disarankan untuk menonaktifkan terlalu banyak aturan level 1 di OWASP CRS, karena ini akan membuat situs web Anda lebih mudah diretas. Hanya nonaktifkan aturan jika Anda tahu apa yang Anda lakukan.

Whitelist IP 

Jika Anda ingin menonaktifkan ModSecurity untuk alamat IP Anda sendiri, tetapi tetap mengaktifkannya untuk semua alamat IP lainnya, maka tambahkan aturan kustom berikut di file REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf. Ganti 12.34.56.78 dengan alamat IP Anda yang sebenarnya.

SecRule REMOTE_ADDR "@ipMatch 12.34.56.78" "id:1004,phase:1,allow,ctl:ruleEngine=off"

Untuk memasukkan subnet ke dalam whitelist, gunakan sintaks berikut, yang akan memasukkan jaringan 10.10.10.0/24 ke dalam whitelist.

SecRule REMOTE_ADDR "@ipMatch 10.10.10.10/24" "id:1005,phase:1,allow,ctl:ruleEngine=off"

Simpan dan tutup file. Kemudian uji konfigurasi Apache.

sudo apache2ctl -t

Jika pengujian berhasil, restart Apache agar perubahan berlaku.

sudo systemctl restart apache2

Menghubungkan Aturan 

Jika Apache Anda memiliki beberapa virtual host, Anda mungkin ingin memasukkan alamat IP Anda ke dalam whitelist untuk virtual host tertentu. Anda perlu menghubungkan dua aturan seperti ini:

SecRule REMOTE_ADDR "@ipMatch 12.34.56.78" "id:1004,phase:1,allow,ctl:ruleEngine=off,chain"
SecRule REQUEST_HEADERS:Host "@streq nextcloud.yourdomain.com" "t:none"

Kata kunci chain di akhir aturan pertama menunjukkan bahwa tindakan ruleEngine=off hanya akan diambil jika kondisi dalam aturan berikutnya juga benar.

(Opsional) Mengintegrasikan ModSecurity dengan Project Honeypot 

Project Honeypot memelihara daftar alamat IP berbahaya yang diketahui, tersedia gratis untuk publik. ModSecurity dapat berintegrasi dengan Project Honeypot dan memblokir alamat IP yang ada dalam daftar Project Honeypot.

Perlu diingat bahwa menggunakan Project Honeypot akan membuat situs web Anda lebih lambat untuk pengunjung baru, karena server web Anda perlu mengirim permintaan ke Project Honeypot sebelum dapat mengirim respons ke pengunjung baru. Namun, setelah data reputasi IP di-cache di server web Anda, dampak kinerja akan sangat minimal.

Untuk menggunakan Project Honeypot, pertama buat akun gratis di situsnya. Kemudian pergi ke dashboard akun Anda dan klik tautan get one untuk meminta kunci akses untuk daftar hitam HTTP.



Selanjutnya, edit file crs-setup.conf.

sudo nano /etc/apache2/modsecurity-crs/coreruleset-3.3.0/crs-setup.conf

Cari baris-baris berikut.

#SecHttpBlKey XXXXXXXXXXXXXXXXX
#SecAction "id:900500,\
# phase:1,\
# nolog,\
# pass,\
# t:none,\
# setvar:tx.block_search_ip=1,\
# setvar:tx.block_suspicious_ip=1,\
# setvar:tx.block_harvester_ip=1,\
# setvar:tx.block_spammer_ip=1"

Hapus karakter # di awal untuk mengaktifkan baris-baris tersebut, dan tambahkan kunci API HTTPBL Anda yang diperoleh dari Project Honeypot.



Perhatikan bahwa block_search_ip harus diatur ke 0 (dinonaktifkan), karena kita tidak ingin memblokir crawler mesin pencari. Simpan dan tutup file. Kemudian restart Apache.

sudo systemctl restart apache2

Sekarang ModSecurity akan mengirim permintaan ke Project Honeypot untuk semua permintaan HTTP. Untuk menguji apakah ini akan berfungsi, edit file crs-setup.conf.

sudo nano /etc/apache2/modsecurity-crs/coreruleset-3.3.0/crs-setup.conf

Di editor teks Nano, Anda dapat dengan cepat melompat ke akhir file dengan menekan Ctrl+W, kemudian Ctrl+V. Tambahkan baris berikut di akhir file ini. Ini memungkinkan kita untuk memasukkan alamat IP dalam URL. (Setelah pengujian berhasil, Anda dapat menghapus baris ini dari file.)

SecRule ARGS:IP "@rbl dnsbl.httpbl.org" "phase:1,id:171,t:none,deny,nolog,auditlog,msg:'RBL Match for SPAM Source'

Simpan dan tutup file. Uji konfigurasi Apache.

sudo apache2ctl -t

Kemudian restart Apache.

sudo systemctl restart apache2

Pergi ke situs web Project Honeypot dan temukan alamat IP berbahaya, misalnya, 134.119.218.243. Jalankan perintah berikut untuk menguji daftar hitam HTTP.

curl -i -s -k -X $'GET' 'https://yourdomain.com/?IP=134.119.218.243'

Server web Apache Anda harus mengembalikan respons 403 forbidden karena alamat IP tersebut ada dalam Project Honeypot.

Cara Menonaktifkan ModSecurity untuk Virtual Host

 Secara default, ModSecurity diaktifkan untuk semua virtual host Apache. Jika Anda ingin menonaktifkan ModSecurity untuk virtual host tertentu, edit file virtual host (/etc/apache2/sites-enabled/example.com.conf) dan tambahkan baris berikut ke konteks <VirtualHost>...</VirtualHost>.

SecRuleEngine DetectionOnly

Muat ulang Apache agar perubahan berlaku.

sudo systemctl reload apache2

Cara Memperbarui OWASP CRS

Anda perlu memperbarui set aturan inti ketika versi baru keluar. Prosesnya sederhana.

Ulangi langkah 3 untuk menginstal versi baru set aturan inti. Kemudian pergi ke langkah 7. Salin aturan kustom Anda di file crs-setup.conf dan REQUEST-900-EXCLUSION-RULES-BEFORE-CRS. Selanjutnya, uji konfigurasi Apache.

sudo apache2ctl -t

Jika pengujian berhasil, restart Apache agar perubahan berlaku.

sudo systemctl restart apache2

Bagaimana Anda tahu jika versi baru berfungsi? Luncurkan serangan injeksi SQL sederhana seperti di langkah 5 dan periksa log server Anda. Ini akan menunjukkan versi CRS yang mencegah serangan ini.

Bagaimana menurut Anda, sampaikan pada kolom komentar.


Referensi: How to Set Up ModSecurity with Apache on Debian/Ubuntu


0 Komentar