Laravel İle Dinamik Bir Güvenlik Duvarı Ve İp Engelleme Sistemi Nasıl Yapılır?

Laravel İle Dinamik Bir Güvenlik Duvarı Ve İp Engelleme Sistemi Nasıl Yapılır?
Laravel İle Dinamik Bir Güvenlik Duvarı Ve İp Engelleme Sistemi Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Bu projeyi hayata geçirmek için Laravel 11 veya 12 sürümünün yüklü olduğu bir çalışma ortamına ihtiyacınız vardır. Ayrıca veritabanı işlemleri için MySQL veya PostgreSQL kullanıyor olmanız önerilir. İşlemlere başlamadan önce projenizin kurulu olduğundan ve veritabanı bağlantınızın yapılandırıldığından emin olun.

  • Laravel 11+ yüklü bir proje ortamı.
  • PHP 8.3 veya üzeri bir sürüm.
  • Veritabanı erişimi (Migration ve Model yönetimi için).
  • Redis (Opsiyonel ancak performans için önerilir).

IP Engelleme İçin Veritabanı Yapısını Oluşturma

Dinamik bir sistem için engellenen IP adreslerini bir tabloda tutmamız gerekir. Bu tablo, IP adresi, engellenme nedeni ve engelin ne zaman sona ereceği gibi bilgileri içermelidir. Laravel'in Migration (göç) özelliğini kullanarak bu tabloyu oluşturalım.

php artisan make:migration create_blocked_ips_table

Oluşturulan dosyanın içine aşağıdaki sütunları ekleyerek veritabanı şemanızı tanımlayın:

public function up(): void
{
    Schema::create('blocked_ips', function (Blueprint $table) {
        $table->id();
        $table->string('ip_address')->unique();
        $table->string('reason')->nullable();
        $table->timestamp('expires_at')->nullable();
        $table->timestamps();
    });
}

Bu yapı, IP adreslerini benzersiz (unique) kılar ve geçici engellemeler için bir zaman damgası tutmamıza olanak tanır. "expires_at" alanı, engelin otomatik olarak kalkmasını sağlamak için kritik bir öneme sahiptir.

IP Filtreleme İçin Middleware Oluşturma

Laravel'de gelen istekleri (request) kontrol etmek için en doğru yer Middleware katmanıdır. İstek uygulamaya ulaşmadan önce IP adresinin engelli olup olmadığını kontrol edeceğiz.

php artisan make:middleware CheckBlockedIp

Oluşturulan app/Http/Middleware/CheckBlockedIp.php dosyasını şu şekilde güncelleyin:

namespace App\Http\Middleware;

use Closure;
use App\Models\BlockedIp;
use Illuminate\Http\Request;

class CheckBlockedIp
{
    public function handle(Request $request, Closure $next)
    {
        $ip = $request->ip();
        
        $isBlocked = BlockedIp::where('ip_address', $ip)
            ->where(function ($query) {
                $query->whereNull('expires_at')
                      ->orWhere('expires_at', '>', now());
            })->exists();

        if ($isBlocked) {
            return response()->json(['message' => 'Erişiminiz engellenmiştir.'], 403);
        }

        return $next($request);
    }
}

Bu kod bloğu, kullanıcının IP adresini alır ve veritabanında aktif bir engeli olup olmadığını sorgular. Eğer engel varsa, kullanıcıya 403 (Forbidden) hatası döner.

Middleware'i Sisteme Entegre Etme

Middleware'i yazdık ancak Laravel'in bunu kullanması için bootstrap/app.php dosyasında tanımlamamız gerekir. Laravel 11 ve sonrası mimaride middleware tanımlamaları burada yapılır.

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'check.blocked.ip' => \App\Http\Middleware\CheckBlockedIp::class,
    ]);
})

Artık bu middleware'i rotalarınızda (routes) veya tüm uygulama genelinde kullanabilirsiniz. Tüm uygulamayı korumak için web.php içerisinde global olarak tanımlayabilir veya sadece belirli rotalara ekleyebilirsiniz.

