Raspberry Pi hardening

In diesem dritten Beitrag geht es um das Hardening eines RPi, der als Router mit DNS und DHCP arbeitet.
Im ersten Beitrag zum RPi ging es um die RPi Installation eines Raspberry Pi – ohne angeschlossen Monitor und ohne Tastatur (headless) sowie ein paar erste Konfigurationen.
Im zweiten Beitrag RPi als Router wurde beschrieben, wie man diesen RPi zu einem Router mit DNS und DHCP Service konfiguriert.

Dieser Beitrag bezieht sich den in den oben beschrieben RPi als Router mit DNS und DHCP.

Beim „Härten“ eines Raspberry Pi geht es mir um fogende Punkte – die Liste eherbt natürlich keinen Anspruch auf Vollständigkeit:

  1. Hinzufügen eines neuen Users und Entfernen des Default Users pi
  2. Anmelden am RPi nur via SSH-Key
  3. Entfernen aller Passworte – sofern noch vorhanden
  4. System zur Benachrichtigung
    1. rsyslogd
    2. mail
  5. Deaktivieren aller nicht benötigter Dienste
  6. SpezielleKonfigurationshinweise zu den genutzten Diensten
    1. ssh
  7. zusätzliche Einstellungen / Limits
  8. Setzen von Kernel Parameter zum Schützen des RPi via Netzwerk
  9. Abschotten des Routers gegenüber Zugriffe aus dem Internet mit Hilfe einer Firewall
  10. Einführen eines Network Intrusion Detection System (NIDS)

 

1. Hinzufügen eines neuen Users und Entfernen des Default Users pi

Dieses Thema wurde schon im Beitrag RPi Installation beschrieben.

 

2. Anmelden am RPi nur via SSH-Key

Auch dieses Thema wurde schon im Beitrag RPI Installation beschrieben.

 

3. Entfernen aller Passworte – sofern noch vorhanden

Folgendes Kommando zeigt alle User mit gesetztem Passwort:

1
sudo cat /etc/shadow | awk -F: '{if(length($2)>1) {print $1}}'

Und dieses Kommando entfernt dann z.B. für den User „pi“ das Passwort:

1
sudo passwd -d pi

 

4. System zur Benachrichtigung

4.1 rsyslog

alle Meldungen des Syllogismus Daemon an einen Remote Syslog Host senden

 

4.2 mail

mit Hilfe von syslog und dem damit verbundenen Installation von exim alle wichtigen Informationen sich per Mail zusenden

 

5. Deaktivieren aller nicht benötigter Dienste

Zuerst alle Dienst in der /etc/inittab entfernen, die nicht gebraucht werden. Dazu die folgenden Zeilen finden und mit einem „#“ auskommentieren:

1
2
3
4
5
6
7
1:2345:respawn:/sbin/getty --noclear 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Durch das folgende Kommando wird die neue Konfiguration eingelesen:

1
sudo init q

Hiernach zuerst ein paar Services stoppen

1
2
3
4
5
6
sudo service triggerhappy stop
sudo service dbus stop
sudo killall console-kit-daemon
sudo killall polkitd
sudo killall dbus-daemon
sudo killall dbus-launch

Und dann die nicht benötigten Pakete entfernen:

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt-get purge nfs-common smbclient libsmbclient triggerhappy dbus       \
          cups-common cups-client cups-bsd desktop-base desktop-file-utils   \
          dillo wpagui wpasupplicant wireless-tools usbmuxd                  \
          supercollider-server supercollider-common supercollider            \
          omxplayer netsurf-common netsurf-gtk rpcbind                       \
          netcat-openbsd netcat-traditional ghostscript esound-common        \
          pistore pcmanfm penguinspuzzle samba-common fakeroot dconf-service \
          jackd2 libavahi-client3 libpulse0 libwbclient0 libbluetooth3       \
          xfonts-cyrillic alsa-base alsa-utils
sudo apt-get autoremove
sudo apt-get update
sudo apt-get upgrade

 

6. Spezielle Konfigurationshinweise zu den genutzten Diensten

