Apa yang harus kita siapkan WAF





Saat mengembangkan atau memelihara aplikasi web, pada suatu saat Anda harus berurusan dengan kebutuhan untuk menggunakan WAF (Firewall Aplikasi Web). Jika Anda tidak memiliki pengalaman dengan kelas solusi ini atau bosan dengan kesalahan positif yang konstan, saya akan memberi tahu Anda cara menyederhanakan tugas, serta membagikan beberapa tip dan trik. Kami akan menggunakan Nemesida WAF Free sebagai alat - versi gratis dari Nemesida WAF.



Visualisasi, atau mari kita mulai dari akhir



Anda dapat memantau pekerjaan Nemesida WAF Free melalui browser, jadi setelah pengaturan singkat sistem, kami akan mendapatkan akses ke antarmuka web, tempat informasi tentang serangan yang diblokir, alasan pemblokiran, informasi tentang alamat IP, dll. Akan tersedia. Selain itu, bagian dengan ringkasan statistik berupa grafik, diagram dan data lalu lintas dari modul VTS (jika digunakan) akan muncul.







Tempat demonstrasi: demo.lk.nemesida-security.com (demo@pentestit.ru / pentestit)







Mari lanjutkan dengan penginstalan.



Menginstal Nemesida WAF Gratis



Terlepas dari kenyataan bahwa versi gratisnya adalah cabang dari versi lengkap, ini berisi sejumlah besar kemampuan untuk mendeteksi, memblokir, dan memvisualisasikan serangan pada aplikasi web. Yang kami maksud dengan aplikasi web adalah segala sesuatu yang dibangun di atas protokol HTTP: situs web, akun pribadi, toko online, situs pelatihan, API, dan lainnya.



Pada paragraf sebelumnya, saya secara khusus membagi fungsionalitas serangan pemblokiran menjadi deteksi dan pemblokiran, karena ada 2 (bahkan tiga) mode operasi produk: IDS, IPS dan PseudoIDS (mode LM).



Mode IDS



Mode IDS memungkinkan Anda menggunakan WAF pada salinan lalu lintas, mendeteksi tetapi tidak memblokir serangan. Mode operasi ini berguna, misalnya, untuk permulaan awal atau untuk pemantauan pasif, untuk menghindari pemblokiran permintaan atau peningkatan, betapapun kecilnya, dalam waktu respons. Untuk konfigurasi contoh, kami akan menggunakan Nginx untuk server pengirim (meskipun Anda dapat menggunakan yang lain, misalnya, Apache2 atau IIS).



Mengonfigurasi server pengirim:



location / {
    mirror /mirror;
    ...
}

location = /mirror {
    internal;
    proxy_pass http://192.168.0.1$request_uri;
}
      
      



(sebagai ganti 192.168.0.1, Anda harus menentukan alamat server dengan Nemesida WAF diinstal)



Setelah membuat perubahan dan memulai ulang server web, permintaan yang datang ke server ini akan dikirim ke server 192.168.0.1 dengan Nemesida WAF diinstal (konfigurasinya sederhana dan akan dijelaskan di bawah). Skema kerja ini memungkinkan pemantauan serangan tanpa memblokirnya, tetapi pada saat yang sama, tanpa memengaruhi server utama.



Mode IPS dan PseudoIDS



2 mode operasi yang tersisa mengasumsikan penggunaan WAF "secara terbalik", sedangkan dalam mode IPS, insiden keamanan yang terdeteksi diblokir, dalam mode PseudoIDS mereka direkam, tetapi tidak diblokir. Mode terakhir nyaman karena peralihan di antara dua mode ini dilakukan dengan menggunakan opsi sederhana: kemampuan untuk beralih ke mode PseudoIDS baik dengan nama server (opsi nwaf_host_lm



) dan dengan alamat IP klien (opsi nwaf_ip_lm



).



Secara umum, Nemesida WAF Free menyediakan banyak parameter untuk "menyempurnakan" sistem: fungsionalitas fleksibel untuk membuat aturan pemblokiran dan pengecualian Anda sendiri, kemampuan untuk menambahkan IP klien ke "daftar pengecualian", opsi untuk menyiapkan larangan untuk semua dan untuk setiap host virtual individu, dll. ... Semua ekonomi ini dapat dikontrol melalui file konfigurasi dalam versi gratis, dan dalam versi lengkap juga melalui panggilan API.



Mari kembali ke prosedur instalasi. Nemesida WAF disajikan dalam bentuk beberapa komponen:



  • Modul dinamis untuk Nginx
  • API WAF Nemesida (menerima acara dari Nemesida WAF dan menempatkannya di Postgres untuk tampilan berikutnya di LC atau integrasi dengan sistem SIEM)
  • Akun pribadi (antarmuka web untuk memantau insiden)
  • Modul pembelajaran mesin AI Nemesida
  • Vulnerability Scanner Nemesida WAF Scanner
  • Nemesida WAF Signtest - antarmuka web untuk mengelola modul pembelajaran mesin


