OpenLiteSpeed ile IP Bazlı Erişim Kontrolü

Web sunucularında güvenlik deyince akla ilk gelen şeylerden biri IP bazlı erişim kontrolüdür. Belirli IP adreslerini engellemek ya da sadece belirli IP’lere izin vermek, sunucu yöneticilerinin sıklıkla başvurduğu temel güvenlik önlemlerinden birini oluşturur. OpenLiteSpeed’de bu işlemi yapmak Apache veya Nginx’e kıyasla biraz farklı bir yol izliyor ve maalesef dokümantasyonu her zaman yeterince açık değil. Bu yazıda, OpenLiteSpeed üzerinde IP bazlı erişim kontrolünü adım adım, gerçek dünya senaryolarıyla ele alacağız.

OpenLiteSpeed’de Erişim Kontrolü Nasıl Çalışır?

OpenLiteSpeed, erişim kontrolü için .htaccess dosyalarını destekler ancak kendi yapılandırma mekanizması olan httpd_config.conf ve sanal sunucu konfigürasyonları üzerinden de doğrudan kurallar tanımlanabilir. Ayrıca Web Admin Panel (genellikle 7080 portunda çalışır) üzerinden GUI ile de bu işlemler gerçekleştirilebilir.

Erişim kontrolü için iki temel yöntem kullanılır:

  • Mod Rewrite tabanlı IP engelleme: .htaccess ya da sanal sunucu konfigürasyonunda RewriteRule ile
  • Access Control listesi: OpenLiteSpeed’in kendi Access Control mekanizması

Her iki yöntemin de kullanım alanları ve avantajları farklıdır. Performans açısından bakıldığında, konfigürasyon dosyası seviyesindeki kurallar .htaccess bazlı kurallara göre daha hızlı işlenir.

Ön Hazırlık ve Ortam Bilgisi

Bu yazıdaki örnekler Ubuntu 22.04 üzerinde OpenLiteSpeed 1.7.x kurulu bir sunucu varsayılarak hazırlandı. Konfigürasyon dosyaları genellikle şu yollarda bulunur:

  • /usr/local/lsws/conf/httpd_config.conf: Ana konfigürasyon dosyası
  • /usr/local/lsws/conf/vhosts/: Sanal sunucu konfigürasyonları
  • /usr/local/lsws/Example/html/: Varsayılan web kök dizini

Değişiklik yapmadan önce mutlaka yedek almayı alışkanlık haline getirin:

cp /usr/local/lsws/conf/httpd_config.conf /usr/local/lsws/conf/httpd_config.conf.bak
cp -r /usr/local/lsws/conf/vhosts/ /usr/local/lsws/conf/vhosts_bak/

Konfigürasyon değişikliklerinin geçerli olması için OpenLiteSpeed’i yeniden yüklemek gerekir. Tam restart yerine graceful reload tercih edin:

/usr/local/lsws/bin/lswsctrl restart
# veya graceful reload için
kill -USR1 $(cat /usr/local/lsws/logs/lshttpd.pid)

Yöntem 1: .htaccess ile IP Erişim Kontrolü

En pratik ve en yaygın kullanılan yöntem budur. Özellikle paylaşımlı ortamlarda ya da her sanal sunucu için ayrı ayrı kural tanımlamak gerektiğinde .htaccess tercih edilir.

Belirli IP’yi Engellemek

Diyelim ki sunucunuza sürekli botnet trafiği gelen bir IP adresi var. Bu IP’yi engellemek için:

# Web kök dizinindeki .htaccess dosyasını düzenle
nano /var/www/html/.htaccess

Dosyanın içine şunları ekleyin:

# Tek bir IP engelleme
<RequireAll>
    Require all granted
    Require not ip 192.168.1.100
</RequireAll>

Birden fazla IP engellemek için:

<RequireAll>
    Require all granted
    Require not ip 192.168.1.100
    Require not ip 10.0.0.50
    Require not ip 203.0.113.0/24
</RequireAll>

Burada /24 notasyonu bir IP bloğunu ifade eder. 203.0.113.0/24 yazdığınızda 203.0.113.1 ile 203.0.113.254 arasındaki tüm IP’ler engellenir.

Sadece Belirli IP’lere İzin Vermek

Bazen bir admin paneli veya özel bir dizine sadece belirli IP’lerden erişime izin vermek isteyebilirsiniz. Örneğin /wp-admin dizinini sadece ofis IP’nize açmak için:

