WordPress vs. Web sitelerini korumak için…

Çok çeşitli içerik yönetim yazılımı var! (WordPress, Joomla, vs. vs.) Bunların da yüzlerce, belki binlerce eklentileri (plug-in) var.  Bunların hepsinin güvenli bir şekilde kullanılabileceğine inanmak sadece aşırı iyimserlik olur. Hatta, içlerinde arka kapı (back-door) yerleştirilmiş olanların bile olduğu söyleniyor-düşünülüyor-biliniyor .
Bu tip hazır paketlerin – ve daha önemlisi eklentilerinin en zayıf tarafı aralarında ziyaretçilerin siteye dosya yüklemelerine izin veren uygulamalar olmasıdır. Bu uygulama ve-veya eklentileri kullanırken çok çok dikkatli olunması gerekmekte; web dosyaları hiyerarşisi içine dosya yüklenmesine ve yüklenen dosyalara doğrudan URL ile (http://site.com/ gallery/resim.png gibi) erişim sağlayan eklentiler kesinlikle kullanılmamalıdır.
Gene de, ziyaretçilerin bir web sitesine yanlızca salt-oku erişimlerine izin vermek; yöneticilerin ise ancak belli IP adreslerinden siteye oku-yaz erişebilmelerini sağlamak güvenlik duvarını kalınlaştıracaktır.
Bunu yapabilmek için benim kullandığım yöntem özetle şu:

  • sunucuda web dizini, ikinci bir salt-oku dizine bağlanır (“mount” edilir)
  • apache web sunucusu standart 80 portu yanısıra  8080 portunu da dinler.
  • apache’de iki sanal sunucu tanımlıdır. Bunlardan biri web kök dizini olarak normal web kök dizinini, diğeri ise salt-oku bağlanmış web kök dizinini sunar. 80 portuna gelen istekler salt-oku dizini sunan sanal web sunucusu tarafından karşılanır; 8080 portuna gelen istekler ise oku-yaz olarak bağlanmış dizini sunan sanal web sunucu tarafından karşılanır.
  • iptables ile önceden belirlenmiş yönetim IP adres bloklarından gelen istekler 8080 portuna yönlendirilir. Diğer yerlerden gelen istekler 80 portunda bırakılır.

Bu çalışma koşullarını sağlayan konfigürasyon dosyalarına örnekler:
Sanal Sunucu Tanımları:

/etc/apache2/ports.conf

...
 Listen 139.179.39.104:8
 Listen 139.179.39.104:808
 NameVirtualHost 139.179.39.104:80
 NameVirtualHost 139.179.39.104:8080
...

/etc/rc.local

# iptables -t nat -A PREROUTING -s 139.179.0.0/16  \
           -p tcp --dport 80 -j DNAT --to 139.179.39.113:8080
# iptables -A INPUT ! -s 139.179.0.0/16 -p tcp --dport 8080 -j DROP
# mount --bind /var/www /var/wwwpublic
# mount -o remount,ro --bind /var/www /var/wwwpublic

/etc/apache2/sites-enabled/000-default

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/wwwpublic
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/wwwpublic/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
        . . .
</VirtualHost>

/etc/apache2/sites-enabled/private

<VirtualHost *:8080>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
        . . .
</VirtualHost>