Opencloud auf dem Raspberry Teil 3

Alle guten Dinge sind drei, deshalb hier der dritte Artikel über die Einrichtung meiner Opencloud-Instanz auf einem Raspberry. Bis zu diesem Zeitpunkt läuft der Dienst mit allen benötigten Containern. Die Festplatte ist eingebunden und kann genutzt werden. Aber was passiert, wenn der Rechner neue gestartet wird? Genau, der Dienst startet noch nicht automatisch. Um den Dienst, mit allen benötigten Container bei jedem Start zu aktivieren und beim Herunterfahren zu deaktivieren, habe ich ein kleines Systemd-Skript geschrieben. Das Skript /etc/systemd/system/owncloud.service

[Unit]
Description=Firewall
After=network.target

[Service]
Type=oneshot
ExecStart=/home/stka/opencloud-start.bash
RemainAfterExit=true
ExecStop=/home/stka/opencloud-stop.bash
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Beim Start wird das skript /home/stka/opencloud-start.bash ausgeführt:

#!/bin/bash
OC_PATH=/opt/opencloud/deployments/examples/opencloud_full
OC_CMD=’docker compose up -d‘
cd $OC_PATH
$OC_CMD

Und beim Stoppen des Dienstes das Skript /home/stka/opencloud-stop.bash:

#!/bin/bash
OC_PATH=/opt/opencloud/deployments/examples/opencloud_full
OC_CMD=’docker compose down‘
cd $OC_PATH
$OC_CMD

Damit ist die Einrichtung von Opencloud soweit abgeschlossen.

Jetzt fehlt dann nur noch eine Erweiterung der Firewall. Leider konnte ich in den Containern nicht so ohne weiteres ermitteln, wo denn die iptables-Regeln abgelegt sind. Aus dem Grund habe ich ein Skript geschrieben, dass die bestehenden Regeln erweitert. Wichtig war es mir, dass ein Angriff auf den ssh-Port dazu führt, dass die IP-Adresse des Angreifers gesperrt wird und das Portscanns erkannt und geblockt werden. Hier das Skript:

# Verwerfe SYN-Pakete
$IPT -A INPUT -p tcp ! –syn -m state –state NEW -j DROP
$IPT -I INPUT -m conntrack –ctstate NEW -p tcp ! –syn -j DROP

# Verwerfe fragmentierte Pakete
$IPT -A INPUT -f -j DROP

# Verwerfe XMAS-Pakete
$IPT -A INPUT -p tcp –tcp-flags ALL ALL -j DROP

# Verwerfe alle NULL-Pakete
$IPT -A INPUT -p tcp –tcp-flags ALL NONE -j DROP

# Verwerfe Spoof-Pakete
for SPOOF in 224.0.0.0/4 240.0.0.0/5 240.0.0.0/5 0.0.0.0/8 239.255.255.0/24 255.255.255.255; do
$IPT -A INPUT -d ${SPOOF} -j DROP
done
for SPOOF in 10.0.0.0/8 169.254.0.0/16 172.16.0.0/12 127.0.0.0/8 192.168.0.0/24 224.0.0.0/4 240.0.0.0/5 0.0.0.0/8 ; do
$IPT -A INPUT -s ${SPOOF} -j DROP
done

# Einfacher Schutz vor Spoofing
$IPT -I INPUT -m conntrack –ctstate NEW,INVALID -p tcp –tcp-flags SYN,ACK SYN,ACK -j REJECT –reject-with tcp-reset

# Einfacher DDoS-Schutz
$IPT -A INPUT -p tcp -m tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT

# Verwerfe alle ungültigen Pakete
$IPT -A INPUT -m state –state INVALID -j DROP
$IPT -A FORWARD -m state –state INVALID -j DROP
$IPT -A OUTPUT -m state –state INVALID -j DROP

# Einfacher Schutz vor Port-Scannern
# Angreifende IP wird für 24 Stunden gesperrt
# (3600 x 24 = 86400 Sekunden)
$IPT -A INPUT -m recent –name portscan –rcheck –seconds 86400 -j DROP
$IPT -A FORWARD -m recent –name portscan –rcheck –seconds 86400 -j DROP

