<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.ixheim.de/index.php?action=history&amp;feed=atom&amp;title=Nginx_mit_Modsecurity_und_Blocklist_Policy</id>
	<title>Nginx mit Modsecurity und Blocklist Policy - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ixheim.de/index.php?action=history&amp;feed=atom&amp;title=Nginx_mit_Modsecurity_und_Blocklist_Policy"/>
	<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=Nginx_mit_Modsecurity_und_Blocklist_Policy&amp;action=history"/>
	<updated>2026-11-03T00:06:42Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Xinux Wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki.ixheim.de/index.php?title=Nginx_mit_Modsecurity_und_Blocklist_Policy&amp;diff=74081&amp;oldid=prev</id>
		<title>Thomas.will@claude: Neue saubere Seite statt zweier Fast-Duplikate (Tippfehler Blocklost und Waf-Praefix bereinigt)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=Nginx_mit_Modsecurity_und_Blocklist_Policy&amp;diff=74081&amp;oldid=prev"/>
		<updated>2026-10-31T15:15:41Z</updated>

		<summary type="html">&lt;p&gt;Neue saubere Seite statt zweier Fast-Duplikate (Tippfehler Blocklost und Waf-Praefix bereinigt)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Was machen wir ==&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung zeigt den Aufbau einer Web Application Firewall mit NGINX und ModSecurity v3 mit einer &amp;#039;&amp;#039;&amp;#039;praxistauglichen Blocklist-Strategie&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
