Bevezetés

A Traffic Cop egy biztonsági WordPress bővítmény, amely első sorban fejlesztőknek, üzemeltetőknek készült. Az alábbi oldalon a bővítmény - első sorban - technikai dokumentációja található.

Licenc beszerzése és beállítások

A licenc beszerzését és a beállításokat a telepítés előtt kell elvégeznünk.

  • Regisztráció a Shop-ban
  • Megerősítő linkre kattintás az kapott email-ben
  • Bejelentkezés a Shop-ba
  • Számlázási profil létrehozása a Shop-ban
  • Termék vásárlás a Shop-ban
  • Fizetés bankkártyával vagy átutalással
  • Licenc kiválasztása a Shop-ban
  • Licenc aktiválás WordPress URL (nem a Site Address) beírással a Shop-ba
  • Bővítmény letöltése a Shop-ból
  • Bővítmény feltöltése és aktiválása WordPress-ben
  • Licenc kulcs kimásolás a Shop-ból
  • Licenc kulcs beállítás WordPress-ben

Licenc vásárlása

A bővítményt licenc formájában lehet megvásárolni. A vásárlást a Cone Shop felületén lehet megtenni: https://shop.conedevelopment.com/traffic-cop. Regisztráció, bejelentkezés, majd a számlázási adatok megadása után a kívánt oldalszámban lehet licencet vásárolni.

A vásárlást követően a rendszer automatikusan létrehozza a licenc kulcsot, amelyhez előbb aktiválni kell az áruház URL-jét, majd a bővítmény telepítése után meg kell adni a licenckulcsot.

URL/domain aktiválása

A korábban vásárolt licenceket a https://shop.conedevelopment.com/account/licenses linken érjük el.

Egy-egy licencen belül hozzá tudjuk rendelni áruházunk URL-jét a licenc kulcshoz, így a későbbi aktiválás sikeresen megtörtént.

Telepítés

A telepítést a beszerzés és a beállítások elvégzése után tudjuk elvégezni.

WordPress bővítménykezelőn keresztül

A licenc beállítás oldalán a kívánt verziót kiválasztva letölthetjük a bővítményt, amelyet már telepíteni lehet a WordPress példányra.

Letöltés után keressük meg a letöltött .zip fájlt és töltsük fel a kiszemelt WordPress példányra.

  1. Navigáljunk a Bővítmények / Új hozzáadása menüpontra.
  2. Kattintsunk felül a címsorban található Bővítmény feltöltése gombra.
  3. Az újonnan kinyílt szekcióban kattintsunk a fájl kiválasztására, majd tallózzuk be a korábban letöltött fájlt.
  4. Kattintsunk a Telepítés most gombra.

A feltöltés után kapunk egy képernyőt, ahol láthatjuk, hogy a bővítményt sikeresen telepítettük. Ez csupán egy egyszerű oldal, ahol a telepítés folyamatait tudjuk végigkísérni.

Ahogy ezen a képernyőn láthatod, egyből tudod is aktiválni. Kattints a Bővítmény bekapcsolása gombra és már fut is a Traffic Cop bővítményed.

Ha elmulasztod az aktiválást ezen az oldalon, akkor a Bővítmények / Telepített bővítmények menüpont alatt mindig tudod aktiválni (ki/be kapcsolni, törölni, frissíteni).

Aktiválás után a bővítmény beállításait a Beállítások / Traffic Cop menü alatt találod meg.

Itt tudod hozzárendelni a licenc kulcsot a bővítményhez. Ez fontos lépés, mert érvényesítés nélkül nem működik a bővítmény, illetve frissítéseket sem lehet letölteni a WordPress rendszerén keresztül.

Composer csomagkezelőn keresztül

A Composer egy elterjedt csomagkezelő PHP alkalmazásokhoz. Előfordul, hogy a WordPress példányt és annak függőségeit Composer-rel szeretnénk kezelni.

Az alábbi minta composer.json bemutatja, hogy a conedevelopment/traffic-cop repository-t hogyan szükséges paraméterezni, hogy a megfelelő helyről töltse le a kívánt állományt.

