|
|
| (26 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
| Zeile 8: |
Zeile 8: |
| {{#drawio:linux-sec-fire-00.1}} | | {{#drawio:linux-sec-fire-00.1}} |
|
| |
|
| = VirtualBox Vorlage = | | = VM Vorlage = |
| * Ein Debian 12 Server wurde mit Standardprogrammen [[Debian Template|vorbereitet]] | | *[[VM Vorlage Linux - Security und Firewall Labor]] |
| * Für neue Server sollte immer ein '''vollständinger''' Klon mit '''neuen MAC-Adressen''' erzeugt werden
| |
|
| |
|
| = Hostzugriff absichern = | | = Hostzugriff absichern = |
| * Falls man physischen Zugriff zur Maschine hat, kann die Authentifzierung von ''root'' beim Booten umgangen werden
| | *[[Hostzugriff absichern Linux - Security und Firewall Labor]] |
| * [[Linux boot hacking|Bootsicherheit/-hacking]] | |
| * Das wollen wir an der Firewall verhindern
| |
| * [[Grub2 Password|GRUB Passwort einrichten]]
| |
|
| |
|
| = Remotezugriff mit [[:Kategorie:SSH|SSH]] = | | = Remotezugriff mit [[:Kategorie:SSH|SSH]] = |
| * Da man nicht immer physisch an einer Maschine anwesend sein kann, empfiehlt es sich Hosts über SSH zu steuern | | *[[Remotezugriff mit - Linux - Security und Firewall Labor]] |
| * Der Datenverkehr ist dabei verschlüsselt, damit es beide Maschinen vor potentiellen Angreifern schützt, die den Verkehr mitschneiden
| |
| * Jeder Host soll über das [[SSH-Protokoll]] administrierbar sein
| |
| * Generieren Sie einen SSH-Schlüssel mit der Passphrase, z.B. ''123Start$''
| |
| * hinterlegen Sie den öffentlichen Schlüssel für die Nutzer ''kit'' und ''root'' auf der Firewall
| |
| * Der SSH-Server sollte nach Sicherstellung des Zugriffs über autorisierte SSH-Schlüssel keine Passwort-Authentifizierung mehr zulassen: [[SSH-Server Hardening]]
| |
| * Am Ende sollte jeder Host über '''ssh ''user''@''ip.oder.host.name'' ''' erreichbar sein
| |
| | |
| = Router Firewall = | | = Router Firewall = |
| * Hardwareanpassungen, damit die Dienste später auch genug Ressourcen haben: | | *[[Router Firewall - Linux - Security und Firewall Labor]] |
| ** 4 GB RAM
| |
| ** 4 CPUs
| |
| ** 3 Netzwerkkarten
| |
| * Als nächstes setzen wir den Hostnamen der äußeren '''Router Firewall''' und konfigurieren die statischen IP
| |
| * '''hostnamectl set-hostname firewall'''
| |
| * für die statische IP muss die Datei ''/etc/network/interfaces'' bearbeitet werden (Distributions abhängig)
| |
| * '''vim ''/etc/network/interfaces'' '''
| |
| <pre>
| |
| auto lo
| |
| iface lo inet loopback
| |
|
| |
| auto enp0s3
| |
| iface enp0s3 inet static
| |
| address 192.168.''HS''.1''xx''/24
| |
| gateway 192.168.''HS''.254
| |
| | |
| auto enp0s8
| |
| iface enp0s8 inet static
| |
| address 172.18.1''xx''.1/24
| |
|
| |
| auto enp0s9
| |
| iface enp0s9 inet static
| |
| address 10.88.1''xx''.1/24
| |
| auto enp0s10
| |
| | |
| iface enp0s10 inet static
| |
| address 172.16.1''xx''.1/24
| |
| </pre>
| |
| | |
| * '''ifdown -va ; ifup -va'''
| |
| * bzw.
| |
| * '''systemctl restart networking'''
| |
| * Als Kontrolle kann man '''ip addr show''' ausführen
| |
|
| |
|
| =Firewall= | | =Firewall= |
| Zeile 67: |
Zeile 23: |
| *[[iptables firewall]] | | *[[iptables firewall]] |
|
| |
|
| == DHCP ==
| | = DHCP = |
| * Damit Hosts im LAN automatisch eine IP-Adresse erlangen, konfigurieren wir nun einen DHCP Server (Befehle ab hier finden auf der '''Firewall''' statt!) | | *[[DHCP Linux - Security und Firewall Labor]] |
| * '''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 enp0s9"
| |
| | |
| * '''vim ''/etc/dhcp/dhcpd.conf'' '''
| |
| | |
| option domain-name-servers 1.1.1.1;
| |
| default-lease-time 7200;
| |
|
| |
| subnet 172.17.1xx.0 netmask 255.255.255.0 {
| |
| range 172.17.1xx.50 172.17.1xx.100;
| |
| option routers 172.17.1xx.1;
| |
| }
| |
|
| |
| subnet 10.0.1xx.0 netmask 255.255.255.0 {
| |
| range 10.0.1xx.50 10.0.1xx.100;
| |
| option routers 10.0.1xx.1;
| |
| }
| |
| | |
| * '''systemctl restart isc-dhcp-server.service'''
| |
|
| |
|
| =Switch= | | =Switch= |
| Zeile 103: |
Zeile 30: |
|
| |
|
| = DNS für das Labor einrichten = | | = DNS für das Labor einrichten = |
| {{#drawio:linux-sec-fire-02}}
| | *[[DNS für das Labor einrichten - Linux - Security und Firewall Labor]] |
|
| |
|
| == Vorbereitungen ==
| |
| * VirtualBox Server-Vorlage mit neuen MAC-Adressen klonen
| |
| * Der Host soll im ''DMZ''-Netzwerk liegen
| |
| * IP-Adresse herausfinden über das DHCP-Log oder die Konsole
| |
| * SSH-Schlüssel des Kit Hosts für User ''kit'' und ''root'' hinterlegen
| |
| * statische IP-Adresse nach dem Netzwerkplan setzen (''/etc/network/interfaces'')
| |
| * Hostname ändern zu ''dns''
| |
| * SSH-Server anpassen
| |
|
| |
| =Nameserver=
| |
| *[[DNS Linux - Netzwerk und Serveradministration - Skript]] | | *[[DNS Linux - Netzwerk und Serveradministration - Skript]] |
| == Portforwarding mit [[iptables Nat|iptables]] == | | =SFTP Server= |
| | | *[[SFTP Server Linux - Security und Firewall Labor]] |
| * Damit andere den Namenserver in der DMZ befragen können, muss die Firewall ein Destination NAT auf UDP Port 53 durchführen
| |
| * Hier ein Bespiel wie die Firewall aussehen könnte
| |
| * '''vim /usr/local/sbin/firewall'''
| |
| | |
| #!/bin/bash
| |
|
| |
| LANDEV="enp0s8"
| |
| DMZDEV="enp0s9"
| |
| WANDEV="enp0s3"
| |
| LAN="172.16.1''xx''.0/24"
| |
| DMZ="10.0.1''xx''.0/24"
| |
| WANIP="192.168.3.1''xx''"
| |
| '''DNSSERVER="10.0.1''xx''.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.1''xx''.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.1''xx''.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 $WEBSERVER
| |
| ...
| |
| | |
| * '''vim /var/cache/bind/intern/lab1''xx''.sec'''
| |
| | |
| $TTL 300
| |
| @ IN SOA dns.lab1''xx''.sec. mail.lab1''xx''.sec. (2023091302 14400 3600 3600000 86400)
| |
| IN NS dns
| |
| firewall IN A 192.168.11.1''xx''
| |
| dns IN A 10.0.1''xx''.2
| |
| web IN A 10.0.1''xx''.3
| |
| sftp IN A 10.0.1''xx''.4
| |
| lan IN A 172.16.1''xx''.2
| |
| www IN A 192.168.11.1''xx''
| |
| | |
| = 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: | |
| ** Netzwerk: DMZ
| |
| ** IP: 10.0.1''xx''.4/24
| |
| ** Hostname: sftp
| |
| ** Firewall sollte von TCP Port 22 auf den SSH Port des SFTP-Servers zulassen
| |
| ** sftp.lab''xx''.sec sollte auflösbar sein (auf intern und extern achten)
| |
| ** SSH-Schlüssel hinterlegen
| |
| * 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'''
| |
| * '''systemctl restart sshd'''
| |
| * 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 ''[[Ipsec.conf Erklärung|/etc/ipsec.conf]]'' konfiguriert
| |
| | |
| == IPsec Site-to-Site aufbauen mit PSK ==
| |
| {{#drawio:linux-sec-fire-03}}
| |
| | |
| * Diese Einstellung kann auf beiden Seite gleich angewendet werden (bis auf die IPs)
| |
| * '''apt install strongswan'''
| |
| * ''xx'' eigene Seite, gegenüberliegende Seite ''yy''
| |
| * '''vim ''/etc/ipsec.conf'' '''
| |
| | |
| conn site2site-psk
| |
| authby='''secret'''
| |
| keyexchange=ikev2
| |
| left=192.168.3.1''yy''
| |
| leftid=192.168.3.1''yy''
| |
| leftsubnet=172.16.1''yy''.0/24
| |
| mobike=no
| |
| right=192.168.3.1''xx''
| |
| rightid=192.168.3.1''xx''
| |
| rightsubnet=172.16.1''xx''.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.lab1''yy''.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.1''xx'' 192.168.3.1''yy'' : 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'''
| |
| * Verbindung herunterfahren
| |
| * '''ipsec down site2site-psk'''
| |
| * Verbindung status
| |
| * '''ipsec status 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 -I 172.16.1''xx''.1 172.16.1''yy''.1'''
| |
| | |
| == 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 '''fw1''xx'' ''' bzw. '''fw1''yy'' ''' 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 fw''1xx''.key 4096'''
| |
| * Einen '''C'''ertificate '''S'''igning '''R'''equest erstellen
| |
| *'''openssl req -new -key fw1''xx''.key -out fw1''xx''.csr'''
| |
|
| |
|
| ...
| | =Strongswan IPSEC= |
| Common Name (e.g. server FQDN or YOUR name) []:'''fw1''xx'' '''
| | *[[Strongswan IPSEC Linux - Security und Firewall Labor]] |
| ...
| | =Wireguard= |
| | | *[[Wireguard Server for Roadwarrior]] |
| *'''openssl x509 -req -days 730 -in fw1''xx''.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out fw1''xx''.crt'''
| |
| * Zertifikat der Zertifizierungsstelle Partner 2 zukommen lassen (ca.crt)
| |
| | |
| === Partner 2 ===
| |
| | |
| * Erstellt Zertifizierungsantrag... | |
| *'''mkdir ~/cert'''
| |
| *'''cd ~/cert'''
| |
| *'''openssl genrsa -out fw''1yy''.key 4096'''
| |
| *'''openssl req -new -key fw1''yy''.key -out fw1''yy''.csr'''
| |
| | |
| ...
| |
| Common Name (e.g. server FQDN or YOUR name) []:'''fw1''yy'' '''
| |
| ...
| |
| | |
| * ... und lässt es Partner 1 zukommen (fw1''yy''.csr)
| |
| * Konfigurieren der Verbindung
| |
| * '''vim /etc/ipsec.conf'''
| |
| | |
| conn site2site-cert
| |
| authby=rsasig
| |
| keyexchange=ikev2
| |
| left=192.168.3.1''yy''
| |
| leftcert="fw1''yy''.crt"
| |
| leftsubnet=172.16.1''yy''.0/24
| |
| right=192.168.3.1''xx''
| |
| rightid="CN=fw1''xx''"
| |
| rightsubnet=172.16.1''xx''.0/24
| |
| ike=aes256-sha256-modp4096!
| |
| esp=aes256-sha256-modp4096!
| |
| auto=start
| |
| | |
| === Partner 1 ===
| |
| | |
| * Signiert den Antrag
| |
| *'''openssl x509 -req -days 730 -in fw1''yy''.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out fw1''yy''.crt'''
| |
| * Schickt diesen zurück bzw. hinterlegt ihn auf dem SFTP Server ('''fw1''yy''.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.1''xx''
| |
| leftcert="fw1''xx''.crt"
| |
| leftsubnet=172.16.1''xx''.0/24
| |
| right=0.0.0.0 # Egal welche IP,...
| |
| rightid="CN=fw1''yy''" # ...aber der Commonname muss stimmen
| |
| rightsubnet=172.16.1''yy''.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/fw1''xx''.key # bzw. f1''yy''.key
| |
| /etc/ipsec.d/certs/fw1''xx''.crt # bzw. f1''yy''.crt
| |
| /etc/ipsec.d/cacerts/ca.crt
| |
| | |
| * ...und in der ''ipsec.secrets'' Datei zur Verbindung zugewiesen werden
| |
| * '''vim /etc/ipsec.secrets'''
| |
| | |
| 192.168.3.1''xx'' : RSA fw1''xx''.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.1''xx''.0/24"
| |
| DMZ="10.0.1''xx''.0/24"
| |
| WANIP="192.168.3.1''xx''"
| |
| DNSSERVER="10.0.1''xx''.2"
| |
| WEBSERVER="10.0.1''xx''.3"
| |
| SFTPSERVER="10.0.1''xx''.4"
| |
| '''RIGHTNET=172.16.1''yy''.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 Grundlagen|OpenVPN]] = | | = [[Openvpn Grundlagen|OpenVPN]] = |
| *[[OpnVPN Linux - Security und Firewall Labor]] | | *[[OpnVPN Linux - Security und Firewall Labor]] |
| | |
| | =Crowdsec= |
| | *[[Crowdsec Grundsätzliches]] |
| | *[[Crowdsec Einordnung]] |
| | *[[Crowdsec Installation und Handling]] |
| | *[[Crowdsec SSH Bruteforce Beispiel]] |
|
| |
|
| = Fail2ban für SSH/SFTP einrichten = | | = Fail2ban für SSH/SFTP einrichten = |
| *'''apt install iptables fail2ban'''
| | *[[Fail2ban für SSH/SFTP einrichten]] |
| * Plan ist es den DNS Server als Angreifer auf den SFTP Server zu starten
| |
| * [[Fail2ban ssh]] | |
|
| |
|
| = [[Proxy Konzepte|Proxies]] = | | = [[Proxy Konzepte|Proxies]] = |
| == SOCKS Proxy == | | == SOCKS Proxy == |
| | | *[[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.lab1''xx''.sec
| |
| * '''curl --socks5 localhost:8080 www.lab1''xx''.sec
| |
| * Unterschiedliche IPs sollten unter ''/var/log/apache2/access.log'' zu sehen sein
| |
|
| |
|
| == [[Squid ACL Basic|Squid als Standard Proxy]] == | | == [[Squid ACL Basic|Squid als Standard Proxy]] == |
| Zeile 617: |
Zeile 71: |
|
| |
|
| = [[Suricata]] = | | = [[Suricata]] = |
| {{#drawio:linux-sec-fire-06}}
| | *[[Suricata Linux - Security und Firewall Labor]] |
| | |
| | |
| == [[Suricata Installation]] ==
| |
| * 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
| |
| * Als Angriffsziel können wir OWASP [[Juice Shop]] auf dem Webserver installieren
| |
| | |
| == [[Suricata IDS]] ==
| |
| * Anhand von Signaturen erkennt Suricata bösartige Pakete
| |
| * Im IDS-Modus kann Suricata nur vor verdächtigen Paketen warnen
| |
| | |
| == [[Suricata IPS]] ==
| |
| * Die SQL-Injection im Login soll über Suricata blockiert werden
| |
| * Falls Suricata über das Annehmen eines Paketes entscheiden darf, sollten die Firewall-Regeln nicht ignoriert werden
| |
|
| |
|
| = [[Mandatory Access Control]] = | | = [[Mandatory Access Control]] = |
| Zeile 638: |
Zeile 77: |
| == [[Apparmor]] == | | == [[Apparmor]] == |
| == [[SELinux]] == | | == [[SELinux]] == |
| * Als Angriffsziel modifizieren wir den Apache2 Server: [[Command Injection Proof of Concept]] | | *[[SELinux - Linux - Security und Firewall Labor]] |
| * Ein Benutzer versucht ein Programm aufzurufen.
| |
| * Dem Benutzer ist ein Benutzer Typ zugeordnet.
| |
| * Dem Pragamm ist ein Progamm Typ zugeordnet.
| |
| * SELinux checkt nun ob der Benutzer Typ das Programm anhand des Programm Typ aufrufen darf.
| |
| * Dann wird gecheckt ob der Benutzer Typ zu dem Prozess Typ transitieren darf.
| |
| * Wenn dies erlaubt ist transitiert der Benutzer Typ zum Prozess Typ.
| |
| * Der Prozess läuft dann mit den entsprechenden Rechten unter seinem Prozess Typ.
| |
| * Diese Command Injection Schwachstelle lässt sich mit SELinux beheben
| |
| * Damit der Ping aber weiterhin funktioniert, muss noch ein Richtlinienmodul geladen werden, der speziell für Apache2 das Pingen erlaubt
| |
| * '''setenforce 0'''
| |
| * Normal auf der Weboberfläche pingen (Keine Reverse Shell aufbauen!)
| |
| * Nun kann man die Verstöße in ein ladbares Modul umwandeln, welches speziell nur die Rechte vergibt, um Ping zuzulassen
| |
| * '''ausearch -m AVC -ts recent | audit2allow -M apache2-ping'''
| |
| * '''semodule -i apache2-ping.pp'''
| |
| * '''setenforce 1'''
| |
| * Nun sollte das Öffnen eines Portes durch Command Injection durch SELinux verhindert werden
| |
| * Die Verstöße kann man sich nochmal mit ausearch anzeigen lassen
| |
| * !!Achtung!! Andere Kommandos könnten jedoch immernoch ausgeführt werden, z.B. 1.1.1.1 ; ls zeigt uns den Inhalt des Ordners /var/www/html
| |
|
| |
|
| = HIDS = | | = HIDS = |
| | | *[[HIDS - Linux - Security und Firewall Labor]] |
| {{#drawio:linux-sec-fire-05}}
| |
| | |
| == [[Aide Konfiguration|AIDE]] ==
| |
| *[[Aide Linux - Security und Firewall Labor]] | |
| | |
| == [[Tripwire]] ==
| |
| *[[Tripwire Linux - Security und Firewall Labor]]
| |
|
| |
|
| = [[Was ist GSM|Greenbone]] Security/Vulnerability Manager (''Hacking & Security'' Seite 161) = | | = [[Was ist GSM|Greenbone]] Security/Vulnerability Manager (''Hacking & Security'' Seite 161) = |
| | | *[[GSM Linux - Security und Firewall Labor]] |
| * Kali Vorlage auf den realen Host ziehen | |
| * Neue Maschine hinzufügen mit Netzwerkbrücke
| |
| * Benutzer/Passwort: kali/kali
| |
| * '''sudo -i'''
| |
| * '''apt update'''
| |
| * '''apt install gvm'''
| |
| * GVM initialisieren und das Passwort merken, aufschreiben oder in eine Datei speichern
| |
| * '''gvm-setup'''
| |
| * '''gvm-check-setup'''
| |
| * Die Initialisierung der Datenbank kann einige Stunden dauern
| |
| * Die Datenbank kann auch manuell geupdatet werden
| |
| * '''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>'' '''
| |
|
| |
|
| = Portscanning = | | = Portscanning = |
| Zeile 693: |
Zeile 90: |
|
| |
|
| = IP bei zuvielen Anfragen sperren = | | = IP bei zuvielen Anfragen sperren = |
| | | *[[nftables 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
| |
| }
| |
| ...
| |
| }
| |