HAProxy und CrowdSec
Stichpunkte
Auf dem Webserver
Apache Config
sudo echo "RemoteIPHeader X-Forwarded-For" >> /etc/apache2/apache2.conf
sudo sed -i 's,LogFormat "%h %l %u %t \\"%r\\" %>s %O \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined,LogFormat "%a %l %u %t \\"%r\\" %>s %O \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined,g' /etc/apache2/apache2.conf
sudo a2enmod remoteip
sudo systemctl restart apache2
Wichtig ist das, damit Apache2 die richtige Client IP über die option forwardfor aus der Firewall erhält und Loggt
CrowdSec Installation
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt install crowdsec crowdsec-blocklist-mirror crowdsec-firewall-bouncer-iptables
# Der Configuration unter db_config "use_wal: true" hinzufügen
sudo vi /etc/crowdsec/config.yaml
db_config:
log_level: info
type: sqlite
db_path: /var/lib/crowdsec/data/crowdsec.db
use_wal: true
Für die Blockliste die listen_uri: anassen;
vi /etc/crowdsec/bouncers/crowdsec-blocklist-mirror.yaml
listen_uri: WebserverIP:41412
sudo service crowdsec start
Optional für das Dashboard auf https://www.crowdsec.net/ Kostenlos Registrieren um die ID zu erhalten.
sudo cscli console enroll <id>
Auf der PFSense
Pakete auf der pfsense:
acme, cron, haproxy
Schnittstellen:
Wan, Lan, DMZ (opt1)
Verfahren:
Zertifikat
Dienste -> Acme Certificates -> Account Key
Name: Webserver-Key
ACME-Server: Let's Encrypt Production ACME v2
E-Mail: youre@email.de
-> Create new account key
-> Register ACME account key
-> Speichern
Zum Verifizieren der Domaininhaber gibt es unterschiedliche Methoden, wie z.B. Standalone Webserver.
Ich werde hier DNS mit OVH verwenden, dazu habe ich bei OVH
- Application Key
- Application Secret
- Consumer Key
erstellt. Endpoint ist bei mir OVH Europe.
Damit erstellt dann ACME einen DNS Eintrag zu deiner Domäne bei OVH, den Lets Encrypt dann abfragen und verifizieren kann.
Dienste -> Acme Certificates -> Certificates
Name: Webserver-Cert
Acme Account: Webserver-Key
Private Key: 2048-bit RSA
Domain SAN list:
Mode: Enable, Domainname=deine.domain.de, Methode= DNS-OVH
(Optional weiterer Eintrag für Wildcard)
Mode: Enable, Domainname=*.deine.domain.de, Methode= DNS-OVH
-> Speichern
HAProxy
Dienste -> HAProxy -> Settings
Enable HAProxy
Maximum Connection = 5000
-> Speichern
Dienste -> HAProxy -> Backend
->Hinzufügen
Name=Webservers
Serverlist Hinzufügen
Mode=Active
Name=Webserver1
ForwardTo=Address+Port
Address=IP des Backendserver
Port=443
Encrypt (SSL)=true
SSL Check=false
Advanced settings
Backend pass thru = option forwardfor
Wichtig für Crowdsec:
die Option Backend pass thru=option forwardfor, damit das Backend die IP des echten Clients erhält.
->Speichern
Dienste -> HAProxy -> Frontend
Erstmal die http-to-https Weiterleitung
->Hinzufügen
Name=http-to-https
External Address
Listen Adress=WAN
Port=80
Typ=http/https (offloading)
ACL bleibt leer
Aktionen:
Action= http-request redirect
rule=scheme https
-> Speichern
Dann das eigentliche Frontend
-> Hinzufügen
Name=Frei wählbar
External Address
Listen Adress=WAN
Port=443
SSL Offloading=true
Typ=http/https (offloading)
ACL:
Name: WebACL1
Expression= Host Matches
Value=deine.domain.de
Aktionen:
Use Backend
Condition acl names=WebACL1
Backend=Webservers
SSL offloading:
Zertifikat=Webserver-Cert
->Speichern
Firewallregeln
Firewall->Aliase->URLs
Name: Crowdsec_Blocklist
Typ: URL Table (IPs)
URL Table (IPs): http://10.200.4.20:41412/security/blocklist / 1
->Speichern
Firewall->Regeln->WAN
->Hinzufügen
Aktion: Blockieren
Schnittstelle: WAN
Adressfamilie: IPv4+IPv6
Protokoll: Alle
Quelle: Einzelner Host oder Alias, Crowdsec_Blocklist
Ziel: Alle
->Speichern
->Hinzufügen
Aktion: Erlauben
Schnittstelle: WAN
Adressfamilie: IPv4
Protokoll: TCP
Quelle: Alle
Ziel: WAN Address
Bereich der Zielports: HTTPS (443)
->Speichern
->Hinzufügen
Aktion: Erlauben
Schnittstelle: WAN
Adressfamilie: IPv4
Protokoll: TCP
Quelle: Alle
Ziel: WAN Address
Bereich der Zielports: HTTPS (443)
->Speichern
Cronjob für Alias-Table
Normalweise wird die Alias Table-URL nur 1x am Tag abgerufen.
Damit dies aber schneller geht, fügen wir eine Cronjob hinzu, der jede Minute ausgeführt wird.
Dienste -> cron
Minute: *
Stunde: *
Day of the Month: *
Month of the Year: *
Day of the Week: *
Benutzer: root
Command: /usr/bin/nice -n20 /etc/rc.update_urltables now forceupdate
Quellen und nützliches:
https://docs.crowdsec.net/docs/next/getting_started/install_crowdsec/
https://youtu.be/gJLxWWPQ9hU?si=-iVsbRrN5Do4au5U
https://schroederdennis.de/tutorial-howto/crowdsec-auf-proxmox-ve-8-installieren-und-einrichten-howto/
https://goneuland.de/crowdsec-firewall-bouncer-installieren/