Dinamik Engelleme Mantığı ve Yönetim Paneli

IP adreslerini manuel olarak eklemek yerine, bir controller aracılığıyla dinamik olarak engelleme yapabilirsiniz. Aşağıdaki örnek, belirli bir IP'yi veritabanına ekleyen basit bir mantığı gösterir.

public function blockIp(Request $request)
{
    $validated = $request->validate([
        'ip_address' => 'required|ip',
        'reason' => 'nullable|string'
    ]);

    BlockedIp::updateOrCreate(
        ['ip_address' => $validated['ip_address']],
        ['reason' => $validated['reason'], 'expires_at' => now()->addDays(7)]
    );
}

Bu fonksiyon, bir IP'yi 7 gün süreyle engeller. Eğer IP zaten engelliyse, süresini günceller. Bu yapıyı bir admin panelinde kullanarak, şüpheli hareketler sergileyen kullanıcıları anlık olarak engelleyebilirsiniz.

Güvenlik Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
Veritabanı (DB) Dinamik ve esnek yönetim. Her istekte SQL sorgusu çalıştırır.
Redis (Cache) Çok hızlı, sunucu yükü düşük. Karmaşık verileri saklamak zor olabilir.
Sunucu Seviyesi (Nginx) Laravel'e hiç ulaşmadan engeller. PHP ile yönetimi daha zordur.

Kritik Güvenlik Uyarısı: Veritabanı sorgularınızda her zaman Laravel'in Eloquent ORM yapısını kullanın. Doğrudan ham SQL sorguları yazmaktan kaçının; bu, SQL Injection saldırılarına kapı aralayabilir. Ayrıca, kullanıcı girdilerini her zaman doğrulayın (validation).

Sıkça Sorulan Sorular

IP engelleme sistemi performansı nasıl etkiler?

Her istekte veritabanına gitmek küçük bir gecikmeye neden olur. Yüksek trafikli sitelerde, IP listesini Redis üzerinde tutarak veritabanı sorgularını azaltmanız önerilir.

Engellenen kullanıcıya özel bir sayfa gösterebilir miyim?

Evet, response()->json() yerine response()->view('errors.blocked') kullanarak özel tasarlanmış bir hata sayfası döndürebilirsiniz.

Kendi IP adresimi yanlışlıkla engellersem ne yapmalıyım?

Sunucu terminalinden php artisan tinker komutunu kullanarak veritabanındaki engelli IP'leri manuel olarak silebilirsiniz.

Bu sistem botları engellemek için yeterli mi?

Temel seviyede evet, ancak gelişmiş botlar IP değiştirebilir. Bu sistemin yanına bir "Rate Limiting" (istek sınırlama) mekanizması da eklemeniz önerilir.

IPv6 adreslerini destekliyor mu?

Laravel'in $request->ip() metodu hem IPv4 hem de IPv6 adreslerini otomatik olarak destekler.

İleri Seviye İzleme ve Hata Ayıklama Stratejileri

Dinamik bir IP engelleme sistemi kurduğunuzda, sistemin arka planda nasıl çalıştığını gözlemlemek ve olası yanlış engellemeleri (false-positive) tespit etmek kritik öneme sahiptir. Laravel'in loglama mekanizmasını kullanarak, engellenen her isteği kayıt altına alabilir ve bu verileri analiz ederek saldırı paternlerini belirleyebilirsiniz.

Aşağıdaki örnekte, IpBlockingMiddleware içerisine basit bir loglama mekanizmasını nasıl entegre edebileceğinizi görebilirsiniz:

use Illuminate\Support\Facades\Log;

public function handle($request, Closure $next)
{
    $ip = $request->ip();

    if ($this->isBlocked($ip)) {
        Log::warning('Engellenen IP erişimi tespit edildi:', [
            'ip' => $ip,
            'url' => $request->fullUrl(),
            'user_agent' => $request->userAgent()
        ]);

        abort(403, 'Erişiminiz sistem yöneticisi tarafından engellenmiştir.');
    }

    return $next($request);
}