<Directory /var/www/html/wp-admin>
    <RequireAny>
        Require ip 203.0.113.10
        Require ip 198.51.100.0/24
    </RequireAny>
</Directory>

Bu konfigürasyonla 203.0.113.10 IP’si ve 198.51.100.0/24 bloğundaki IP’ler dışından gelen tüm istekler 403 hatası alır.

Yöntem 2: Sanal Sunucu Konfigürasyon Dosyası ile IP Kontrolü

Bu yöntem daha performanslı çalışır çünkü kurallar sunucu başlatıldığında belleğe alınır ve her istek için dosya okuması yapılmaz. Özellikle yüksek trafikli sitelerde bu fark belirginleşir.

Sanal sunucu konfigürasyon dosyanızı açın:

nano /usr/local/lsws/conf/vhosts/ornek_site/vhconf.conf

İçine aşağıdaki gibi bir rewrite kuralı ekleyebilirsiniz:

rewrite  {
  enable                  1
  rules                   <<<END_rules
# Engellenen IP listesi
RewriteCond %{REMOTE_ADDR} ^(192.168.1.100|10.0.0.50)$
RewriteRule ^.*$ - [F,L]

# Engellenen IP bloğu
RewriteCond %{REMOTE_ADDR} ^203.0.113.
RewriteRule ^.*$ - [R=403,L]
END_rules
}

[F] ve [R=403] bayrakları aynı işlevi görür: istemciye 403 Forbidden yanıtı döner. Ben genellikle [F] kullanmayı tercih ederim, çok az fark olsa da semantik olarak daha doğru.

Yöntem 3: Web Admin Panel Üzerinden IP Erişim Kontrolü

OpenLiteSpeed’in 7080 portundaki yönetim paneli üzerinden de IP kısıtlamaları eklenebilir. Panel üzerinden yapılan değişiklikler konfigürasyon dosyalarına otomatik yazılır.

Panel’e erişin:

https://sunucu_ip:7080

Panele girdikten sonra izleyeceğiniz yol:

  • Virtual Hosts sekmesine gidin
  • İlgili sanal sunucuya tıklayın
  • Security sekmesini seçin
  • Access Control bölümünde kurallarınızı ekleyin

Panel üzerindeki syntax biraz farklıdır. “Allow List” ve “Deny List” olarak iki ayrı alan bulunur. İzin verilen IP’leri Allow List’e, engellenen IP’leri ise Deny List’e yazarsınız. Her satıra bir kural yazılır.

Allow List örneği:

192.168.1.0/24
203.0.113.10

Deny List örneği:

10.0.0.50
198.51.100.0/24
ALL

Dikkat: Deny List’e ALL yazdığınızda ve Allow List’e sadece belirli IP’leri eklediğinizde, sadece o IP’ler erişebilir. Bu, whitelist yapısı oluşturmanın panel üzerindeki yoludur.

Gerçek Dünya Senaryosu 1: Brute Force Saldırısı Sonrası Acil IP Engelleme

Gece yarısı monitoring sisteminden alarm geldi: bir IP adresi dakikada 500 istek gönderiyor ve sunucu CPU’su %90’a ulaştı. İlk yapılacak iş bu IP’yi hemen engellemek.

Önce log dosyasından saldıran IP’yi tespit edin:

# Son 1000 satırda en çok istek atan IP'leri bul
tail -n 1000 /usr/local/lsws/logs/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

IP’yi tespit ettikten sonra .htaccess dosyasına hızlıca ekleyin:

# Mevcut .htaccess dosyasının başına ekleme yap
sed -i '1s/^/<RequireAll>n    Require all grantedn    Require not ip 198.51.100.55n</RequireAll>n/' /var/www/html/.htaccess

Ardından graceful reload yapın:

kill -USR1 $(cat /usr/local/lsws/logs/lshttpd.pid)

Bu komut mevcut bağlantıları kesmeden yeni konfigürasyonu yükler. Acil durumlarda bu yaklaşım hayat kurtarır.

Gerçek Dünya Senaryosu 2: Ülke Bazlı Engelleme (GeoIP ile Kombinasyon)

Tek tek IP engellemek yerine belirli ülkelerden gelen trafiği engellemek istiyorsanız, OpenLiteSpeed ile MaxMind GeoIP2 veritabanını birlikte kullanabilirsiniz. Bu kombinasyon özellikle hedefli saldırıların belirli coğrafyalardan geldiği durumlarda işe yarar.

Önce GeoIP modülünü kurun:

apt-get install libmaxminddb0 libmaxminddb-dev mmdb-bin