Di Nemesida WAF Free, kita hanya memerlukan tiga yang pertama - modul dinamis itu sendiri, API WAF Nemesida dan Akun Pribadi. Semua komponen tersedia sebagai distribusi instalasi dan memungkinkan Anda menghubungkan Nemesida WAF ke instans Nginx yang sudah diinstal, mulai dari versi 1.12 (versi Nginx Stable, Mainline dan Plus didukung).



Modul dinamis Nemesida WAF



Bagi mereka yang belum menginstal kit distribusi untuk pertama kali, proses penginstalan dan pengoperasian modul dinamis memerlukan waktu sekitar 5-10 menit. Modul WAF Nemesida dinamis dapat dihubungkan ke Nginx yang sudah diinstal (atau dikompilasi dari sumber dengan modulnya sendiri).



Repositori WAF Nemesida tersedia untuk OS berikut: Debian 9/10, Ubuntu 16.04 / 18.04 / 20.04, Centos 7/8. Petunjuk video untuk menginstal dan mengkonfigurasi komponen untuk pertama kalinya dipublikasikan di saluran Youtube. Kami menyarankan Anda untuk membiasakan diri dengan salah satunya, tetapi kami merekomendasikan menginstal dan mengkonfigurasi sesuai dengan dokumentasi di situs utama, karena beberapa parameter mungkin menjadi usang, yang lain mungkin ditambahkan.



Memasang modul dinamis Nemesida WAF (video)


Setelah Nginx dikonfigurasi, hubungkan repositori WAF Nemesida yang sesuai dengan OS Anda dan lanjutkan dengan instalasi. Produk juga diperbarui dari repositori. Petunjuk penginstalan tersedia di: github.com/nemesida-waf/nemesida_waf_free .



Nemesida WAF API dan Akun Pribadi



Setelah modul dinamis diinstal dan diluncurkan, sekarang saatnya untuk melanjutkan menginstal dua komponen yang tersisa: API WAF Nemesida dan Akun Pribadi.



Nemesida WAF API disajikan dalam bentuk API yang ditulis menggunakan Flask dan dirancang untuk menerima event dari Nemesida WAF, Nemesida WAF Scanner dan Nemesida AI, dan kemudian menempatkan kejadian ini ke dalam database. PostgreSQL digunakan sebagai DBMS. Dalam versi gratis Nemesida WAF, hanya informasi tentang permintaan yang diblokir yang akan dikirim ke database.



Setelah Nemesida WAF API dikonfigurasi dan terhubung ke PostgreSQL, saatnya untuk mulai meluncurkan Akun Pribadi Anda. Menurut dokumentasi, kami menginstal, mengkonfigurasi, melakukan migrasi, menentukan pengguna dan kata sandi untuk masuk.



Dari pengalaman, menginstal dua komponen terakhir menyebabkan lebih banyak kesulitan (biasanya beberapa langkah dilewati, misalnya, mereka lupa untuk bermigrasi atau mengizinkan koneksi ke Postgres), jadi untuk memulai dengan cepat, kami menyiapkan Alat Virtual (disk virtual dengan komponen Debian 10 dan Nemesida WAF, 3GB hingga unpacking), dan juga membuat 2 image Docker : untuk modul dinamis dan untuk Nemesida WAF API / Personal Account.



Nah, bagian yang paling membosankan sudah berakhir, sekarang kita bisa menguji WAF dalam aksi.



Retasan pertama



Untuk menguji operasi WAF yang sudah dikonfigurasi, tidak perlu mengingat variasi serangan yang berbeda. Kami telah membuat tanda tangan uji yang akan memeriksa apakah Nemesida WAF berfungsi dan jika serangan yang diblokir ditampilkan di LC. Kumpulan tanda tangan yang digunakan saat ini selalu dapat dilihat di rlinfo.nemesida-security.com .



Kami mengirim permintaan (saya melakukannya melalui konsol, tetapi lebih baik melakukannya melalui browser untuk kejelasan):



curl --noproxy '*' example.com/nwaftest
      
      





atau, jika Anda menginginkan sesuatu yang lebih dekat dengan kenyataan:



curl --noproxy '*' example.com/?cmd=;+cat+/etc/passwd
      
      





Sebagai tanggapan, kami menerima kode tanggapan 403:



<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
      
      





Dan dalam beberapa detik serangan akan muncul di LC:







Jika permintaan tidak diblokir - WAF tidak terhubung atau dikonfigurasi dengan benar (mungkin alamat atau host telah ditambahkan ke WL / LM), jika permintaan diblokir, tetapi tidak ada informasi di LC - periksa kebenaran interaksi dengan Nemesida API WAF dan LC. Bagaimanapun, Anda selalu dapat mengajukan pertanyaan di forum .



Halaman 403 tersuai



Secara default, halaman 403 (halaman dengan kode respon 403) tidak menarik dan pelit dengan informasi. Nemesida WAF bersama dengan Nginx memungkinkan Anda membuatnya cantik dan lebih informatif.



Agar server Anda melayani halaman seperti itu, Anda harus:



1. Membuat file konfigurasi untuk halaman kustom (misalnya, di /etc/nginx/snippets/custom_pages.conf



);



Tambahkan parameter yang diperlukan ke Nginx
## Error pages
error_page      403 405 = 222 /403.html;

## Locations
location /403.html {

        internal;
        root /var/www/custom_pages/;
        proxy_no_cache 1;
        proxy_cache_bypass 1;

        add_header X-Request-ID $request_id always;
        add_header Host $host always;
        add_header X-Remote-IP $remote_addr always;
        add_header NemesidaWAF-BT $nwaf_block_type always;

}
      
      







Deskripsi:



error_page 403 405 = 222 /403.html;



— 222 403 405 /403.html



;



/403.html



( example.com/403.html — ), ID ($request_id), ($host), , IP ($remote_addr) ( ) Nemesida WAF ($nwaf_block_type). Nemesida WAF , , 1 2 — , 3 — , 4 — ..









2. Hubungkan file yang dibuat:



Hubungkan file yang dibuat ke konfigurasi Nginx
(, /etc/nginx/conf.d/example.com.conf



):



server {
        ...
        ## Custom pages
        include                 snippets/custom_pages.conf;
       ....
}
      
      







3. Buat halaman kustom (misalnya /var/www/custom_pages/403.html



) dengan konten berikut (misalnya):



