Security: Firewall konfigurieren

Gerade beim Thema IOT (Internet Of Things) sollte Sicherheit an vorderster Stelle stehen. Dazu gehört, alles was nicht gebraucht wird abzuschalten und alles was gebraucht wird, entsprechend abzusichern. In jedem Fall gehört eine Firewall dazu.

Der Kernel des auf dem IOT2040 installierten Linux hat bereits eine integrierte Firewall. Diese Firewall kann mit Hilfe der Anwendung iptables konfiguriert werden. Iptables unterstützt vielfältige Paketmanipulationen, Paketfilterung und Network Adress Translation (NAT).

Iptables nutzt Filterketten (chains) um Netzwerkpakete zu verarbeiten. Es existieren drei Standard Filterketten INPUT (für eingehende Pakete), FORWARD (für weiterzuleitende Pakete) und OUTPUT (für Pakete die vom IOT2040 ausgehend sind). 

 

1. Um sich die aktuell aktiven Firewall Regeln anzuschauen gibt man folgendes ein:

iptables -L

In der Ausgabe sind die drei (noch leeren) Filterketten zu sehen. In dieser Konfiguration werden keine Pakete gefiltert, die Firewall ist sozusagen ausgeschaltet:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

 

2. Bevor man Firewall Regeln definiert, sollte man wissen welche Ports überhaupt auf dem IOT2040 geöffnet sind. Diese kann man sich mit folgendem Kommando anzeigen lassen:

netstat -tuln

Die Ausgabe sollte in etwa wie folgt aussehen:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1534            0.0.0.0:*               LISTEN      
udp        0      0 0.0.0.0:1534            0.0.0.0:*                          

Hier sieht man die offenen Ports 22 (genutzt von SSH) und 1534 der zum vorinstallierten TCF-Agent gehört. TCF steht für Target Communication Framework, welches dazu dient, Applikationen auf dem IOT2040 zu debuggen, profilen und patchen. Auf einem Produktivsystem ist letzteres sicher nicht erwünscht.

2a. Wer kein Remote Debugging mit Eclipse machen will, kann den TCF-Agent wie folgt stoppen:

/etc/init.d/tcf-agent stop

Und so verhindert man, das der TCF-Agent beim Systemstart automatisch gestartet wird:

update-rc.d -f tcf-agent remove

 

3. Iptables kann eingegebene Regeln unmittelbar und sofort "scharf schalten". Beim Neustart des IOT2040 sind diese Regeln jedoch verloren. Es empfiehlt sich daher, die Firewall Regeln in einer Datei abzuspeichern (der Name der Datei ist beliebig, hier wird "iptables.up.rules" benutzt):

nano /etc/iptables.up.rules

Es gibt zwei Herangehensweisen für Regeln:
Alles was nicht verboten ist, ist erlaubt ODER Alles was nicht erlaubt ist, ist verboten.

Die sicherere Variante ist Alles was nicht erlaubt ist, ist verboten. Folgende Basisregeln erlauben eingehende Verbindungen nur für SSH und den Ping Befehl, alle anderen werden verworfen. Ausgehende Verbindungen werden als sicher erachtet und sollen erlaubt sein:

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows SSH connections
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

# Allows all outbound traffic
-A OUTPUT -j ACCEPT

COMMIT

 

4. Nach dem Speichern der Regeln können diese wie folgt aktiviert werden:

iptables-restore < /etc/iptables.up.rules

Die neuen Regeln können nun erneut durch Eingabe von iptables -L angeschaut werden:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             127.0.0.0/8          reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere        

 

5. Um diese Regeln nun auch nach einem Neustart des IOT2040 zu aktivieren, ist noch ein Skript zu Erstellen, das vor dem Aktivieren der Netzwerkschnittstellen aufgerufen wird:

nano /etc/network/if-pre-up.d/iptables

Das Skript beinhaltet nur den Restore Befehl zum Aktivieren der Firewall Regeln wie schon unter Punkt 4 beschrieben:

#!/bin/sh
/usr/sbin/iptables-restore < /etc/iptables.up.rules

Damit das Skript auch ausgeführt werden kann, müssen noch die Rechte entsprechend gesetzt werden:

chmod +x /etc/network/if-pre-up.d/iptables