OpenLiteSpeed konfigürasyonuna modül tanımını ekleyin:

nano /usr/local/lsws/conf/httpd_config.conf
module mod_maxminddb {
  maxminddb.enable    1
  maxminddb.file      /usr/share/GeoIP/GeoLite2-Country.mmdb
  maxminddb.env       MMDB_ADDR_COUNTRY_ISOCODE Country/IsoCode
}

Artık .htaccess veya sanal sunucu konfigürasyonunda ülke kodunu kullanabilirsiniz:

RewriteEngine On
# Rusya ve Çin'den gelen trafiği engelle (örnek senaryo)
RewriteCond %{ENV:MMDB_ADDR_COUNTRY_ISOCODE} ^(RU|CN)$
RewriteRule ^.*$ - [F,L]

Not: Ülke engelleme kararı verirken dikkatli olun. Bu tür kısıtlamaların meşru kullanıcıları da etkileyebileceğini unutmayın.

Gerçek Dünya Senaryosu 3: Staging Ortamını Sadece Ekibe Açmak

Geliştirme ekibinizin kullandığı bir staging sunucusunu dış dünyadan gizlemek istiyorsunuz. Sadece ofis IP’si ve ekip üyelerinin ev IP’leri erişebilmeli.

Sanal sunucu konfigürasyonunu şöyle düzenleyebilirsiniz:

nano /usr/local/lsws/conf/vhosts/staging/vhconf.conf
context / {
  location                /var/www/staging/html
  allowBrowse             1
  
  rewrite  {
    enable                1
    rules                 <<<END_rules
# Staging ortami - sadece yetkili IP'ler
RewriteCond %{REMOTE_ADDR} !^(203.0.113.10|198.51.100.20|192.168.1.0/24)
RewriteRule ^.*$ - [F,L]
END_rules
  }
}

Bu yapıda ! işareti “değil” anlamına gelir. Yani listede olmayan IP’ler engellenir.

Daha esnek bir yaklaşım için IP listesini ayrı bir dosyada tutabilir ve include edebilirsiniz:

# /usr/local/lsws/conf/allowed_ips.conf dosyası oluştur
echo "203.0.113.10" > /usr/local/lsws/conf/allowed_ips.conf
echo "198.51.100.20" >> /usr/local/lsws/conf/allowed_ips.conf

Dinamik IP Engelleme: Fail2Ban ile OpenLiteSpeed Entegrasyonu

Manuel IP engelleme bir noktadan sonra yönetilemez hale gelir. Otomatik engelleme için Fail2Ban ile OpenLiteSpeed’i entegre etmek çok daha akıllıca bir yaklaşımdır.

Fail2Ban kurulumu:

apt-get install fail2ban

OpenLiteSpeed için özel bir jail tanımı oluşturun:

nano /etc/fail2ban/jail.d/openlitespeed.conf
[openlitespeed-auth]
enabled  = true
port     = http,https
filter   = openlitespeed-auth
logpath  = /usr/local/lsws/logs/error.log
maxretry = 5
bantime  = 3600
findtime = 600
action   = iptables-multiport[name=OLS, port="http,https", protocol=tcp]

Ardından filter dosyasını oluşturun:

nano /etc/fail2ban/filter.d/openlitespeed-auth.conf
[Definition]
failregex = ^.*[.*] [.*] .*authentication.*failed.*from.*<HOST>.*$
            ^.*[.*] SECURITY.*<HOST>.*$
ignoreregex =

Fail2Ban’ı yeniden başlatın:

systemctl restart fail2ban
systemctl enable fail2ban
# Durumu kontrol et
fail2ban-client status openlitespeed-auth

Bu yapıyla Fail2Ban, OpenLiteSpeed log dosyalarını izler ve belirlenen eşiği aşan IP’leri otomatik olarak iptables üzerinden engeller. Ban süresi dolunca engel otomatik kalkar.

IP Engelleme Kurallarını Test Etmek

Kural yazdıktan sonra çalışıp çalışmadığını test etmek kritik önem taşır. Yanlış bir kural tüm sitenizi erişilemez hale getirebilir.

Test için curl kullanın:

# Engellenen bir IP'yi simüle etmek için (eğer test ortamında iseniz)
curl -H "X-Forwarded-For: 192.168.1.100" http://siteniz.com/

# Normal erişim testi
curl -v http://siteniz.com/

# Yanıt kodunu kontrol et
curl -o /dev/null -s -w "%{http_code}" http://siteniz.com/

