Linux - Security und Firewall Plan - Linkai

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

VirtualBox Vorlagen

  • Debian: Dienen als Server, Firewall oder generell Rechner, die keine graphische Oberfläche benötigen (sollte schon in Virtualbox als debian-bullseye-server vorhanden sein)
  • 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.3.200:~/Dokumente/lan-host.ova ~/Dokumente

Tag 1

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

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
...

Tag 2

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

  • 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

Tag 3

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; };
};


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    172.16.1xx.1
  • 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
...

Tag 4

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.178.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:

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:
  1. Pakete, die für das andere LAN bestimmt sind müssen durch den VPN-Tunnel gezwungen werden
  2. Dadurch werden die Pakete beim Forwarden als ipsec-Pakete markiert, was wir durch ein Modul freischalten können
  3. Aus-/Eingehende ESP-Pakete müssen erlaubt werden
  4. 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.178.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

Tag 5

OpenVPN

  • Strongswan stoppen und OpenVPN installieren
  • ipsec stop
  • apt install openvpn
  • Dummy interface für den Bridging 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.178.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.178.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

  • 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.1xx
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
  • 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>

HIDS

  • AIDE
  • Tripwire

Tag 6

  • Fail2ban für SSH einrichten

NIDS

Tag 7

  • Squid Proxy konfigurieren (Application und transparent)
  • Virenscanning mit ClamAV in Squid

Tag 8

  • Angriffe mit nmap versuchen
  • System anpassen, anschauen wo was Alarm schlägt