6.1. ssh

Um den SSH Daemon zu härten, sind die Parameter bereits im Beitrag RPI Installation entsprechend gesetzt, so dass u.a. keine Passwort-Authentifizierung mehr möglich ist.

 

7. zusätzliche Einstellungen / Limits

Durch das Hinzufügen der ersten Zeile wird verhindert, dass ein User außer root mehr als 1024 Prozesse haben kann. Die zweite Zeile verhindert das Erstellen von CORE-Dumps.

File: /etc/security/limits.conf

1
2
*       hard             nproc        1024
*       hard             core            0

Und dann der Datei /etc/sysctl.conf noch folgende Zeile hinzufügen:

File: /etc/sysctl.conf

1
fs.suid_dumpable = 0

und das Kommando ausführen, damit die Zeile wirksam wird:

1
sysctl -p

8. Setzen von Kernel Parameter zum Schützen des RPi via Netzwerk

Um alle Kernel Parameter zu setzen, die das Netzwerk schützen resp. für den RPi als Router notwendig sind, wurden diese im Beitrag RPI Installation im Abschnitt 6. aufgeführt.

 

9. Abschotten des Routers gegenüber Zugriffe aus dem Internet mit Hilfe einer Firewall

Das Setzen der Firewall (in diesem Abschnitt) wie auch die Konfiguration des NDIS im nächsten Abschnitt bieten die meisten Freiräume. Daher kann dies nur eine erster Versuch sein. Diese vorgestellten Konfigurationen können und müssen auf die entsprechenden Bedürfnisse angepasst werden.

Weiterführende Beispiele finden sich unter anderem bei Cipherdyne Firewalls, Simple stateful firewall, DDos for iptables und RPi Firewall …. um nur einige zu nennen.

File: /etc/iptables.firewall.rules

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
*filter
 
#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT
 
#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
 
#  Allow SSH connections
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
 
#  Allow ping
-A INPUT -p icmp -j ACCEPT
 
#  Drop NetBIOS Activities
-A INPUT -p udp --dport 137 -j DROP
-A INPUT -p udp --dport 138 -j DROP
 
#  Drop BootP
-A INPUT -p udp --dport 67 -j DROP
-A INPUT -p udp --dport 68 -j DROP
 
#  Drop DropBOX
-A INPUT -p udp --dport 17500 -j DROP
 
 
#  Drop MultiCast (FritzBox)
#  this rule must the last one before logging and dropping all
-A INPUT -s 192.172.10.1 -d 224.0.0.0/8 -j DROP
 
#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
 
#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP
 
COMMIT

Durch folgendes Kommando werden die Regeln eingelesen und aktiviert:

1
sudo iptables-restore > /etc/iptables.firewall.rules

Es empfiehlt sich vorher folgendes Kommando abzusetzen, damit im Falle eines Fehler der RPi zur angegebenen Zeit bootet (für dd:mm ist eine Uhrzeit anzugeben):

1
sudo nohup shutdown -r dd:mm &

Wenn aber alle Tests erfolgreich waren, kann man den Reboot mit Hilfe des folgenden Kommandos abbrechen:

1
sudo shutdown -c

Sind dann alle Tests erfolgreich gewesen, bleibt nur noch, die Regeln bootfest zu machen. Dazu ist eine kleine Datei zu erstellen, die die angelegte beim Booten einliest:
File: /etc/network/if-pre-up.d/firewall

1
2
#!/bin/sh
/sbin/iptables-restore > /etc/iptables.firewall.rules

Und dann die Ausführungsrechte setzen und das ganze testen:

1
2
sudo chmod +x /etc/network/if-pre-up.d/firewall
sudo reboot

 

10. Einführen eines Network Intrusion Detection System (NIDS)

Wenn man sicht entscheidet einen NDIS zu installieren, empehle ich unter anderem den Artikel zu diesem Thema RPi Firewall zu lesen. Hier wird ein konkretes Beispiel dargestellt, dass sich jeder seinen Bedürfnissen anpassen kann.

 

Kommentar verfassen