Contoh halaman 403 tersuai
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="Cache-Control" content="no-cache">
    <meta http-equiv="refresh" content="7; URL=/" />
    <style type="text/css">
        .error {color:#000; font-family:Arial, sans-serif; text-align: center; position: absolute; top: 50%; left: 50%; -moz-transform: translateX(-50%) translateY(-50%); -webkit-transform: translateX(-50%) translateY(-50%); transform: translateX(-50%) translateY(-50%);}
        .error-fon {font-weight:bold; color:#d0e3f7;}
        .error-text-top {font-size:16px; color:#434141}
        hr { display: block; height: 10px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
    </style>
    <title>403 Access denied</title>
</head>
<body>
<div class="error">
    <div class="error-fon">
        <font style="font-size:240px;">403</font>
        <br>
        <font style="font-size:40px;">ACCESS IS BLOCKED</font>
    </div>
    <br>
    <div class="error-text-wrap">
        <div class="error-text-top">
            <p>
            <hr>
            <p style="text-align: justify;">

              Suspicious activity. If the request is blocked by mistake, please email us at <a href="mailto:blocked@example.com">blocked@example.com</a> and  be sure to include technical information below (domain, IP, request ID), or try again in 5 minutes.

              <br><br>

               .     , ,    <a href="mailto:blocked@example.com">blocked@example.com</a>,      (domain, IP, request ID),     5 .

            </p>
	    <hr>
            <table style="text-align: left; margin: auto">
                <tr>
                    <td>
                        <code style="font-size:14px;"> Domain:</code>
                    </td>
                    <td>
                        <code style="font-size:14px;"> <span id="domain">-</span> </code>
                    </td>
                </tr>
                <tr>
                    <td>
                        <code style="font-size:14px;"> IP address:</code>
                    </td>
                    <td>
                        <code style="font-size:14px;"> <span id="ip">-</span> </code>
                    </td>
                </tr>
                <tr>
                    <td>
                        <code style="font-size:14px;"> Request ID:</code>
                    </td>
                    <td>
                        <code style="font-size:14px;"> <span id="id">-</span> </code>
                    </td>
                </tr>
            </table>
            </p>
        </div>
        <script type="application/javascript">
            function replace() {
                window.location.replace('/');
            }
            const req = new XMLHttpRequest();
            req.open('GET', document.location, false);
            req.send(null);
            const req_id = req.getResponseHeader('x-request-id');
            const req_domain = req.getResponseHeader('host');
            let req_ip = req.getResponseHeader('x-remote-ip');
            const req_bt = req.getResponseHeader('nemesidawaf-bt');
            if (req_bt == 6)
            {
                req_ip = req_ip  + " (banned)";
            }
            if (req_bt ==7)
            {
                req_ip = req_ip  + " (banned, bruteforce)";
            }
            document.getElementById('domain').innerHTML = req_domain;
            document.getElementById('ip').innerHTML = req_ip;
            document.getElementById('id').innerHTML = req_id;
            if (req_bt != 6 & req_bt !=7)
            {
                setTimeout(replace,3000);
            }
        </script>
    </div>
</div>
</body>
</html>
      
      







Setelah memulai ulang Nginx (dengan Nemesida WAF diinstal), semua halaman dengan kode respon 403 dan 405 akan terlihat seperti ini:







Dalam hal ini, halaman kustom akan disegarkan setiap 7 detik, dan jika IP klien tidak dilarang, halaman root situs akan kembali.



Larangan otomatis



Anda mungkin pernah mendengar atau bahkan menggunakan sistem larangan otomatis seperti Fail2ban dan mengetahui kelebihan dan kekurangannya. Nemesida WAF menggunakan mekanisme larangan bawaan dan mudah dikonfigurasi yang memungkinkan Anda untuk mengatur periode pemblokiran sewenang-wenang untuk host server virtual. Pemblokiran terjadi berdasarkan alamat IP, dan opsi berikut tersedia untuk kontrol:



  • Jumlah serangan IP yang mengarah pada pemblokiran;
  • Periode pemblokiran;
  • Host virtual tempat serangan diarahkan (opsional).


Parameter pemblokiran otomatis dikontrol oleh parameter yang nwaf_limit



tersedia di file /etc/nginx/nwaf/conf/global/nwaf.conf



. Penggunaan parameter ini akan berguna jika situs sedang dipindai untuk mencari kerentanan atau saat mencoba mempromosikan kerentanan yang terdeteksi.



Sementara daftar



Pekerjaan WAF didasarkan pada prinsip menganalisis permintaan dan tanggapan yang datang ke server jika terdapat tanda-tanda serangan atau anomali. Penggunaan algoritme pembelajaran mesin, ditambah dengan teknologi normalisasi yang ditingkatkan dalam versi lengkap Nemesida WAF, memungkinkan pendeteksian serangan semacam itu secara akurat dan dengan jumlah positif palsu yang sangat minimum (sekitar 0,01%), tetapi dalam versi gratis untuk mengurangi jumlah positif palsu, kami mengalami keterbatasan arsitektur analisis tanda tangan. Karenanya, versi gratis memiliki lebih banyak positif palsu, dan Anda harus menggunakan daftar pengecualian (atau "daftar putih") untuk mengatasi masalah ini. Pembuatan aturan pengecualian juga tersedia di Nemesida WAF.



Paling sering, positif palsu muncul ketika administrator / moderator sumber daya web membuat pembaruan atau perubahan melalui antarmuka web, mentransmisikan konstruksi yang tidak biasa bagi pengguna di badan permintaan: Permintaan yang sah akan diblokir karena berisi entri fungsi , sementara permintaan semacam itu tidak khas untuk pengunjung biasa sumber daya web. Jika administrator aplikasi tidak dapat berinteraksi dengannya melewati WAF, Anda dapat menambahkan alamat IP tempat mereka mengakses sumber daya ke daftar pengecualian, atau mengalihkan alamat ke mode PseudoIDS (opsi ) untuk merekam peristiwa tanpa pemblokiran. Tetapi Anda harus selalu berhati-hati dengan tindakan seperti itu.

...

$html = curl_exec($ch);

curl_close($ch);

return json_decode($html,true);

...








json_decode()







nwaf_ip_lm







Omong-omong, Nemesida WAF memungkinkan Anda menambahkan tidak hanya alamat IP, tetapi juga subnet, jika perlu.



Kesimpulan



Terlepas dari seberapa baik kode tersebut ditulis menurut pendapat Anda, ia menggunakan fungsi pemfilteran input dan kerangka kerja khusus seperti HTML Purifier, yang dirancang untuk menghapus jika tidak semua kode berbahaya, maka sebagian besar darinya, Anda perlu menggunakan WAF untuk meningkatkan tingkat keamanan.



Jika Anda berniat untuk menggunakan WAF untuk pertama kalinya, atau Anda bosan dengan penambahan aturan pengecualian yang tak ada habisnya, kami sarankan Anda mencoba Nemesida WAF Free. Untuk penggunaan profesional (memblokir serangan kompleks, serangan brute force, SMS flooding; mencari kerentanan; memiliki sistem tambalan virtual, dll.), Nemesida WAF versi lengkap dengan modul pembelajaran mesin dan pemindai kerentanan diperlukan. Namun demikian, untuk sebagian besar serangan non-target dan pemindaian massal, Nemesida WAF Free akan menjadi alat yang baik dan nyaman.



Dalam artikel tersebut, saya mencoba mengungkapkan situasi yang paling sering muncul saat menggunakan solusi kelas ini. Saya akan senang jika Anda mengingat lebih banyak di komentar.



All Articles