{
    "name": "conedevelopment/example-wp-composer",
    "description": "Example WordPress with Composer",
    "license": "MIT",
    "require": {
        "php": "^8.3.0",
        "conedevelopment/traffic-cop": "^1.0.0",
        "roots/wordpress": "^6.6.0"
    },
    "minimum-stability": "beta",
    "config": {
        "preferred-install": {
            "*": "dist"
        },
        "allow-plugins": {
            "composer/installers": true,
            "ffraenz/private-composer-installer": true,
            "roots/wordpress-core-installer": true
        }
    },
    "extra": {
        "installer-paths": {
            "wp-content/mu-plugins/{$name}/": [
                "type:wordpress-muplugin"
            ],
            "wp-content/plugins/{$name}/": [
                "type:wordpress-plugin"
            ],
            "wp-content/themes/{$name}/": [
                "type:wordpress-theme"
            ]
        }
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://wpackagist.org"
        },
        {
            "type": "package",
            "package": {
                "name": "conedevelopment/traffic-cop",
                "version": "1.0.0",
                "type": "wordpress-plugin",
                "dist": {
                    "type": "zip",
                    "url": "https://shop.conedevelopment.com/api/packages/{%CONE_LICENSE_KEY}/download?type=composer&version=v{%VERSION}"
                },
                "require": {
                    "composer/installers": "^2.3.0",
                    "ffraenz/private-composer-installer": "^5.0"
                }
            }
        }
    ]
}

A {%VERSION} változó a version kulcs értékét adja vissza, jelen esetben a 1.0.0-t. A {%CONE_LICENSE_KEY} értékét viszont nem javasolt közvetlenül a composer.json-ban tárolni (főleg ha ez a git-ben is tárolva van), hanem érdemes valamilyen környezeti változóba szervezni. Ez lehet egy .env változó, vagy valamilyen CI (GitHub Actions, GitLab CI, stb.) környezeti változója:

# Nem valós licenc kulcs!

CONE_LICENSE_KEY=eb819bed-ba18-4e60-9d95-d6d6b5d4364c

WAF

A WAF (Web Application Firewall) funkció lényege, hogy a HTTP kéréseket bizonyos szabályok alapján szűrje, és azok a kéréseket amelyek fennakadnak a szűrőn blokkolja, mielőtt terhelést jelentene a szerverre.

Ideális esetben ez a funkció nem a WordPress-en belül van megoldva, de osztott tárhelyek esetén gyakran előfordul, hogy a WAF nem elérhető, így egy alternatív megoldásra van szükség. A bővítmény ezt az alternatívát kínálja.

A működése nagyon egyszerű: egy ~10 éve, folyamatosan frissen tartott IP cím listából dolgozik, amely lista a kártyékony HTTP kéréseket küldő IP címeket tartalmazza. Abban az esetben ha az IP cím szerepel valamelyik tartományban a HTTP kérésre 403-as (Forbidden) HTTP válasz ad a bővítmény, így minimalizálva a terhelést a szerveren.

Beállítások

A WAF beállításai a BeállításokTraffic CopWAF menüpontban található.

Rate Limiter

A Rate Limiter funkció arra hivatott, hogy bizonyos HTTP kéréseket (pl.: Bot kéréseket) egy adott időablakban (pl.: 10 másodperc) limitáljon (pl.: 3 kérés az adott ablakban).

Erre azért van szükség, mert a tartalmat elemző botok (pl.: Google bot, Facebook bot) komoly terhelést képesek kiváltani az adott szerveren nagyon rövid idő alatt. Ez lassítja az oldalt és a minden folyamatot amely rontja a felhasználói élményt, esetenként használhatatlanná teszi a felületet.

Jelenleg három Rate Limiter megoldás közül lehet választani: Transient, Redis és Shmop.

Környezeti beállítások .htaccess segítségével

Amennyiben szeretnénk, úgy a kívánt szabályoknak megfelelő értékeket adhatunk át a Rate Limiternek az .htaccess segítségével. Például:

RewriteCond %{HTTP_USER_AGENT} "^Mozilla.*(Chrome|Firefox|Safari)"
RewriteCond %{HTTP_ACCEPT_LANGUAGE} "^$"
RewriteCond %{HTTP_ACCEPT_ENCODING} "^gzip$"
RewriteCond %{HTTP_CONNECTION} "^keep-alive$"
RewriteCond %{HTTP_REFERER} "."
RewriteRule ^ - [E=RATE_LIMIT_KEY:Chinese-attacker,E=RATE_LIMIT_INTERVAL:10,E=RATE_LIMIT_LIMIT:1]

Fontos, hogy minden esetben a RATE_LIMIT_KEY, a RATE_LIMIT_INTERVAL és a RATE_LIMIT_LIMIT env változókat kell megadni.

Transient Driver

A tranziensek a WordPress core részét képzik. Ezt az opciót előzetes beállítás és konifurálás nélkül használni lehet.

Redis Driver

A Redis egy nyílt forráskódú, in-memory, NoSQL kulcs-érték tároló, amely gyors adatfeldolgozást biztosít. Rugalmassága és gyorsasága miatt olyan esetekben ajánlott, amikor az oldal nagyobb forgalmat bonyolít.