Konfigürasyon dosyasında söz dizimi hatası olup olmadığını kontrol etmek için:

/usr/local/lsws/bin/lswsctrl configtest

Log dosyalarını takip ederek engellemelerin çalışıp çalışmadığını doğrulayın:

# Erişim logunu canlı izle
tail -f /usr/local/lsws/logs/access.log | grep "403"

# Hata logunu izle
tail -f /usr/local/lsws/logs/error.log

Performans ve Dikkat Edilmesi Gereken Noktalar

Uzun süre uğraştıktan sonra edindiğim bazı pratik bilgileri paylaşmak istiyorum:

  • .htaccess’i minimize edin: Her HTTP isteği için .htaccess dosyası okunur. Kural sayısı arttıkça performans düşer. Mümkünse kuralları sanal sunucu konfigürasyonuna taşıyın.
  • IP bloklarını akıllıca kullanın: Tek tek IP engellemek yerine mümkün olduğunca CIDR notasyonuyla blok engellemeleri yapın. 10.0.0.0/8 yazmak, bu aralıktaki 16 milyonu aşkın IP için tek satır demektir.
  • Cloudflare veya CDN kullanıyorsanız dikkat: CDN arkasında çalışan sitelerde REMOTE_ADDR gerçek kullanıcı IP’sini değil CDN IP’sini gösterir. Bu durumda X-Forwarded-For veya CF-Connecting-IP başlığını kullanmanız gerekir. OpenLiteSpeed’in useIpInHeader direktifi bu konuda yardımcı olur.
  • IPv6’yı unutmayın: Sadece IPv4 engellemesi yapmak yetmez. Saldırganlar IPv6 üzerinden erişmeye devam edebilir. Kurallarınızı her iki protokol için de tanımlayın.
  • Whitelist yaklaşımını tercih edin: Mümkün olan yerlerde “herkese izin ver, şunları engelle” yerine “herkesi engelle, şunlara izin ver” mantığını benimseyin. Özellikle hassas admin panelleri için bu yaklaşım çok daha güvenlidir.
  • Kendi IP’nizi engellemeyin: Bu kulağa basit gelebilir ama gece yarısı aceleyle yapılan değişikliklerde en sık yapılan hatalardan biridir. Değişiklik yapmadan önce kendi IP adresinizi not alın.

Sorun Giderme

Sık karşılaşılan sorunlar ve çözümleri:

Kural yazıldı ama çalışmıyor:

OpenLiteSpeed’in .htaccess desteğinin aktif olduğunu kontrol edin. Sanal sunucu konfigürasyonunda allowOverride değerinin doğru ayarlı olması gerekir:

# vhconf.conf içinde kontrol edilmesi gereken direktif
allowOverride               1

403 yerine 404 dönüyor:

Rewrite kuralındaki bayrakları kontrol edin. [F] 403, [R=404] ise 404 döndürür.

Graceful reload sonrası kurallar aktif olmuyor:

Bazı durumlarda graceful reload yetmez, tam restart gerekebilir:

/usr/local/lsws/bin/lswsctrl stop
sleep 2
/usr/local/lsws/bin/lswsctrl start

Log dosyasında kural tetiklenmesi görünmüyor:

Debug loglamayı geçici olarak aktif edin:

nano /usr/local/lsws/conf/httpd_config.conf
# debugLevel değerini 10 yapın (sadece test için, production'da 0 olmalı)

Sonuç

OpenLiteSpeed’de IP bazlı erişim kontrolü, ilk bakışta karmaşık görünebilir ama doğru yöntemle yaklaştığınızda oldukça güçlü ve esnek bir yapı elde ediyorsunuz. .htaccess hızlı müdahaleler için ideal olsa da kalıcı ve performanslı çözümler için sanal sunucu konfigürasyon dosyaları tercih edilmelidir.

Gerçek bir üretim ortamında tek başına IP engelleme yeterli olmaz. Fail2Ban ile otomatizasyon, GeoIP ile coğrafi kısıtlama ve Cloudflare gibi servislerin WAF özellikleriyle bu temel yapıyı katmanlandırmanız gerekir. Güvenlik her zaman katmanlı düşünülmelidir.

Son olarak şunu vurgulamak isterim: her değişiklikten önce yedek alın, her kuralı test edin ve kendi erişiminizi hiçbir zaman kesmeyin. Gece yarısı kendi sunucusundan kilitlenmiş bir sysadmin olmak, anlatması eğlenceli ama yaşaması oldukça sinir bozucu bir deneyimdir.

Yorum yapın