Protezione dai tentativi di bypass del DNS tramite il token sicuro “x-ch-no-bypass”.

Introduzione

Questa guida spiega come proteggere la propria origine dai tentativi di bypass del DNS. L'implementazione del x-ch-no-bypass L'intestazione non è obbligatoria per nessuna integrazione con CrowdHandler, ma aggiunge un ulteriore livello di verifica sul tuo server di origine ed è consigliata.

A quali tipi di integrazione si riferisce questo articolo?

Cosa si intende per "tentativi di aggirare il DNS"?

L'integrazione di CrowdHandler nella tua CDN rende difficile aggirare i controlli di CrowdHandler. Tuttavia, un utente determinato che riesca a rintracciare le informazioni di rete relative alla tua infrastruttura potrebbe essere in grado di instradare il traffico aggirando l'endpoint della tua CDN, saltando così tutte le misure di protezione da essa offerte, compresa l'integrazione con CrowdHandler.

Come funziona

Una volta configurata, l'integrazione con CrowdHandler aggiunge un'intestazione denominata x-ch-no-bypass a ogni richiesta inoltrata alla tua applicazione. Il suo valore è il tuo token anti-bypass. Con poche righe di codice, la tua applicazione verifica che le richieste contengano l'intestazione con il valore previsto e respinge quelle che non lo contengono. Solo le richieste che sono passate attraverso CrowdHandler raggiungono la tua applicazione.

Appcelerator (DNS) con Cloudflare o Imperva come proxy

Se il tuo DNS punta a Cloudflare o Imperva e tale servizio inoltra il traffico a CrowdHandler, imposta il dominio Tipo di configurazione a Cloudflare o Imperva nel pannello di controllo di CrowdHandler. In tale modalità, CrowdHandler non aggiunge il proprio x-ch-no-bypass intestazione. L'intestazione impostata in Cloudflare o Imperva viene invece inoltrata all'origine senza alcuna modifica.

La verifica di tale valore presso il tuo server di origine dimostra quindi che la richiesta è passata sia attraverso il tuo servizio a monte che attraverso CrowdHandler. Una richiesta che raggiunge direttamente CrowdHandler, bypassando Cloudflare o Imperva, arriva al tuo server di origine senza intestazione e viene respinta.

Se l'opzione "Setup Type" rimane impostata su "Direct DNS", CrowdHandler aggiunge il proprio token e sovrascrive qualsiasi intestazione con lo stesso nome che riceve.

Dove posso trovare il mio token?

Appcelerator (DNS): apri la pagina delle impostazioni del dominio nel pannello di controllo di CrowdHandler ed espandi la sezione "Opzioni". Il token si trova nel campo " No-Bypass Token ".

Se il tipo di configurazione è Cloudflare o Imperva, in quel campo compare la dicitura "Inoltrato da Cloudflare" o "Inoltrato da Imperva". In tal caso non è presente alcun token CrowdHandler. Il valore da verificare è quello che hai configurato a monte.

Pannello delle opzioni che mostra il campo "Token senza bypass"

Altre integrazioni CDN (Akamai, Cloudflare, CloudFront): la rispettiva guida all'installazione spiega dove impostare il token. Il valore lo scegli tu.

Esempi di integrazione

Verifica della presenza e del valore del x-ch-no-bypass L'intestazione della richiesta è semplice nella maggior parte dei linguaggi di programmazione e dei server web. Sostituisci VALORE DEL TUO TOKEN con il tuo token.

Apache

RewriteEngine On

# Block if the x-ch-no-bypass request header does not match
RewriteCond %{HTTP:x-ch-no-bypass} !^(YOURTOKENVALUE)$
RewriteRule ^ - [F]

Nginx

location / {

    if ($http_x_ch_no_bypass != "YOURTOKENVALUE") {
        return 403;
    }

    proxy_pass http://app:3000/;
}

Express.js

app.get('/', (req, res) => {
    if (req.header('x-ch-no-bypass') !== "YOURTOKENVALUE") {
        return res.status(403).send("Sorry! You can't see that.");
    }
    res.sendFile(__dirname + "/views/index.html");
});

PHP

function getRequestHeaders() {
    $headers = array();
    foreach ($_SERVER as $key => $value) {
        if (substr($key, 0, 5) <> 'HTTP_') {
            continue;
        }

        $header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
        $headers[$header] = $value;
    }
    return $headers;
}

$headers = getRequestHeaders();

if (($headers['X-Ch-No-Bypass'] ?? '') != "YOURTOKENVALUE") {
    header("HTTP/1.1 403 Forbidden");
    exit;
}

Python (Django)

da django.http import HttpResponseForbidden
da django.http import HttpResponse

def index(request):
    ch_bypass_key = request.META.get('HTTP_X_CH_NO_BYPASS')
    if ch_bypass_key != "YOURTOKENVALUE":
        return HttpResponseForbidden()
    return HttpResponse("Hello world!")

Cosa protegge e cosa non protegge l'intestazione

Il x-ch-no-bypass Il controllo viene eseguito a livello dell'origine, quindi si applica solo alle richieste che raggiungono l'origine. Da ciò derivano due conseguenze.

La sala d'attesa è sempre obbligatoria. CrowdHandler verifica ogni richiesta a livello di perimetro prima che avvenga qualsiasi altra cosa, comprese le richieste di contenuti memorizzati nella cache. Un visitatore non può saltare la coda trovando una copia memorizzata nella cache.

I contenuti memorizzati nella cache saltano il controllo dell'origine. Se un percorso è impostato per la memorizzazione nella cache, la prima richiesta lo recupera dall'origine, dove l'intestazione viene convalidata, mentre le richieste successive vengono servite dalla cache del CDN senza tornare all'origine. Pertanto, una richiesta che ha saltato il CDN potrebbe ricevere una copia già memorizzata nella cache di quel percorso. È così che funziona qualsiasi cache CDN, non è una caratteristica specifica di CrowdHandler. Se una pagina deve essere convalidata ad ogni richiesta, disattiva la memorizzazione nella cache per quella pagina. Per Appcelerator, si tratta della colonna “Cache Policy” (Politica di cache) nelle “Advanced Behaviour Rules” (Regole di comportamento avanzate); per impostazione predefinita, i nuovi domini non memorizzano nulla nella cache.