A driver használatának előfeltétele, a redis PHP extension megléte és a megfelelő konfiguráció a wp-config.php fájlban:

// pl.:
define('TRAFFIC_COP_REDIS_CONFIG', [
    'host' => '127.0.0.1',
    'port' => 6379,
    'auth' => 'password', // ['user', 'password']
    'database' => 0,
]);

Shmop Driver

A "shmop" (shared memory operation) egy PHP bővítmény, amely lehetővé teszi Unix alapú rendszereken a megosztott memória szegmensek egyszerű kezelését. PHP-ben használható funkciókat biztosít a megosztott memória szegmensek olvasásához, írásához, létrehozásához és törléséhez.

A driver használatának előfeltétele, a shmop megléte.

Beállítások

A Rate Limiter beállíásai a BeállításokTraffic CopRate Limiter menüpontban található.

Hook index

A bővítmény lehetőséget nyújt arra, hogy filtereken keresztül irányítsuk a működést. A hookok megfelelő használatával akár egészen egyedi megoldásokat is alkalmazhatunk.

traffic-cop_waf_ip (Filter)

Amennyiben egyedi logika alapján szeretnénk feloldani az IP címet, úgy ezt a traffic-waf_ip filterrel megtehetjük:

add_filter('traffic-cop_waf_ip', function (string $ip): string {
    return $ip;
});

traffic-cop_waf_blocked (Action)

Amennyiben műveletet szeretnénk elvégezni abban az esetben, amikor a WAF blokkolt egy HTTP kérést, úgy ezt a traffic-cop_waf_blocked action-nel megtehetjük:

add_action('traffic-cop_waf_blocked', function (string $rule, string $value): void {
    match ($rule) {
        'ip_rule' => handleIpRule($value),
        'uri_rule' => handleUriRule($value),
        default => null,
    };
});

traffic-cop_waf_ip_bypass (Filter)

Amennyiben egy adott IP címet átengedni vagy éppen ellenkezőleg, blokkolni szeretnénk - függetlenül attól, hogy szerepel-e az IP listában - úgy ezt a traffic-cop_waf_ip_bypass filterrel megtehetjük:

add_filter('traffic-cop_waf_ip_bypass', function (?bool $pass, string $ip): ?bool {
    return match (true) {
        in_array($ip, $enabled) => true,
        in_array($ip, $blocked) => false,
        default => $pass,
    };
}, 10, 2);

traffic-cop_rate_limiter_key (Filter)

Amennyiben módosítani szeretnénk a Rate Limiter kulcsát (tehát azt az értéket ami alapján megkülönböztetjük az egyes HTTP kéréseket), úgy ezt a traffic-cop_rate_limiter_key filterrel megtehetjük:

add_filter('traffic-cop_rate_limiter_key', function (string $key): string {
    return $_SERVER['REMOTE_ADDR'];
});

traffic-cop_rate_limiter_limit (Filter)

Amennyiben módosítani szeretnénk az adott kulcsra vonatkoztó limitet az adott intervallumban, úgy ezt a traffic-cop_rate_limiter_limit filterrel megtehetjük:

add_filter('traffic-cop_rate_limiter_limit', function (int $limit): int {
    return match (true) {
        isBot() => 1,
        default => $limit,
    };
});

traffic-cop_rate_limiter_interval (Filter)

Amennyiben módosítani szeretnénk az intervallumot, úgy ezt a traffic-cop_rate_limiter_interval filterrel megtehetjük:

add_filter('traffic-cop_rate_limiter_interval', function (int $interval): int {
    return match (true) {
        isBot() => 10,
        default => $interval,
    };
});

traffic-cop_should_be_rate_limited (Filter)

Amennyiben egyedi logikával irányítani szeretnénk, hogy mely kérések esetén lépjen életbe a rate limit, úgy ezt a traffic-cop_rate_limited filterrel megtehetjük:

add_filter('traffic-cop_rate_limited', function (bool $limited): bool {
    return match (true) {
        isBot() => true,
        default => false,
    };
});

traffic-cop_rate_limit_hit (Action)

Amennyiben műveletet szeretnénk elvégezni abban az esetben, ha a Rate Limiter lefutott, úgy ezt a traffic-cop_rate_limit_hit action-nel megtehetjük:

add_action('traffic-cop_rate_limit_hit', function (string $ip): void {
    //
});

traffic-cop_rate_limit_blocked (Action)

Amennyiben műveletet szeretnénk elvégezni abban az esetben, ha a Rate Limiter elérte a limitet és blokkolta a kérést, úgy ezt a traffic-cop_rate_limit_blocked action-nel megtehetjük:

add_action('traffic-cop_rate_limit_blocked', function (string $ip): void {
    //
});