.htaccess memblokir akses ketika HTTP_HOST adalah IP (Keamanan)

May 31 2018

Saya mengalami banyak serangan di server saya. Sebagian besar dimulai dengan pemindaian kerentanan, diikuti oleh gelombang permintaan POST.

Saya akan segera mengimplementasikan Cloudflare (WAF dan DDos). Ini berarti pencarian DNS di domain saya akan menampilkan alamat IP Cloudflare, bukan server saya. Jadi alamat IP server saya akan disembunyikan dalam hal itu.

Namun, serangan masih bisa datang satu per satu melalui semua IP yang mungkin ada di dunia. Ketika saya melihat log server saya, saya dapat melihat ini BANYAK terjadi. (Saya memiliki 3 IP yang terkait dengan 1 server saya dan serangan yang persis sama terjadi di XXX.XXX.XXX.XX1 lalu XXX.XXX.XXX.XX2 lalu XXX.XXX.XXX.XX3)

.Htaccess level teratas saya terlihat seperti ini:

# deny all POST requests
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} POST
    RewriteRule .* - [F,L]
</IfModule>


# deny unused request types
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} ^(delete|head|trace|track) [NC]
    RewriteRule .* - [F,L]
</IfModule>


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Pertanyaan:

  1. Apa yang harus saya tambahkan agar [jika HTTP_HOST = XXX.XXX.XXX.XX1 ATAU HTTP_HOST = XXX.XXX.XXX.XX2 ATAU HTTP_HOST = XXX.XXX.XXX.XX3] lalu lalu lintas langsung diblokir?

  2. Dapatkah saya meletakkan kode baru ini di bagian atas .htaccess? Akankah itu merusak apa yang saat ini ada?

Jawaban

1 MrWhite May 31 2018 at 18:49

Anda tidak perlu memeriksa Hostheader untuk IP tertentu, cukup periksa Hostyang dimulai dengan digit. Misalnya, di bagian atas .htaccessfile Anda :

RewriteCond %{HTTP_HOST} ^\d
RewriteRule .* - [F]

Anda tidak memerlukan Lbendera dengan F- itu tersirat.

Anda juga tidak membutuhkan <IfModule mod_rewrite.c>pembungkus tambahan . Biarkan saja WordPress apa adanya. (Meskipun itu juga tidak diwajibkan.)

Namun, jenis pemblokiran ini idealnya dilakukan di tingkat server / vitualhost, bukan di .htaccess. Konfigurasi default <VirtualHost>yang menjebak permintaan IP yang tidak diinginkan ini.

Misalnya, dengan asumsi Anda hanya menggunakan VirtualHost berbasis nama, maka Anda dapat mengkonfigurasi VirtualHost default (yang harus terjadi sebelum semua VirtualHost lainnya) dalam bentuk:

# Catch all other requests for non-specific hosts. eg IP address access
<VirtualHost _default_>
  ServerName default.example.com
  <Location />
  Require all denied
  </Location>
</VirtualHost>

Ini menangkap semua permintaan yang tidak dipetakan ke "bernama" Virtual Host lainnya. _default_hanyalah sebuah alias untuk *. Seperti disebutkan di atas, <VirtualHost>penampung ini harus terjadi sebelum semua <VirtualHost>penampung lain di konfigurasi server Anda. Fakta bahwa itu didefinisikan pertama kali itulah yang membuatnya menjadi "default".

The ServerNamedirektif harus didefinisikan sebagai sesuatu selain real name server pada sistem Anda. Ini dapat dihilangkan, tetapi server hanya akan mencoba menghitungnya, yang terbukti tidak dapat diandalkan.

Ini mencegah Host Virtual Anda yang sebenarnya (yang melayani situs web Anda) dari keharusan menangani permintaan lain ini .


# deny all POST requests

Sepertinya itu sedikit ekstrim! Saya terkejut situs Anda masih berfungsi?