7. Systemsicherheit und -Stabilität
In /etc/shadow sollte bei allen Accounts, die sich
nicht einloggen müssen, im Feld für das Passwort, der
Wert * eingetragen sein, also beispielsweise sshd:*:. Die
Berechtigung für /etc/shadow muss auf 600
gesetzt werden, mit owner und group «root».
# chown root:root /etc/shadow
# chmod 600 /etc/shadow
|
|
User Accounts die nicht benötigt werden entweder entfernen oder
die Login-Shell in /etc/passwd auf den Wert /bin/false
setzen. (Überprüfen, ob /etc/shells den Eintrag
/bin/false enthält.)
#/etc/passwd
rolf:x:1000:100:Owner of Linuxrouter:/home/rolf:/bin/false
|
|
Auf dem System SLACK_LNX sollten nur die folgenden Daemons aktiv
sein: crond, klogd, syslogd, sshd und init. Überprüfen mittels:
Von aussen darf nur sshd sichtbar sein, der auf Port 22 hört.
Mittels eines Portscans überprüfen.
Alle unnötigen Binaries vom Router entfernen. Hier existiert selbstverständlich
Spielraum für Kompromisse. Beispielsweise beinhaltet die vorgeschlagene Liste
Kommandos, mit denen File Permissions verändert werden können
(chmod, chown ). Im Interesse der Sicherheit sollten diese Binaries
entfernt werden − nur bootet das System dann nicht mehr richtig!
Die folgende Auswahl sorgt für einen funktionsfähige Router. Um hier
weitere Verbesserungen zu erzielen, ist eine andere Vorgehensweise nötig.
Volle Kontrolle über das System lässt sich mit vernünftigem Aufwand
nur mit Hilfe eines eigenen Minimalsystems mit selbst geschriebenen Bootscripten erzielen.
Binaries im Directory /bin
bash cp cat chmod chown cut date df dircolors dmesg dnsdomainname domainname
du echo egrep false free grep gunzip gzip head hostname ipmask kill killall
loadkeys login ls more mount netstat ping ping6 ps rm sed setterm sh sleep
stty su sync tcsh touch true umount uname
|
|
Binaries im Directory /sbin
agetty arping clock dhcpcd dumpe2fs e2fsck e2image e2label findfs fsck fsck.ext2
fsck.ext3 halt hwclock ifconfig init initscript.sample ipmaddr iptunnel isapnp
killall5 ldconfig lilo liloconfig logsave mke2fs mount
pidof poweroff rdev reboot rmt route runlevel setserial shutdown
swapon sysctl telinit tune2fs umount update
|
|
Binaries im Directory /usr/bin
bash basename clear crontab cut dircolors dumpkeys elvis elvtags env grep gunzip gzip
id last ldd less lesspipe.sh loadkeys logger lsdev lsof mcookie md5sum mesg more passwd
printenv procinfo ps pstree run-parts savelog scp setleds stty sync tail top tput
true uname uptime users vmstat w watch
|
|
Binaries im Directory /usr/sbin
chat crond ctrlaltdel dhcpd ethtool faillog icmpinfo ip6tables ip6tables-restore
ip6tables-save iptables iptables-restore iptables-save keytab-lilo.pl
klogd lastlog netdate ntpd ntpdate ntpq pwck routed sshd syslog_tst syslogd
tcpd tcpdchk tcpdmatch
|
|
Um eigene Experimente zu vereinfachen, stehen unter
Downloads
zwei Shellscripts zur Verfügung. (Die Idee ist, die benötigten
Files in temporäre Verzeichnisse zu kopieren und dann die Verzeichnisse
umzubenennen. Damit ist es möglich, den Router zwischen Ausgangs- und
Testzustand hin und her zu schalten.)
Überprüfen, bei welchen Programmen die setuid/setgid Bits
gesetzt sind:
# find /slack_lnx/ -perm +4000 -type f -exec ls -ld {} \; > setuid.txt &
# find /slack_lnx/ -perm +2000 -type f -exec ls -ld {} \; > setgid.txt &
# find /slack_lnx/ -perm +6000 -type f -exec ls -ld {} \; > setuidsetgid.txt &
|
|
Alle s-Bits mit chmod zurücksetzen:
# chmod a-s /usr/bin/program_name
|
|
Sicherstellen, dass die Routingfunktion des Kernels nur via Firewall eingeschaltet
wird. Dazu das execute-bit von rc.ip_forward deaktivieren:
chmod 644 /etc/rc.d/rc.ip_forward
|
|
Der Status des entsprechenden Kernelflags kann mit
cat /proc/sys/net/ipv4/ip_forward ausgelesen werden.
Falls root-logins via ssh zugelassen werden müssen −
beispielsweise für Wartungsarbeiten − dann sollte
die User Authentifizierung mit Hilfe von PKI erfolgen. Dazu die Datei
/etc/ssh/sshd_config wie folgt anpassen:
PasswordAuthentication no
PubkeyAuthentication yes
|
|
/tmp und /usr/local/apache/logs werden in Ram Disks
betrieben. Dazu das Script /etc/rc.d/rc.ram anlegen und beim
Booten ausführen.
#!/bin/sh
#
# Script: /etc/rc.d/rc.ram
#
# Description: Script creates and mounts ram disks
#
RAM0="/dev/ram0"
RAM1="/dev/ram0"
SIZE=4096
#
echo "Creating ram disks..."
mke2fs -m0 $RAM0 $SIZE0
mke2fs -m0 $RAM1 $SIZE0
#
mount RAM0 -t ext2 /tmp
mount RAM1 -t ext2 /usr/local/apache/logs
#
echo "/tmp mounted on ram disk"
echo "/usr/local/apached/logs mounted on ram disk"
#
|
|
/etc/rc.d/rc.ram von /etc/rc.d/rc.M ausführen lassen
(bevor der httpd-Server gestartet wird.)
# Create and mount ram disks
if [ -x /etc/rc.d/rc.ram ] ; then
/etc/rc.d/rc.ram
fi
|
|
Da die Module in den Kernel einkompiliert sind, kann der Inhalt des Verzeichnisses
/lib/modules von SLACK_LNX gelöscht werden.
Nicht benötigte Inhalte in /usr/ löschen.
# rm -rf /usr/doc/*
# rm -rf /usr/i486-slackware-linux/*
# rm -rf /usr/libexec/*
# rm -rf /usr/man/*
# rm -rf /usr/share/elvis-2.1.4/*
# rm -rf /usr/share/locale/*
|
|
Im Verzeichnis /usr/share/zoneinfo alle nicht benötigten Verzeichnisse
und Dateien löschen. (Im Beispiel wird /usr/share/zoneinfo/Europe
beibehalten.) Anschliessend den Link auf die gewünschte Zeitzonendatei neu anlegen.
# rm -rf /usr/share/zoneinfo/[!E]*
# cd /usr/share/zoneinfo
# ln -s /etc/localtime localtime
|
|
Bei einem Systemabsturz wegen Stromausfall wird unter Umständen das DHCP PID File
/etc/dhcpc/dhcpcd-ethX.pid nicht gelöscht. Wenn der Router neu
gebootet wird, funktioniert der DHCP client nicht mehr ordnungsgemäss, so dass
am externen Interface keine IP-Adresse zur Verfügung steht. Der folgende Eintrag
im Initialisierungs-Script /etc/rc.d/rc.M tested das System auf ein
störendes PID File (den Eintrag am Anfang des Files, nach der Linie
echo "Going multiuser..." ) einfügen:
# In case there is an old DHCPC PID file, clean it up.
if [ -r /etc/dhcpc/dhcpcd-eth[0-9].pid ]; then
echo "Cleaning up old DHCPC PID file."
rm -f /etc/dhcpc/dhcpcd-eth[0-9].pid
fi
|
|
Die Funktionen des Systems (serielle Konsole, SSH, HTTPD) und des Firewall Scripts
testen.
|