Table of Contents

Codeschnipsel für nginx Konfigurationen

Einige nützliche Codeschnipsel für Methoden und Aufgaben mit nginx.

nginx Version nicht senden

server_tokens off;

SSL/TLS erzwingen

# enforce SSL
server {
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
}

Mit obigem Code im http{}-Block vor allen anderen server{}-Blöcken wird für alle definierten Hosts, auf die nginx antwortet, Verschlüsselung via https erzwungen. Funktioniert sowohl mit IPv4 als auch IPv6.

Crawler verbieten

# disallow all kind of automated crawlers
location /robots.txt {
    return 200 "User-agent: *\nDisallow: /";
}

Der Code liefert automatisch innerhalb des zugehörigen server{} eine robots.txt zurück, die automatisierte Crawler generell verbietet, ohne dass sich diese Datei auf dem Server selbst befinden muss.

Text anstatt Datei zurückliefern

location / {
    return 200 "Welcome to this webpage!";
    add_header Content-Type text/plain;
}

Soll anstelle einer Webseite beispielsweise ein Platzhaltertext zurückgeliefert werden, kann dies mithilfe des passenden Headers umgesetzt werden. In diesem Fall wird die Rückgabe im Fall des Aufrufs des root-Verzeichnisses ausgeben.

Security Header

# Add headers to serve security related headers
add_header X-Frame-Options DENY;
add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'" always;  # enforce TLS on all assets and prevent mixed content warnings
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Download-Options noopen;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always;

Von mir verwendete Header-Instruktionen, die die Sicherheit erhöhen. So wird das Einbinden fremder Seiten/Inhalte via Frames verboten (XSS), CSP-Richtlinien zum sicheren Nachladen von Inhalten gesetzt, https-Verbindungen bei zukünftigen Besuchen erzwungen und mehr.

Reverse Proxy

server {
    listen 80;
    listen [::]:80;
    listen 443;
    listen [::]:443;
    server_name domain.tld *.domain.tld example.com;
 
    ssl off;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Permitted-Cross-Domain-Policies none;
 
    location / {
        proxy_pass http://192.168.123.123:80$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Server-Block zur Einrichtung von nginx als Reverse Proxy. Dabei wird sowohl IPv4, IPv6, SSL/TLS-Verschlüsselung als auch unverschlüsselte Verbindungen abgedeckt (entsprechende listen-Direktiven).

Durch die hinzugefügten Header und ssl off werden global definierte Absicherungen wie HSTS oder CSP-Richtlinien außer Kraft gesetzt, sollten sie gesetzt sein. Allgemein verwendet nginx erst die Header und Einstellungen des aktuellen Blocks und geht in der Hierarchie nach oben, bis es bei der Wurzel angekommen ist, um die nächstmöglichen jeweiligen Konfigurationen zu finden.

Die Weiterleitung selbst erfolgt in diesem Fall zu einem lokalen Server, der hinter der IP 192.168.123.123 auf Port 80 hört.

Basisnamen von URIs

# Gets the basename of the original request
map $request_uri $request_basename {
    ~/(?<captured_request_basename>[^/?]*)(?:\?|$) $captured_request_basename;
}
 
# Gets the basename of the current uri
map $uri $basename {
    ~/(?<captured_basename>[^/]*)$ $captured_basename;
}

Mithilfe des map Moduls von nginx können Methoden definiert werden, die den Basisnamen aus einem Request oder der aktuellen URI extrahieren. Maps müssen im http{}-Block definiert werden, wodurch sie mittels Vererbung auch in den server{}-Blöcken zur Verfügung stehen.