Bu loglar sayesinde, uygulamanıza yönelik kaba kuvvet (brute-force) saldırılarının hangi saatlerde yoğunlaştığını ve hangi URL'lerin hedef alındığını storage/logs/laravel.log dosyası üzerinden takip edebilirsiniz.

Dağıtılmış Sistemlerde IP Filtreleme ve Proxy Yönetimi

Uygulamanız bir Load Balancer (AWS ALB, Cloudflare, Nginx Reverse Proxy) arkasında çalışıyorsa, $request->ip() metodu her zaman gerçek kullanıcı IP'sini döndürmeyebilir. Bu durumda, proxy tarafından iletilen X-Forwarded-For başlığını güvenilir bir şekilde okumanız gerekir.

Laravel'de bu sorunu çözmek için app/Http/Middleware/TrustProxies.php dosyasını yapılandırmanız şarttır. Aksi takdirde, sisteminiz tüm trafiği Load Balancer'ın IP'si olarak görecek ve yanlışlıkla tüm kullanıcılarınızı engelleyebilecektir.

// app/Http/Middleware/TrustProxies.php

protected $proxies = '*'; // Veya spesifik IP aralıkları

protected $headers = Request::HEADER_X_FORWARDED_FOR | 
                     Request::HEADER_X_FORWARDED_HOST | 
                     Request::HEADER_X_FORWARDED_PORT | 
                     Request::HEADER_X_FORWARDED_PROTO;

Bu yapılandırma, uygulamanızın gerçek istemci IP'sini doğru şekilde çözümlemesini sağlar. Eğer Cloudflare kullanıyorsanız, $proxies değişkenine Cloudflare'in IP aralıklarını tanımlamak, güvenlik katmanınızı çok daha sağlam hale getirecektir.

Test Senaryoları ve Doğrulama

Sisteminizi canlıya almadan önce mutlaka birim testleri (Unit Tests) ile doğrulamalısınız. Laravel'in yerleşik test araçları, middleware'in beklenen şekilde çalışıp çalışmadığını kontrol etmek için mükemmeldir:

public function test_blocked_ip_cannot_access_route()
{
    // Veritabanına sahte bir engelli IP ekleyin
    BlockedIp::create(['ip' => '192.168.1.1']);

    $response = $this->withServerVariables(['REMOTE_ADDR' => '192.168.1.1'])
                     ->get('/');

    $response->assertStatus(403);
}

Bu test, sistemin veritabanındaki engelli listesini doğru okuduğunu ve engellenen IP'ye 403 hatası döndürdüğünü garanti eder. Bu tür testleri CI/CD süreçlerinize dahil ederek, gelecekteki güncellemelerde güvenlik katmanınızın bozulmadığından emin olabilirsiniz.

Sonuç

Laravel ile dinamik bir IP engelleme sistemi kurmak, uygulamanızın güvenliğini sağlamak adına atabileceğiniz en etkili adımlardan biridir. Middleware mimarisini ve veritabanı yönetimini kullanarak, şüpheli trafiği daha uygulamanızın çekirdeğine ulaşmadan durdurabilirsiniz. Bir sonraki adım olarak, bu sistemi "Rate Limiting" ile birleştirerek, belirli bir IP'nin saniyede yaptığı istek sayısını kısıtlayan daha gelişmiş bir yapı kurmayı deneyebilirsiniz.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri genel eğitim amaçlıdır. Canlıya almadan önce kendi güvenlik gereksinimlerinize göre test etmeli ve sistemin işleyişini doğrulamalısınız. Yanlış yapılandırmalar kullanıcı erişimini kısıtlayabilir.

Bu yazıya tepkinizi paylaşın:
Selin Demir

Sürdürülebilir yaşam ve kişisel verimlilik üzerine odaklanan bir içerik üreticisiyim. Zaman yönetimi ve organizasyonel ipuçları konusunda okuyuculara yol gösteriyorum.

Yorumlar (0)

Yorum Yaz