# Freigeben der IP nach 24 Stunden
$IPT -A INPUT -m recent –name portscan –remove
$IPT -A FORWARD -m recent –name portscan –remove

# Erlaube ICMP
$IPT -A INPUT -p icmp –icmp-type 3 -j ACCEPT
$IPT -A INPUT -p icmp –icmp-type 8 -j ACCEPT
$IPT -A INPUT -p icmp –icmp-type 8 -j LOG –log-level debug –log-prefix „PING IP_TABLES:“
$IPT -A INPUT -p icmp –icmp-type 11 -j ACCEPT
$IPT -A INPUT -p icmp –icmp-type 12 -j ACCEPT

# Schutz vor Brute-Force-SSH-Angriffen
$IPT -A INPUT -p tcp -m tcp –dport 22 -m state –state NEW -m recent –set –name SSH –rsource
$IPT -A INPUT -p tcp -m tcp –dport 22 -m recent –rcheck –seconds 30 –hitcount 4 –rttl –name SSH –rsource -j REJECT –reject-with tcp-reset
$IPT -A INPUT -p tcp -m tcp –dport 22 -m recent –rcheck –seconds 30 –hitcount 3 –rttl –name SSH –rsource -j LOG –log-prefix „SSH brute force “
$IPT -A INPUT -p tcp -m tcp –dport 22 -m recent –update –seconds 30 –hitcount 3 –rttl –name SSH –rsource -j REJECT –reject-with tcp-reset
$IPT -A INPUT -p tcp -m tcp –dport 22 -m state –state NEW -m recent –update –seconds 600 –hitcount 3 –rttl –name SSH -j DROP

# Schutz vor Brute-Force-SSH-Angriffen auf port 2222
$IPT -A INPUT -p tcp -m tcp –dport 2222 -m state –state NEW -m recent –set –name SSH –rsource
$IPT -A INPUT -p tcp -m tcp –dport 2222 -m recent –rcheck –seconds 30 –hitcount 4 –rttl –name SSH –rsource -j REJECT –reject-with tcp-reset
$IPT -A INPUT -p tcp -m tcp –dport 2222 -m recent –rcheck –seconds 30 –hitcount 3 –rttl –name SSH –rsource -j LOG –log-prefix „SSH brute force “
$IPT -A INPUT -p tcp -m tcp –dport 2222 -m recent –update –seconds 30 –hitcount 3 –rttl –name SSH –rsource -j REJECT –reject-with tcp-reset
$IPT -A INPUT -p tcp -m tcp –dport 2222 -m state –state NEW -m recent –update –seconds 600 –hitcount 3 –rttl –name SSH -j DROP

# Erlaube SSH
$IPT -A INPUT -p tcp -m tcp –dport 2222 -j ACCEPT

# Erlaube Ping
$IPT -A OUTPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT

# Erlaube https
$IPT -A INPUT -p tcp -m tcp –dport 443 -j ACCEPT

Auch für die Erweiterung der Firewall habe ich ein passendes Systemd-Skript geschrieben:

[Unit]
Description=Firewall
After=network.target
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/home/stka/firewall-start.bash
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Ein Brut-Force Angriff erscheint jetzt mit der folgenden Meldung im Log:

SSH brute force IN=wlan0 OUT= MAC=d8:3a:dd:24:da:8d:d0:6e:de:c3:ec:30:08:00 SRC=45.135.232.177 DST=192.168.1.1 LEN=52 TOS=0x00 PREC=0x00 TTL=53 ID=37812 DF PROTO=TCP SPT=53954 DPT=2222 WINDOW=42340 RES=0x00 SYN URGP=0

Die IP-Adresse wird dann gesperrt. Aber keine Angst, da kommen gleich die nächsten.
Gerne hätte ich noch mit xtables-addons-common eine Erweiterung für iptables geladen, die auf Grund von Listen ganze Länder blockiert, aber leider bekomme ich das benötigte Kernelmodul auf meinem Raspberry nicht zum Laufen. Aber der Anfang ist gemacht.

Alle Skripte können hier runtergeladen werden.

This entry was posted in Allgemein. Bookmark the permalink.