Linux - Security und Firewall Labor: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(18 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 =
*[[DHCP Linux - Security und Firewall Labor]]
*[[DHCP Linux - Security und Firewall Labor]]


Zeile 74: 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]]
==SFTP Server==
=SFTP Server=
*[[SFTP Server Linux - Security und Firewall Labor]]
*[[SFTP Server Linux - Security und Firewall Labor]]


=Strongswan IPSEC=
=Strongswan IPSEC=
*[[Strongswan IPSEC Linux - Security und Firewall Labor]]
*[[Strongswan IPSEC Linux - Security und Firewall Labor]]
 
=Wireguard=
 
*[[Wireguard Server for Roadwarrior]]
== 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 222: 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 277: 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
    }
    ...
}

Aktuelle Version vom 13. April 2025, 14:17 Uhr

Ziel

physischer Netzwerkplan

linux-sec-fire-00.0

logischer Netzwerkplan

linux-sec-fire-00
linux-sec-fire-00.1

VM Vorlage

Hostzugriff absichern

Remotezugriff mit SSH

Router Firewall

Firewall

DHCP

Switch

DNS für das Labor einrichten

SFTP Server

Strongswan IPSEC

Wireguard

OpenVPN

Crowdsec

Fail2ban für SSH/SFTP einrichten

Proxies

SOCKS Proxy

Squid als Standard Proxy

  • Ein einfacher Proxy soll eingerichtet werden
  • Über die Source-IP wird kontrolliert, ob ein Client den Proxy benutzen darf
  • Weitere ACLs können den Zugriff auf bestimmte Webseiten blockieren

Transparenter Proxy

  • Clients im LAN sollen nicht die Möglichkeit haben den Proxy zu umgehen, indem sie den Eintrag aus dem Browser entfernen
  • Über Firewall-Regeln können die Webanfragen auf den Proxy geleitet werden

Virenscanning mit ClamAV in Squid

  • Durch Installieren von Stammzertifikaten auf den Browsern der Clients, soll Squid die Möglichkeit haben die Inhalte der Webseiten zu scannen
  • Der Proxy kann so dann verhindern, dass Clients sich Viren herunterladen

Suricata

Mandatory Access Control

Apparmor

SELinux

HIDS

Greenbone Security/Vulnerability Manager (Hacking & Security Seite 161)

Portscanning

  • Die Effektivität der Firewall soll mit nmap getestet werden
  • Für einen Vergleich scannen wir einmal mit Default-Policy accept und einmal mit drop

IP bei zuvielen Anfragen sperren