Linux - Security und Firewall Plan
Zur Navigation springen
Zur Suche springen
Ziel
VirtualBox Vorlagen
- Debian: Dienen als Server, Firewall oder generischer Rechner
- Arch: Rechner im LAN, Verwaltung der Server von hier aus über SSH/Weboberflächen (Befehl zum Herunterladen in der nächsten Zeile)
- scp 192.168.HS.200:~/Dokumente/debian-kit.ova ~/Dokumente
Aufbau des Labors
- Eine Debian Maschine soll uns als Firewall dienen
- Diese soll über einen Bridgeadapter eine pseudo-öffentliche IP im Schulungsnetzwerk erhalten
- Ein zweiter Netzwerkadapter vom Typ "internes Netzwerk" soll als LAN der Labore dienen
- Ein Host mit einer graphischen Oberfläche im LAN der Firewall soll als Verwaltungsrechner dienen
- Wenn die virtuellen Maschinen so konfiguriert sind, können sie hochgefahren werden
- Nun muss die Netzwerkeinstellung wie im Schaubild konfiguriert werden:
- Als erstes muss man "physisch" auf der Firewall die statischen IPs konfigurieren
- für die statische IP muss die Datei /etc/network/interfaces bearbeitet werden (Distributions abhängig)
- vim /etc/network/interfaces
auto lo iface lo inet loopback auto enp0s3 iface enp0s3 inet static address 192.168.3.1xx/24 gateway 192.168.3.254 auto enp0s8 iface enp0s8 inet static address 172.16.1xx.1/24
- ifdown -va ; ifup -va
- Als Kontrolle kann man ip addr show ausführen
- Ab hier kann man vom LAN Host aus auf die Firewall zugreifen (Befehle ab hier beziehen sich auf LAN Host!)
- Dazu muss NetworkManager gestoppt werden, damit dieser Dienst nicht in unsere temporäre Netzwerkkonfiguration pfuscht
- systemctl stop NetworkManager
- Wir vergeben uns eine temporäre IP Adresse, um auf die Firewall per SSH zugreifen zu können
- ip addr add 172.16.1xx.2/24 dev enp0s3
- Nun sollte der Remote-Zugriff auf die Firewall möglich sein
- ssh kit@172.16.1xx.1
- Damit Hosts im LAN automatisch eine IP-Adresse erlangen, konfigurieren wir nun einen DHCP Server (Befehle ab hier finden auf der Firewall statt!)
- apt install isc-dhcp-server
- Falls dieser Befehl einen Fehler in der Namensauflösung schmeist, dann muss ein richtiger Nameserver eingetragen werden
- vim /etc/resolv.conf
nameserver 1.1.1.1 # Als Beispiel. Man kann auch jeden anderen validen Nameserver verwenden
- Nach der Installation des DHCP Servers beschwert sich systemd, dass er den Dienst nicht starten kann, weil er noch nicht richtig konfiguriert ist.
- Das ist nicht weiter schlimm, da wir ihn wie folgt einstellen:
- vim /etc/default/isc-dhcp-server
DHCPDv4_CONF=/etc/dhcp/dhcpd.conf INTERFACESv4="enp0s8"
- vim /etc/dhcp/dhcpd.conf
option domain-name-servers 1.1.1.1; default-lease-time 600; max-lease-time 7200; ddns-update-style none; subnet 172.16.1xx.0 netmask 255.255.255.0 { range 172.16.1xx.2 172.16.1xx.10; option routers 172.16.1xx.1; }
Hostzugriff absichern
- Ab hier wird wieder mit dem LAN Host weitergearbeitet
- Bootsicherheit/-hacking
- GRUB Passwort einrichten
Remotezugriff mit SSH
- Da man nicht immer physisch an einer Maschine anwesend sein kann, empfiehlt es sich Hosts über SSH zu steuern
- Der Datenverkehr ist dabei verschlüsselt, damit es beide Maschinen vor potentiellen Angreifern schützt, die den Verkehr mitschneiden
SSH-Schlüssel mit Passwort generieren
- Man sollte Passwort-Authentifikation vermeiden soweit es geht
- Bei SSH kann man stattdessen mit Schlüsselpaaren arbeiten, die wie folgt generiert werden
- ssh-keygen
- Den privaten Schlüssel sollte man mit einer Passphrase verschlüsseln für erhöhte Sicherheit
- Danach sollten folgende Dateien da sein
- ls ~/.ssh
id_rsa id_rsa.pub
- Um den öffentlichen Schlüssel auf der Firewall abzulegen kann man einen der folgenden Befehle verwenden:
- ssh-copy-id kit@172.16.1xx.1
bzw. diesen Befehl falls der Ordner .ssh schon im Homeverzeichnis vom Benutzer kit existiert:
- scp ~/.ssh/id_rsa.pub kit@172.16.1xx.1:~/.ssh/authorized_keys
- Nun sollte nicht mehr das Passwort des remoten Benutzers abgefragt werden
- Damit man nicht jedes mal den privaten Schlüssel entsperren muss, sollte man sich einen SSH Agent konfigurieren
- Um die Administration der Firewall einfacher zu machen kann man sich auch den öffentlichen Schlüssel zum root-User kopieren
- su -
- mkdir .ssh
- cp ~kit/.ssh/authorized_keys ~/.ssh
SSH-Daemon auf Firewall absichern: Anderer Port, kein Root Login über Passwort
- Im Moment kann jeder, der das Passwort des kit-Nutzers kennt, sich an der Firewall anmelden
- Um das zu verhindern kann man den SSH Daemon folgerdermaßen konfigurieren
- vim /etc/ssh/sshd_config
... Port 2222 AddressFamily inet ListenAddress 172.16.1xx.1 PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no ...
Automatischer Start der Firewall
- Man kann über eigene Service-Dateien eine iptables-Firewall beim Bootprozess starten
- vim /etc/systemd/system/firewall.service
[Unit] Description=Firewall After=network.target [Service] RemainAfterExit=yes ExecStart=firewall start ExecStop=firewall stop User=root [Install] WantedBy=multi-user.target
- systemctl enable --now firewall
Internet Zugriff für LAN mit iptables
- Der Rechner darf mit sich selbst über das Loopback-Interface kommunizieren
- Pakete aus dem LAN müssen auf die IP der Firewall umgeschrieben werden
- alle Pakete bis auf SSH, DNS und Web sollen verworfen werden
- ICMP darf innerhalb des Netzwerks und von innen nach außen zum Testen der Verbindungen funktionieren
- Firewall soll nicht auf ICMP antworten
- Wenn ein Paket verworfen wird, soll es unter /var/log/syslog geloggt werden
- vim /usr/local/sbin/firewall
#!/bin/bash LANDEV="enp0s8" WANDEV="enp0s3" LAN="172.16.1xx.0/24" WANIP="192.168.3.1xx" case $1 in start) echo "starte Firewall" iptables -F iptables -F -t nat iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -i $LANDEV -s $LAN -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -i $LANDEV -j ACCEPT iptables -A INPUT -j LOG --log-prefix "iptables drop INPUT: " iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "iptables drop OUTPUT: " iptables -P FORWARD DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 80,443 -i $LANDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $LANDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -i $LANDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "iptables drop FORWARD: " iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j SNAT --to-source $WANIP ;; stop) echo "stoppe Firewall" iptables -F iptables -F -t nat iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # Internetzugriff für alle mit dynamischer IP iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE ;; *) echo "usage: $0 start|stop" ;; esac
- Stateful Firewall: Establish und Related, um den Zustand von TCP/UDP Verbindungen zu beobachten, Conntrack als Visualisierung
- Connection Tracking anpassen, kann man über Kernelparameter ähnlich wie bei net.ipv4.ip_forward
- Parameter dazu findet man unter dem Ordner /proc/sys/netfilter
Dienste wie DNS, Webserver in der DMZ erstellen
Aktuelle Firewall
- vim /usr/local/sbin/firewall
#!/bin/bash WANDEV="enp0s3" LANDEV="enp0s8" DMZDEV="enp0s9" WANIP="192.168.11.1xx" LAN="172.16.1xx.0/24" DMZ="10.0.1xx.0/24" case $1 in "start") echo "starte Firewall" iptables -F iptables -F -t nat iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -s 192.168.11.0/24 -i $WANDEV -j ACCEPT iptables -A INPUT -j LOG --log-prefix "iptables drop INPUT: " iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p udp --dport 53 -o $WANDEV -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --dport 80,443 -o $WANDEV -j ACCEPT iptables -A OUTPUT -p tcp --dport 22 -o $LANDEV -j ACCEPT iptables -A OUTPUT -p tcp --dport 22 -o $DMZDEV -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "iptables drop OUTPUT: " iptables -P FORWARD DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT iptables -A FORWARD -p udp --dport 53 -o $WANDEV -j ACCEPT iptables -A FORWARD -p tcp -m multiport --dport 80,443 -o $WANDEV -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "iptables drop FORWARD: " # Internetzugriff fuer DMZ und LAN iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE # iptables -t nat -A POSTROUTING -o $WANDEV -j SNAT --to-source 192.168.11.100 ;; "stop") echo "stoppe Firewall" iptables -F iptables -F -t nat ;; *) echo "usage: $0 start|stop" ;; esac
- Hier kommt die generelle Konfiguration, um der DMZ Internetzugriff zu gewähren
- Virtualbox um einen Adapter erweitern für die DMZ
- DHCP Konfiguration anpassen
- vim /etc/default/isc-dhcp-server
DHCPDv4_CONF=/etc/dhcp/dhcpd.conf INTERFACESv4="enp0s8 enp0s9"
- vim /etc/dhcp/dhcpd.conf
option domain-name-servers 1.1.1.1; default-lease-time 600; max-lease-time 7200; ddns-update-style none; subnet 172.16.1xx.0 netmask 255.255.255.0 { range 172.16.1xx.2 172.16.1xx.10; option routers 172.16.1xx.1; } subnet 10.0.1xx.0 netmask 255.255.255.0 { range 10.0.1xx.2 10.0.1xx.10; option routers 10.0.1xx.1; }
Firewall Regeln für Zugriff auf das Internet für DMZ einrichten
- vim /usr/local/sbin/firewall
#!/bin/bash DMZDEV="enp0s9" LANDEV="enp0s8" WANDEV="enp0s3" LAN="172.16.1xx.0/24" DMZ="10.0.1xx.0/24" WANIP="192.168.3.1xx" case $1 in start) echo "starte Firewall" iptables -F iptables -F -t nat iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -i $LANDEV -s $LAN -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -i $LANDEV -j ACCEPT iptables -A INPUT -j LOG --log-prefix "iptables drop INPUT: " iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p tcp --dport 22 -o $DMZDEV -d $DMZ -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "iptables drop OUTPUT: " iptables -P FORWARD DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 80,443 -i $LANDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $LANDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 80,443 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -i $LANDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "iptables drop FORWARD: " iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j SNAT --to-source $WANIP iptables -t nat -A POSTROUTING -s $DMZ -o $WANDEV -j SNAT --to-source $WANIP ;; stop) echo "stoppe Firewall" iptables -F iptables -F -t nat iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # Internetzugriff für alle mit dynamischer IP iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE ;; *) echo "usage: $0 start|stop" ;; esac
Neu
#!/bin/bash WANDEV="enp0s3" LANDEV="enp0s8" DMZDEV="enp0s9" WANIP="192.168.11.1xx" LAN="172.16.1xx.0/24" DMZ="10.0.1xx.0/24" DNSSERVER="10.0.1xx.2" case $1 in "start") echo "starte Firewall" iptables -F iptables -F -t nat iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH Zugriff auf Firewall iptables -A INPUT -p tcp --dport 2222 -s 192.168.11.0/24 -i $DMZDEV -j ACCEPT iptables -A INPUT -j LOG --log-prefix "iptables drop INPUT: " iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Internetzugriff fuer Firewall iptables -A OUTPUT -p udp --dport 53 -o $WANDEV -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --dport 80,443 -o $WANDEV -j ACCEPT # SSH Zugriff auf interne Rechner iptables -A OUTPUT -p tcp --dport 22 -o $LANDEV -j ACCEPT iptables -A OUTPUT -p tcp --dport 22 -o $DMZDEV -j ACCEPT # Ping freischalten iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "iptables drop OUTPUT: " iptables -P FORWARD DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Ping freischalten iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT # Internetzugriff fuer interne Rechner iptables -A FORWARD -p udp --dport 53 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $LANDEV -j ACCEPT iptables -A FORWARD -p tcp -m multiport --dport 80,443 -o $WANDEV -j ACCEPT # Pakete an die DMZ zulassen iptables -A FORWARD -p udp --dport 53 -i $WANDEV -o $DMZDEV -d $DNSSERVER -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "iptables drop FORWARD: " # Internetzugriff fuer DMZ und LAN iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE # iptables -t nat -A POSTROUTING -o $WANDEV -j SNAT --to-source 192.168.11.100 # Portforward in die DMZ iptables -t nat -A PREROUTING -i $WANDEV -p udp --dport 53 -j DNAT --to $DNSSERVER ;; "stop") echo "stoppe Firewall" iptables -F iptables -F -t nat ;; *) echo "usage: $0 start|stop" ;; esac
DNS für das Labor einrichten
- Die folgenden Befehle geschehen auf dem DNS Server
- apt install bind9
- dig ist ein praktisches Tool, um die DNS Auflösung zu testen
- dig +short @127.0.0.1 xinux.net
194.59.156.162
- Wenn das funktioniert hat, sollte man den Nameserver auf den lokalen Host setzen
- vim /etc/resolv.conf
nameserver 127.0.0.1
- Damit andere den Nameserver benutzen können, müssen die Antwort-Optionen angepasst werden
- vim /etc/bind/named.conf.options
options { directory "/var/cache/bind"; dnssec-validation no; allow-recursion { 0.0.0.0/0; }; };
- vim /var/cache/bind/lab1xx.sec
$TTL 300 @ IN SOA dns.lab1xx.sec. technik.xinux.de. (2023041702 14400 3600 3600000 86400) IN NS dns dns IN A 10.0.1xx.2 fw IN A 192.168.HS.1xx lan IN A 172.16.1xx.2
Aktuelle Firewall
- vim /usr/local/sbin/firewall
#!/bin/bash WANDEV="enp0s3" LANDEV="enp0s8" DMZDEV="enp0s9" WANIP="192.168.11.1xx" LAN="172.16.1xx.0/24" DMZ="10.0.1xx.0/24" case $1 in "start") echo "starte Firewall" iptables -F iptables -F -t nat iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH Zugriff auf Firewall iptables -A INPUT -p tcp --dport 2222 -s 192.168.11.0/24 -i $WANDEV -j ACCEPT iptables -A INPUT -j LOG --log-prefix "iptables drop INPUT: " iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Internetzugriff fuer Firewall iptables -A OUTPUT -p udp --dport 53 -o $WANDEV -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --dport 80,443 -o $WANDEV -j ACCEPT # SSH Zugriff auf interne Rechner iptables -A OUTPUT -p tcp --dport 22 -o $LANDEV -j ACCEPT iptables -A OUTPUT -p tcp --dport 22 -o $DMZDEV -j ACCEPT # Ping freischalten iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "iptables drop OUTPUT: " iptables -P FORWARD DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Ping freischalten iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT # Internetzugriff fuer interne Rechner iptables -A FORWARD -p udp --dport 53 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $LANDEV -j ACCEPT iptables -A FORWARD -p tcp -m multiport --dport 80,443 -o $WANDEV -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "iptables drop FORWARD: " # Internetzugriff fuer DMZ und LAN iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE # iptables -t nat -A POSTROUTING -o $WANDEV -j SNAT --to-source 192.168.11.100 ;; "stop") echo "stoppe Firewall" iptables -F iptables -F -t nat ;; *) echo "usage: $0 start|stop" ;; esac
Zonenkonfiguration
- Nun wollen wir unsere eigenen Zonen definieren, wobei die Antwort davon abhängt aus welchem Netz die Anfrage kommt
- vim /etc/bind/named.conf.local
acl intern { 172.16.1xx.0/24; localhost; 10.0.1xx.0/24; }; acl extern { any; }; view intern { match-clients { intern; }; zone "lab1xx.sec" { type master; file "intern/lab1xx.sec"; }; }; view extern { match-clients { extern; }; zone "lab1xx.sec" { type master; file "extern/lab1xx.sec"; }; };
- Die eigentliche Zuweisung von Name zu IP geschieht in den folgenden Dateien
- vim /var/cache/bind/intern/lab1xx.sec
$TTL 300 @ IN SOA dns.lab1xx.sec. technik.xinux.de. (2023041702 14400 3600 3600000 86400) IN NS dns dns IN A 10.0.1xx.2 www IN A 10.0.1xx.3 sftp IN A 10.0.1xx.4 fw IN A 192.168.11.1xx lan IN A 172.16.1xx.2
- vim /var/cache/bind/extern/lab1xx.sec
$TTL 300 @ IN SOA dns.lab1xx.sec. technik.xinux.de. (2023041702 14400 3600 3600000 86400) IN NS dns dns IN A 192.168.3.1xx www IN A 192.168.3.1xx sftp IN A 192.168.3.1xx fw IN A 192.168.3.1xx
Portforwarding mit iptables
- Damit andere den Namenserver in der DMZ befragen können, muss die Firewall ein Destination NAT auf UDP Port 53 durchführen
- vim /usr/local/sbin/firewall
#!/bin/bash LANDEV="enp0s8" DMZDEV="enp0s9" WANDEV="enp0s3" LAN="172.16.1xx.0/24" DMZ="10.0.1xx.0/24" WANIP="192.168.3.1xx" DNSSERVER="10.0.1xx.2" case $1 in start) echo "starte Firewall" iptables -F iptables -F -t nat iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -i $LANDEV -s $LAN -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -i $LANDEV -j ACCEPT iptables -A INPUT -j LOG --log-prefix "iptables drop INPUT: " iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -m multiport -p tcp --dport 22,53,2222 -o $DMZDEV -d $DMZ -j ACCEPT iptables -A OUTPUT -m multiport -p udp --dport 53 -o $DMZDEV -d $DMZ -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "iptables drop OUTPUT: " iptables -P FORWARD DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $WANDEV -o $DMZDEV -d $DNSSERVER -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 80,443 -i $LANDEV -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 53,80,443 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $LANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "iptables drop FORWARD: " iptables -t nat -A PREROUTING -p udp --dport 53 -i $WANDEV -j DNAT --to $DNSSERVER iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j SNAT --to-source $WANIP iptables -t nat -A POSTROUTING -s $DMZ -o $WANDEV -j SNAT --to-source $WANIP ;; stop) echo "stoppe Firewall" iptables -F iptables -F -t nat iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # Internetzugriff für alle mit dynamischer IP iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE ;; *) echo "usage: $0 start|stop" ;; esac
Webserver in der DMZ
- statische IP: 10.0.1xx.3/24
- Hostname: www
- SSH Zugang wie beim DNS Server
- Testwebserver installieren
- apt install apache2
- Portforwarding einrichten
- vim /usr/local/sbin/firewall
WEBSERVER="10.0.1xx.3" ... iptables -A FORWARD -m multiport -p tcp --dport 80,443 -i $WANDEV -o DMZDEV -d $WEBSERVER -j ACCEPT ... iptables -t nat -A PREROUTING -m multiport -p tcp --dport 80,443 -i $WANDEV -j DNAT --to $DNSSERVER ...
- vim /var/cache/bind/intern/lab1xx.sec
$TTL 300 @ IN SOA dns.lab1xx.sec. mail.lab1xx.sec. (2023091302 14400 3600 3600000 86400) IN NS dns firewall IN A 192.168.11.1xx dns IN A 10.0.1xx.2 sftp IN A 10.0.1xx.3 www IN A 192.168.11.1xx web IN A 10.0.1xx.4 lan IN A 172.16.1xx.2
Verschlüsseln des Datenverkehrs zwischen den Laboren mit VPNs
- Ziel ist es die LANs zwischen Laboren durch eine VPN zu verbinden, damit die Administration auch über einen entfernten Standort stattfinden kann.
- Als Vorbereitung benötigen wir einen SFTP-Server, um den Pre-Shared-Key und die Zertifikate auszutauschen:
- VLAN: DMZ
- Netzwerk: 10.0.1xx.4/24
- Hostname: sftp
- Firewall sollte von TCP Port 22 auf den SSH Port des SFTP-Servers zulassen
- sftp.labxx.sec sollte auflösbar sein (auf intern und extern achten)
- Außerdem sollte die Firewall Zugriff auf externe SFTP Server erlauben
- vim /usr/local/sbin/firewall
#!/bin/bash LANDEV="enp0s8" DMZDEV="enp0s9" WANDEV="enp0s3" LAN="172.16.1xx.0/24" DMZ="10.0.1xx.0/24" WANIP="192.168.3.1xx" DNSSERVER="10.0.1xx.2" WEBSERVER="10.0.1xx.3" SFTPSERVER="10.0.1xx.4" case $1 in start) echo "starte Firewall" iptables -F iptables -F -t nat iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -i $LANDEV -s $LAN -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -i $LANDEV -j ACCEPT iptables -A INPUT -j LOG --log-prefix "iptables drop INPUT: " iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -m multiport -p tcp --dport 22,53,2222 -o $DMZDEV -d $DMZ -j ACCEPT iptables -A OUTPUT -m multiport -p udp --dport 53 -o $DMZDEV -d $DMZ -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "iptables drop OUTPUT: " iptables -P FORWARD DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $WANDEV -o $DMZDEV -d $DNSSERVER -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 80,443 -i $WANDEV -o $DMZDEV -d $WEBSERVER -j ACCEPT iptables -A FORWARD -p tcp --dport 2222 -i $WANDEV -o $DMZDEV -d $SFTPSERVER -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 22,80,443 -i $LANDEV -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 53,80,443 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $LANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "iptables drop FORWARD: " iptables -t nat -A PREROUTING -p udp --dport 53 -i $WANDEV -j DNAT --to $DNSSERVER iptables -t nat -A PREROUTING -m multiport -p tcp --dport 80,443 -i $WANDEV -j DNAT --to $WEBSERVER iptables -t nat -A PREROUTING -p tcp --dport 22 -i $WANDEV -j DNAT --to $SFTPSERVER:2222 iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j SNAT --to-source $WANIP iptables -t nat -A POSTROUTING -s $DMZ -o $WANDEV -j SNAT --to-source $WANIP ;; stop) echo "stoppe Firewall" iptables -F iptables -F -t nat iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # Internetzugriff für alle mit dynamischer IP iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE ;; *) echo "usage: $0 start|stop" ;; esac
- SSH Daemon lauscht auf TCP Port 2222, aber sollte Passwortauthentifikation für die Gruppe sftponly zulassen
- vim /etc/ssh/sshd_config
... Subsystem sftp /usr/lib/openssh/sftp-server UsePAM yes Match Group sftponly PasswordAuthentication yes ChrootDirectory /srv/sftp/%u ForceCommand internal-sftp AllowTcpForwarding no
- Für die Einrichtung des SFTP-Servers sollten folgende Ordner und Benutzer angelegt werden
- mkdir -p /srv/sftp
- groupadd sftponly
- useradd -G sftponly -d /srv/sftp/gast -s /bin/false gast
- mkdir -p /srv/sftp/gast/ablage
- chown gast /srv/sftp/gast/ablage
- passwd gast
- Der Partner mit dem man die VPN aufbauen will, sollte das Passwort für den SFTP Account erfahren
- Nun kann man die IPSec Implementation Strongswan auf der Firewall installieren
- apt install strongswan
- Die Verbindungen werden unter der Datei /etc/ipsec.conf konfiguriert
IPSec Site-to-Site aufbauen mit PSK
- Diese Einstellung kann auf beiden Seite gleich angewendet werden (bis auf die IPs)
- vim /etc/ipsec.conf
conn site2site-psk authby=secret keyexchange=ikev2 left=192.168.3.1xx leftsubnet=172.16.1xx.0/24 mobike=no right=192.168.3.1yy rightsubnet=172.16.1yy.0/24 ike=aes256-sha256-modp4096! esp=aes256-sha256-modp4096! auto=start
- Nun sollte über den SFTP-Server der PSK ausgetauscht werden
- Dazu muss TCP Port 22 nach außen für die Firewall freigeschaltet sein (falls es noch nicht so da steht)
- vim /usr/local/sbin/firewall
... iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT ...
Partner 1
- Eine Seite generiert einen Schlüssel, z.B. head /dev/random | tr -dc A-Za-z0-9 | head -c 20 ; echo
- Dieser Schlüssel muss auf dem SFTP-Server abgespeichert werden.
Partner 2
- Nun kann sich die Gegenseite den Schlüssel holen (Vom LAN Host aus sollte Port 22 in der Forward-Kette freigeschaltet werden)
- sftp gast@sftp.lab1yy.sec
- get ipsec.secret
- Danach sollte der Schlüssel wieder vom SFTP Server gelöscht werden
Beide
- Wenn beide Seiten den Schlüssel haben, kann man nun diese in die Datei ipsec.secrets eintragen
- vim /etc/ipsec.secrets
192.168.3.1xx 192.168.3.1yy : PSK "hierdertotalgeheimeschlüssel"
- Auf der Firewall noch in der INPUT-Kette UDP Port 500 und 4500 freischalten
- vim /usr/local/sbin
... iptables -A INPUT -m multiport -p udp --dport 500,4500 -i $WANDEV -j ACCEPT ... iptables -A OUTPUT -m multiport -p udp --dport 500,4500 -o $WANDEV -j ACCEPT ...
- Nun sollte man die IPSec Verbindung aufbauen können
- ipsec up site2site-psk
- Den Status der Verbindung kann man mit ipsec statusall checken
- Falls die Verbindung steht sollte ein Ping in das gegenüberliegende Netz auch funktionieren
- ping 172.16.1yy.2
IPSec Site-to-Site aufbauen mit Zertifikat
- Partner 1 wartet auf eine eingehende Verbindung mit passenden Zertifikat, wobei die IP egal sein darf
- Commonname/FQDN im Zertifikat sollte fw1xx bzw. fw1yy sein
- Austausch der Zertifikate und der Anträge über den SFTP Server
- PSK-VPN-Verbindung abbauen
- ipsec down site2site-psk
Partner 1
- Zertifizierungsstelle erstellen
- mkdir ~/ca
- cd ~/ca
- openssl genrsa -aes256 -out ca.key 4096
- openssl req -new -key ca.key -x509 -days 3650 -out ca.crt
... Common Name (e.g. server FQDN or YOUR name) []:vpn-ca ...
- IPSec-Zertifikat erstellen und signieren
- openssl genrsa -out fw1xx.key 4096
- Einen Certificate Signing Request erstellen
- openssl req -new -key fw1xx.key -out fw1xx.csr
... Common Name (e.g. server FQDN or YOUR name) []:fw1xx ...
- openssl x509 -req -days 730 -in fw1xx.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out fw1xx.crt
- Zertifikat der Zertifizierungsstelle Partner 2 zukommen lassen (ca.crt)
Partner 2
- Erstellt Zertifizierungsantrag...
- mkdir ~/cert
- cd ~/cert
- openssl genrsa -out fw1yy.key 4096
- openssl req -new -key fw1yy.key -out fw1yy.csr
... Common Name (e.g. server FQDN or YOUR name) []:fw1yy ...
- ... und lässt es Partner 1 zukommen (fw1yy.csr)
- Konfigurieren der Verbindung
- vim /etc/ipsec.conf
conn site2site-cert authby=rsasig keyexchange=ikev2 left=192.168.3.1yy leftcert="fw1yy.crt" leftsubnet=172.16.1yy.0/24 right=192.168.3.1xx rightid="CN=fw1xx" rightsubnet=172.16.1xx.0/24 ike=aes256-sha256-modp4096! esp=aes256-sha256-modp4096! auto=start
Partner 1
- Signiert den Antrag
- openssl x509 -req -days 730 -in fw1yy.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out fw1yy.crt
- Schickt diesen zurück bzw. hinterlegt ihn auf dem SFTP Server (fw1yy.crt) zusammen mit dem Zertifikat der Zertifizierungsstelle (ca.crt)
- Konfigurieren der Verbindung
- vim /etc/ipsec.conf
conn site2site-cert authby=rsasig keyexchange=ikev2 left=192.168.3.1xx leftcert="fw1xx.crt" leftsubnet=172.16.1xx.0/24 right=0.0.0.0 # Egal welche IP,... rightid="CN=fw1yy" # ...aber der Commonname muss stimmen rightsubnet=172.16.1yy.0/24 ike=aes256-sha256-modp4096! esp=aes256-sha256-modp4096! auto=add
Beide
- Damit Strongswan die Zertifikate findet, müssen diese an genau diesen Stellen liegen...
- find /etc/ipsec.d/ -type f
/etc/ipsec.d/private/fw1xx.key # bzw. f1yy.key /etc/ipsec.d/certs/fw1xx.crt # bzw. f1yy.crt /etc/ipsec.d/cacerts/ca.crt
- ...und in der ipsec.secrets Datei zur Verbindung zugewiesen werden
- vim /etc/ipsec.secrets
192.168.3.1xx : RSA fw1xx.key ""
- Diese müssen von Strongswan neu eingelesen werden
- ipsec reload
- ipsec rereadall
- Ob die Zertifikate erfolgreich geladen wurden lässt sich folgendermaßen überprüfen
- ipsec listcerts
- Ansonsten muss Strongswan neugestartet/geladen werden, falls der letzte Befehl nichts ausgibt
- systemctl restart strongswan-starter
- ipsec restart
Partner 2
- Nur von dieser Firewall aus kann die Verbindung gestartet werden, da die andere Seite die IP nicht kennt
- ipsec up site2site-cert
Pakete durch den VPN Tunnel schicken
- Selbst wenn die VPN Tunnel stehen, heißt es noch nicht, dass unsere Datenpakete auch verschlüsselt verschickt werden
- Am einfachsten kann man das überprüfen, indem man versucht sowohl ICMP- als auch ESP-Pakete mitzuschneiden
- tcpdump -i any icmp or esp
- Falls nur ICMP-Pakete auftauchen heißt es, dass noch nichts verschlüsselt wird
- Die Firewall muss nun auf vier Dinge angepasst werden:
- Pakete, die für das andere LAN bestimmt sind müssen durch den VPN-Tunnel gezwungen werden
- Dadurch werden die Pakete beim Forwarden als ipsec-Pakete markiert, was wir durch ein Modul freischalten können
- Aus-/Eingehende ESP-Pakete müssen erlaubt werden
- Pakete aus dem anderen LAN müssen vor den Regeln der PREROUTING-Kette bewahrt werden, falls es sich um das WAN-Interface handelt
- vim /usr/local/sbin/firewall
#!/bin/bash LANDEV="enp0s8" DMZDEV="enp0s9" WANDEV="enp0s3" LAN="172.16.1xx.0/24" DMZ="10.0.1xx.0/24" WANIP="192.168.3.1xx" DNSSERVER="10.0.1xx.2" WEBSERVER="10.0.1xx.3" SFTPSERVER="10.0.1xx.4" RIGHTNET=172.16.1yy.0/24 case $1 in start) echo "starte Firewall" iptables -F iptables -F -t nat iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -i $LANDEV -s $LAN -j ACCEPT iptables -A INPUT -i $WANDEV -p esp -j ACCEPT iptables -A INPUT -m multiport -p udp --dport 500,4500 -i $WANDEV -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -i $LANDEV -j ACCEPT iptables -A INPUT -j LOG --log-prefix "iptables drop INPUT: " iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -o $WANDEV -p esp -j ACCEPT iptables -A OUTPUT -m multiport -p udp --dport 500,4500 -o $WANDEV -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -m multiport -p tcp --dport 22,53,2222 -o $DMZDEV -d $DMZ -j ACCEPT iptables -A OUTPUT -m multiport -p udp --dport 53 -o $DMZDEV -d $DMZ -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix "iptables drop OUTPUT: " iptables -P FORWARD DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $WANDEV -o $DMZDEV -d $DNSSERVER -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 80,443 -i $WANDEV -o $DMZDEV -d $WEBSERVER -j ACCEPT iptables -A FORWARD -p tcp --dport 2222 -i $WANDEV -o $DMZDEV -d $SFTPSERVER -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 80,443 -i $LANDEV -j ACCEPT iptables -A FORWARD -m multiport -p tcp --dport 53,80,443 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $LANDEV -j ACCEPT iptables -A FORWARD -p udp --dport 53 -i $DMZDEV -o $WANDEV -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT iptables -A FORWARD -i $WANDEV -o $LANDEV -m policy --dir in --pol ipsec -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -m policy --dir out --pol ipsec -j ACCEPT iptables -A FORWARD -j LOG --log-prefix "iptables drop FORWARD: " iptables -t nat -A PREROUTING -i $WANDEV -s $RIGHTNET -j RETURN iptables -t nat -A PREROUTING -p udp --dport 53 -i $WANDEV -j DNAT --to $DNSSERVER iptables -t nat -A PREROUTING -m multiport -p tcp --dport 80,443 -i $WANDEV -j DNAT --to $WEBSERVER iptables -t nat -A PREROUTING -p tcp --dport 22 -i $WANDEV -j DNAT --to $SFTPSERVER:2222 iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -d $RIGHTNET -j RETURN iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j SNAT --to-source $WANIP iptables -t nat -A POSTROUTING -s $DMZ -o $WANDEV -j SNAT --to-source $WANIP ;; stop) echo "stoppe Firewall" iptables -F iptables -F -t nat iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # Internetzugriff für alle mit dynamischer IP iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE ;; *) echo "usage: $0 start|stop" ;; esac
OpenVPN
- Strongswan stoppen und OpenVPN installieren
- ipsec stop
- apt install openvpn
- Dummy interface für den Routing Modus erstellen
- vim /etc/network/interfaces
... auto dummy0 iface dummy0 inet static address 172.24.24.1xx/24 pre-up ip link add dummy0 type dummy
- ifdown -va ; ifup -va
OpenVPN Site-to-Site mit PSK aufbauen
- Die Konfigurationsdateien für OpenVPN sind unter /etc/openvpn
- cd /etc/openvpn
Partner 1
- OpenVPN hat einen eigenen Befehl, um einen PSK zu erzeugen
- openvpn --genkey secret /etc/openvpn/ps.key
- Diesen Schlüssel Partner 2 zukommen lassen
Partner 2
- Schlüssel unter /etc/openvpn/ speichern
Verbindungskonfiguration
- Die Konfiguration der beiden Stellen ist symmetrisch, d.h. xx ist die eigene Nummer und yy ist die des Partners
- vim /etc/openvpn/psk-server.conf
remote 192.168.3.1yy dev tun ifconfig 172.24.24.1xx 172.24.24.1yy secret ps.key route 172.16.1yy.0 255.255.255.0 keepalive 10 120
- systemd erstellt automatisch die richtige Service-Datei, wenn es neugeladen wird
- systemctl daemon-reload
- systemctl start openvpn@psk-server
- Die Regeln der Firewall sollten um den UDP Port 1194 in der INPUT/OUTPUT-Kette erweitert werden
- Außerdem muss in der FORWARD-Kette das LAN des Partners freigeschaltet werden
- vim /usr/local/sbin/firewall
... iptables -A INPUT -m multiport -p udp --dport 500,4500,1194 -i $WANDEV -j ACCEPT ... iptables -A OUTPUT -m multiport -p udp --dport 500,4500,1194 -o $WANDEV -j ACCEPT ... iptables -A FORWARD -i $LANDEV -d $RIGHTNET -j ACCEPT iptables -A FORWARD -o $LANDEV -s $RIGHTNET -j ACCEPT
- Nun sollte man das LAN des Partners erreichbar sein
OpenVPN Site-to-Site mit Zertifikat aufbauen
- Wir können die Zertifikate für Strongswan hier weiter nutzen
- Dafür erstellen wir einen speziellen Ordner unter /etc/openvpn
- mkdir /etc/openvpn/ssl
- cp /etc/ipsec.d/private/fw1xx.key /etc/ipsec.d/certs/fw1xx.crt /etc/ipsec.d/cacerts/ca.crt /etc/openvpn/ssl
Partner 1
- Partner 1 generiert zusätzlich einen Diffie-Hellman Parameter in diesen Ordner
- openssl dhparam -out /etc/openvpn/ssl/dh2048.pem 2048
- Die Verbindungskonfiguration muss diese Dateien finden
- vim /etc/openvpn/cert-server.conf
remote 192.168.3.1yy dev tun tls-server ifconfig 172.24.24.1xx 172.24.24.1yy route 172.16.1yy.0 255.255.255.0 keepalive 10 120 dh ssl/dh2048.pem ca ssl/ca.crt cert ssl/fw1xx.crt key ssl/fw1xx.key
- systemctl daemon-reload
- systemctl start openvpn@cert-server
Partner 2
- vim /etc/openvpn/cert-client.conf
remote 192.168.3.1yy dev tun tls-client ifconfig 172.24.24.1xx 172.24.24.1yy route 172.16.1yy.0 255.255.255.0 keepalive 10 120 ca ssl/ca.crt cert ssl/fw1xx.crt key ssl/fw1xx.key
- systemctl daemon-reload
- systemctl start openvpn@cert-client
OpenVPN mit User-Authentication einrichten
- Hier kann man alleine weitermachen
- Vorher alle anderen VPNs stoppen und Routingeinträge neu laden
- systemctl stop openvpn@cert-server bzw. systemctl stop openvpn@cert-client
- ifdown -va ; ifup -va
- Falls noch kein Diffie-Hellman Schlüssel erzeugt wurde, dann diesen Schritt noch wiederholen
- openssl dhparam -out /etc/openvpn/ssl/dh2048.pem 2048
- vim /etc/openvpn/user-auth-server.conf
dev tun mode server tls-server topology subnet server 172.24.24.0 255.255.255.0 route-gateway 172.24.24.1 push 'route 172.16.1xx.0 255.255.255.0' cipher AES-256-CBC link-mtu 1543 keepalive 10 30 client-to-client dh ssl/dh2048.pem ca ssl/ca.crt cert ssl/fw1xx.crt key ssl/fw1xx.key verify-client-cert none plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so /etc/pam.d/login
- Diese Konfiguration starten
- systemctl daemon-reload
- systemctl start openvpn@user-auth-server
- Nun geht es auf dem LAN Host weiter
- Das Zertifikat der Zertifizierungsstelle holen und in die OpenVPN Konfigurationsdatei einbinden
- scp root@fw:/etc/openvpn/ssl/ca.crt .
- Distributionsabhängig OpenVPN installieren
- apt install openvpn
- pacman -S openvpn
- Client-Konfiguration erstellen mit dem Inhalt der ca.crt
- vim lab1xx.ovpn
dev tun0 remote 192.168.3.1xx tls-client cipher AES-256-CBC pull auth-user-pass <ca> -----BEGIN CERTIFICATE----- MIIFAzCCAuugAwIBAgIUL5Pyu5Rlwi/noznd1CWK3r4IZiEwDQYJKoZIhvcNAQEL BQAwETEPMA0GA1UEAwwGdnBuLWNhMB4XDTIzMDgwNjA3NDY1N1oXDTI0MDgwNTA3 NDY1N1owETEPMA0GA1UEAwwGdnBuLWNhMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAuYYi369+gKR0RC4vdRvpB0bL6EuUEiwDaPD7XDE5i21gyC/Z5wOr bv8UTZ1JO4UoTabUZaCDjNOjG4dJA/dr4LKwmnugS2ODO+Bk9fmPpeRVVVFi5kZR zX6iqNkXXydmIYwxJcTzHq+Dro0jSMUsOChhGhuI+DqU2jbiLm4LsQ//EzMwt54l igLNynA8k6cg20sDekaSiZm3STQh4SOwBGVWzH0MX0l7PvOpFs22rdnWGGCkdQlo 6yG+oLGwd8G8zJFBNfwQTWKYRkAlJi3gGC+tXMsbQflyImqATVsMOAH0dGCetlfV izrzApTz0ntPxdp4cF2dE6VWvip+GBMZuned4fKXNzkl+Vf4IhmUxxPrBxUViSgM UCftojAecB9+6fgETJ2NcZejqSv7QHZN86MBb2sB2IftEqGk0VCS+MeXZglf8AwY SK5iV9oc97GHbrPdXDlJOwI5MrqCNv+T5BzwuVJ4sRXORSZsDVrz7MpAPaZj86lr V3KB3RQWDQrxMJyG4K7gBMbJBW7YUIdmviVUFB9k6zv53pvfedM2vHbrCbFATtrj dXNTy4dl3dLTV9NGjYXPa66JpsFIR4UgWGugSoEsGn7m7zqZ43IGrRPOn7spEqCR r1gGGM1mVeVKB0cdG++jK/3FNjrWuVPT2K7IyzxMep4A1fKhl56mJR8CAwEAAaNT MFEwHQYDVR0OBBYEFOrV2doki3JZ0qs9IvnJ2PK1t3azMB8GA1UdIwQYMBaAFOrV 2doki3JZ0qs9IvnJ2PK1t3azMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL BQADggIBALhBLzogYcNrMghWu4JBD9+gY8+7BwvZW8oFa4yO2Cb+VQ56oyOeq2IW QoNQgQpTKFPPMw/gfe8bTfbFP1qG/nfxoHBrzn5Gt6hkTQ3dhvNkkOiQDYlXhJ0v pNs+UVxkDhQxPBwvlE5BQIvElGKcEfrgXqQE6zdWWP5b6yrt8eTI+TBP32+hS3gc I6pvKEv2mxd/SchXlbNEKqUYdYldxc4GXwuYKfgjzo+aAbaw2FCbiVtwg8f7a3ky GtYUP41eEl24FyRWI4L/wLPha8k7YjZqiTB8NKj5L7sB+mKbMXsEwqlKh8BmjPXN WAGVpfcetV0UkJS/diKZyqTa1MFb4TIexpNa9GLxEGGg8zsgVypL2TG5sCiecoSF gGbm7yE9Yb4IF0v4X57gbULAZFMzaUkk65Y2f2VJ5RoJCBl51SWOWm5gMXz5vmwk GihwB+oLvcjoZIBc3MrB9ZHdZ60qCzOtTGiSlhqfJETrzaRgAx5Z4PWY9F9iwucC OW9eOMXpOPqW80CO/Y0srX9C9LpmM/s9SXzgey+MV+iH5VPE3eMVDj7axQsPbgqb lXoRa2ENyOltSPzejlh33DHoYreov464JtrMMjQ6I2YlcXlUJycL2gPysA0Ad/zd I2p2luSylfNI7DdfmuZrhhdlPg1kMS2QzyQr2quf9YZSJwSgdbhr -----END CERTIFICATE----- </ca>
- Nun die Maschine ausschalten, klonen und "außerhalb" des Labors hängen (NAT Adapter bzw. Netzwerkbrücke)
- openvpn --config lab1xx.ovpn
HIDS
AIDE
statische AIDE
- apt install aide
- Aide Config
- Aide Test
- Änderungen bestätigen und Datenbank updaten
- aide --config=/etc/aide/aide.conf --update
- cp -v /var/lib/aide/aide.db{.new,}
dynamische AIDE
- Es wird davon abgeraten dynamisches AIDE zu verwenden
- apt install aide-dynamic
- Eine bösartig verlinkte Funktionsbibliothek könnte zur Fehlfunktion von AIDE führen
- Unterschiede statisch vs. dynamisch gelinked
Tripwire
- apt update && apt install tripwire
- Man kann alle Prompts bei der Installation mit Ja bestätigen
- Die Passphrasen für Local-/Site-Key sollte man sich merken
- Diese werden zum Signieren von Änderungen benutzt
- Auch hier die Default Policy-Datei als Backup/Referenz nutzen
- cd /etc/tripwire
- mv /etc/tripwire/twpol.txt{,.orig}
- vim /etc/tripwire/twpol.txt
/etc -> $(ReadOnly); !/etc/tripwire;
- twadmin --create-polfile /etc/tripwire/twpol.txt
- Mehr Syntax kann man nachlesen unter: man twpolicy (relativ ähnlich zu AIDE)
- Tripwire verwaltet eine Datenbank um auf Regelverstöße zu prüfen.
- tripwire --init
- tripwire --check -r report.twr
- touch /etc/ssh/newfile
- tripwire --check -r report.twr
- Für ein Datenbankupdate muss der dazugehörige Bericht mit angegeben werden, falls nicht die Default Datei verwendet wurde
- tripwire --update -r report.twr
- tripwire --check -r report.twr
- Den Schweregrad des Regelverstoßes kann man auch anpassen
/etc -> $(ReadOnly) (severity=35); /root -> $(ReadOnly) (severity=10); !/etc/tripwire;
Fail2ban für SSH/SFTP einrichten
- apt install iptables fail2ban
- Plan ist es den DNS Server als Angreifer auf den SFTP Server zu starten
- Fail2ban ssh
Proxies
Squid als Standard Proxy
Transparenter Proxy
Virenscanning mit ClamAV in Squid
SOCKS Proxy
- SOCKS Proxies verbinden Client und Server protokollunabhängig über einen Proxy
- Eine verschlüsselte SOCKS Verbindung kann man am einfachsten mit SSH erreichen
- ssh -fnN -D 8080 kit@sftp
- curl www.lab1xx.sec
- curl --socks5 localhost:8080 www.lab1xx.sec
- Unterschiedliche IPs sollten unter /var/log/apache2/access.log zu sehen sein
Greenbone Security/Vulnerability Manager (Hacking & Security Seite 161)
- Kali Festplatte auf den realen Host ziehen
- scp kit@192.168.3.200:~/Downloads/kali-linux-2023.2-virtualbox-amd64/kali-linux-2023.2-virtualbox-amd64.vdi Dokumente
- Neue Maschine mit dieser Festplatte erstellen und in die DMZ hängen
- Benutzer/Passwort: kali
- sudo su
- apt update
- apt install gvm
- Auf der Firewall TCP Port 873 in der FORWARD Kette für die DMZ freischalten, da der Download über rsync abläuft
- GVM initialisieren und das Passwort merken, aufschreiben oder in eine Datei speichern
- gvm-setup
- greenbone-feed-sync --type scan-config
- Falls das immernoch nicht funktioniert
- Die User ID des Admins holen...
- runuser -u _gvm -- gvmd --get-users --verbose
- ...und Konfiguration des Benutzers ändern
- runuser -u _gvm -- gvmd --modify-setting 78eceaec-3385-11ea-b237-28d24461215b --value <uuid_of_user>
Suricata
- ein IDS/IPS matcht im Gegensatz zur Firewall auch auf höheren Schichten.
- So können z.B. bestimmte DNS Abfragen oder HTTP Anfragen gemeldet oder blockiert werden
- Ein weiterer Anwendungsfall wäre die Version von Diensten zu überprüfen und jene mit bekannten Schwachstellen ablehnen
Suricata Installation
Suricata IDS
Suricata IPS
Angriffe simulieren
nmap
metasploit
Nftables
- Bessere Performance als iptables
- atomare Änderungen sind möglich durch die Konfigurationsdatei /etc/nftables.conf
- Regelwerke werden nicht komplett nach jeder Änderung im Kernel neugeladen
- kein Overhead durch impliziten Paket-Counter
- Support für Hashtabellen, um schneller auf Eigenschaften des Pakets zu matchen
- Standard Tabellen und Ketten können beliebig benannt werden (Obwohl es besser ist sich an die iptables Konvention zu halten)
- Die Reihenfolge der Ketten kann beliebig definiert werden
- Es können beliebig viele "Standardketten" definiert werden
- Logging und Mangling können gleich in der dazugehörigen ACCEPT/DROP Regel angewandt werden
- Nftables erfährt von den Regeln die von Iptables definiert wurden
- firewall start
- nft list ruleset
- Die Konfigurationdatei liegt unter /etc/nftables.conf
- Eine Systemd-Service Datei existiert schon für das ein-/ausschalten der Firewall
Übersetzung
- vim /etc/nftables.conf
nft flush ruleset define WANDEV = "enp0s3" define LANDEV = "enp0s8" define DMZDEV = "enp0s9" define LAN = 172.16.100.0/24 define RIGHTSIDE = 172.16.107.0/24 define DMZ = 10.0.100.0/24 define DNSSERVER = 10.0.100.2 define WEBSERVER = 10.0.100.3 define SFTPSERVER = 10.0.100.4 define WANIP = 192.168.3.100 table ip filter { chain INPUT { type filter hook input priority filter; policy drop; iif "lo" accept iif $WANDEV esp accept ct state related,established accept iif $LANDEV tcp ip saddr $LAN tcp dport { 2222,8888,8889} accept iif $LANDEV icmp type echo-request accept iif $WANDEV udp dport { 500,4500,1194} accept log prefix "nftables drop INPUT: " } chain OUTPUT { type filter hook output priority filter; policy drop; oif "lo" accept oif $WANDEV esp accept ct state related,established accept icmp icmp type echo-request accept oif $WANDEV tcp dport { 80,443} accept oif $DMZDEV ip daddr $DMZ tcp dport { 22,2222} accept oif $DMZDEV ip daddr $DMZ udp dport 53 accept oif $WANDEV udp dport { 500,4500,1194} accept log prefix "nftables drop OUTPUT: " } chain FORWARD { type filter hook forward priority filter; policy drop; iif $LANDEV oif $DMZDEV mark and 0x1 != 0x1 queue ct state related,established accept iif $WANDEV oif $LANDEV secpath exists accept iif $LANDEV oif $WANDEV accept iif $LANDEV ip daddr $RIGHTSIDE accept oif $LANDEV ip saddr $RIGHTSIDE accept iif $LANDEV oif $WANDEV tcp tcp dport { 22,80,443} accept iif $LANDEV oif $DMZDEV tcp tcp dport { 80,443} accept iif $LANDEV oif $WANDEV udp udp dport 53 accept iif $DMZDEV oif $WANDEV tcp tcp dport { 53,80,443} accept iif $DMZDEV oif $WANDEV udp udp dport 53 accept iif $LANDEV oif $DMZDEV udp udp dport 53 accept icmp icmp type echo-request accept iif $DMZDEV oif $WANDEV icmp icmp type echo-request accept udp ip daddr $DNSSERVER udp dport 53 accept tcp ip daddr $WEBSERVER tcp dport { 80,443} accept tcp ip daddr $SFTPSERVER tcp dport 2222 accept log prefix "nftables drop FORWARD: " } } table ip nat { chain PREROUTING { type nat hook prerouting priority dstnat; iif $WANDEV ip saddr 172.16.107.0/24 return iif $LANDEV tcp tcp dport 80 redirect to :8889 iif $LANDEV tcp tcp dport 443 redirect to :8888 iif $WANDEV udp udp dport 53 dnat to $DNSSERVER iif $WANDEV tcp tcp dport 80 dnat to $WEBSERVER iif $WANDEV tcp tcp dport 443 dnat to $WEBSERVER iif $WANDEV tcp tcp dport 22 dnat to $SFTPSERVER:2222 } chain POSTROUTING { type nat hook postrouting priority srcnat; oif $WANDEV ip saddr $LAN ip daddr 172.16.107.0/24 return oif $WANDEV ip saddr $LAN snat to $WANIP oif $WANDEV ip saddr $DMZ snat to $WANIP } }
IP bei zuvielen Anfragen sperren
- Original: https://wiki.archlinux.org/title/Nftables#Dynamic_blackhole
- vim /etc/nftables.conf
table inet filter { set blackhole { type ipv4_addr; flags dynamic, timeout; size 65536; } chain input { ... ct state new tcp dport 80 \ meter flood size 128000 { ip saddr timeout 10s limit rate over 10/minute } \ add @blackhole { ip saddr timeout 1m } ip saddr @blackhole counter drop } ... }
OWASP Juice Shop
- Juice Shop ist eine Webapplikation mit vielen absichtlich eingebauten Schwachstellen zum Lernen von Hacking-Prinzipien
- Am einfachsten lässt es sich über Docker installieren
- Der Docker Container soll auf dem Webserver laufen (folgende Befehle auf dem Webserver)
- systemctl disable --now apache2
- apt install docker.io
- docker pull bkimminich/juice-shop
- docker run -d -p 0.0.0.0:80:3000 bkimminich/juice-shop