* Ubuntu 24.04 oder Debian 13&lt;br /&gt;
* Funktionierendes Backend (z. B. http://127.0.0.1:8080)&lt;br /&gt;
* TLS-Zertifikate (&amp;lt;code&amp;gt;/etc/ssl/own.crt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/ssl/own.key&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install nginx libmodsecurity3 libnginx-mod-http-modsecurity git -y&lt;br /&gt;
&lt;br /&gt;
sudo mkdir -p /etc/nginx/modsec/custom-rules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OWASP Core Rule Set installieren ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /etc/nginx/modsec&lt;br /&gt;
sudo git clone https://github.com/coreruleset/coreruleset.git&lt;br /&gt;
sudo cp coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Blocklist erstellen ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/nginx/modsec/blocked_uris.txt &amp;gt; /dev/null &amp;lt;&amp;lt;EOF&lt;br /&gt;
/admin&lt;br /&gt;
/wp-admin&lt;br /&gt;
/administrator&lt;br /&gt;
/backup&lt;br /&gt;
/config&lt;br /&gt;
/database&lt;br /&gt;
/phpmyadmin&lt;br /&gt;
/mysql&lt;br /&gt;
/server-status&lt;br /&gt;
/.env&lt;br /&gt;
/.git&lt;br /&gt;
/wp-login.php&lt;br /&gt;
/login-bypass&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ModSecurity konfigurieren ==&lt;br /&gt;
*Datei &amp;lt;code&amp;gt;/etc/nginx/modsec/modsecurity.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/nginx/modsec/modsecurity.conf &amp;gt; /dev/null &amp;lt;&amp;lt;EOF&lt;br /&gt;
SecRuleEngine On&lt;br /&gt;
SecRequestBodyAccess On&lt;br /&gt;
SecResponseBodyAccess Off&lt;br /&gt;
&lt;br /&gt;
SecAuditEngine RelevantOnly&lt;br /&gt;
SecAuditLog /var/log/nginx/modsec_audit.log&lt;br /&gt;
SecAuditLogParts ABIJDEFHZ&lt;br /&gt;
&lt;br /&gt;
SecTmpDir /tmp/&lt;br /&gt;
SecDataDir /tmp/&lt;br /&gt;
&lt;br /&gt;
# Zuerst CRS – wirkt auf ALLE Requests&lt;br /&gt;
Include /etc/nginx/modsec/coreruleset/crs-setup.conf&lt;br /&gt;
Include /etc/nginx/modsec/coreruleset/rules/*.conf&lt;br /&gt;
&lt;br /&gt;
# Danach unsere Security Policy (Blocklist)&lt;br /&gt;
Include /etc/nginx/modsec/custom-rules/security-policy.conf&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Security Policy (Blocklist) ==&lt;br /&gt;
Datei: &amp;lt;code&amp;gt;/etc/nginx/modsec/custom-rules/security-policy.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was nicht durch die Blocklist oder den CRS geblockt wird, passiert durch – ein explizites Erlauben ist nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/nginx/modsec/custom-rules/security-policy.conf &amp;gt; /dev/null &amp;lt;&amp;lt;EOF&lt;br /&gt;
# Security Policy: Blocklist + Default-Allow&lt;br /&gt;
&lt;br /&gt;
# Kritische Pfade explizit blockieren (Phase 1)&lt;br /&gt;
SecRule REQUEST_URI &amp;quot;@pmFromFile /etc/nginx/modsec/blocked_uris.txt&amp;quot; \&lt;br /&gt;
    &amp;quot;id:1999,phase:1,deny,status:403,log,msg:&amp;#039;Blocked path detected: %{MATCHED_VAR}&amp;#039;&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NGINX-Snippet ==&lt;br /&gt;
Datei: &amp;lt;code&amp;gt;/etc/nginx/modsec/main.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/nginx/modsec/main.conf &amp;gt; /dev/null &amp;lt;&amp;lt;EOF&lt;br /&gt;
modsecurity on;&lt;br /&gt;
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Log-Format ergänzen (/etc/nginx/nginx.conf im http{}-Block)&lt;br /&gt;
sudo sed -i &amp;#039;/http {/a\\tlog_format waf_combined &amp;#039;\&amp;#039;&amp;#039;$remote_addr - $remote_user [$time_local] &amp;#039;\&amp;#039;&amp;#039;\n\t\t\t\t\t&amp;#039;\&amp;#039;&amp;#039;&amp;quot;$request&amp;quot; $status $body_bytes_sent &amp;#039;\&amp;#039;&amp;#039;\n\t\t\t\t\t&amp;#039;\&amp;#039;&amp;#039;ModSecID=$request_id Host=&amp;quot;$host&amp;quot; URI=&amp;quot;$request_uri&amp;quot;&amp;#039;\&amp;#039;&amp;#039;;&amp;#039; /etc/nginx/nginx.conf&lt;br /&gt;
&lt;br /&gt;
# Log-Dateien anlegen&lt;br /&gt;
sudo touch /var/log/nginx/modsec_audit.log&lt;br /&gt;
sudo chown www-data:adm /var/log/nginx/modsec_audit.log&lt;br /&gt;
sudo chmod 640 /var/log/nginx/modsec_audit.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NGINX-Site konfigurieren ==&lt;br /&gt;
Datei: &amp;lt;code&amp;gt;/etc/nginx/sites-available/default&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/nginx/sites-available/default &amp;gt; /dev/null &amp;lt;&amp;lt;EOF&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name _;&lt;br /&gt;
    return 301 https://\$host\$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name _;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate     /etc/ssl/own.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/own.key;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/access.log waf_combined;&lt;br /&gt;
    error_log  /var/log/nginx/error.log warn;&lt;br /&gt;
&lt;br /&gt;
    include /etc/nginx/modsec/main.conf;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
        proxy_set_header Host \$host;&lt;br /&gt;
        proxy_set_header X-Real-IP \$remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fehlerseite ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /var/www/html/403.html &amp;gt; /dev/null &amp;lt;&amp;lt;EOF&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
 &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;403 Forbidden&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
 &amp;lt;body&amp;gt;&lt;br /&gt;
 &amp;lt;h1&amp;gt;Zugriff verweigert&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &amp;lt;p&amp;gt;Deine Anfrage wurde von der Web Application Firewall blockiert.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aktivierung ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nginx -t&lt;br /&gt;
sudo systemctl reload nginx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testbeispiele ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode !! URI !! Erwartung&lt;br /&gt;
|-&lt;br /&gt;
| GET || / || 200 OK&lt;br /&gt;
|-&lt;br /&gt;
| GET || /admin || 403 Forbidden&lt;br /&gt;
|-&lt;br /&gt;
| GET || /wp-admin || 403 Forbidden&lt;br /&gt;
|-&lt;br /&gt;
| POST || /upload || 200 OK (wenn erlaubt)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Audit-Log verfolgen ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tail -f /var/log/nginx/modsec_audit.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ergebnis ==&lt;br /&gt;
* CRS schützt vor typischen Angriffen auf alle Requests&lt;br /&gt;
* Blocklist blockiert explizit kritische Pfade&lt;br /&gt;
* Default-Allow ermöglicht normale Seiten-Nutzung&lt;br /&gt;
* Minimaler Wartungsaufwand durch Blocklist-Ansatz&lt;/div&gt;</summary>
		<author><name>Thomas.will@claude</name></author>
	</entry>
</feed>