Systemhärtung
Das Härten gliedert sich in grob 2 Schritte:
- Deaktivieren nicht benötigter Dienste
- Beschränken der verbleibenden Dienste soweit nötig
Feststellen offener Ports
Als erstes sollte überprüft werden, welche Dienste überhaupt laufen und auf welche grundsätzlich verzichtet werden kann. Mit dem Kommando
netstat -lpn |less
(als root absetzen). Damit bekommt man eine Liste der einzelnen offenen Ports und dessen zugehöriges Programm. Hier muß nun entschieden werden, was nicht mehr benötigt wird. Grundsätzlich wird außer einem eventuell laufenden named nichts benötigt, wenn nur lokal gearbeitet wird.
Wenn man nicht weiß, was es ist, mach's dicht.
Deaktivieren
Es gibt zwei Arten von Programmen aus netzwerktechnischer Sicht:
- Standalone (squid, sendmail, ssh, etc.)
- Inetd (telnet, ftp, etc.)
Standalone-Programme werden für den nächsten Neustart in /etc/rc2.d deaktiviert durch Löschen der entsprechenden Links. Sofort beendet werden die Programme durch ein
/etc/init.d/prog stop
Prog steht für den Namen des Programmes, bitte in /etc/init.d nachsehen, was es dort genau gibt. Inetd Programme werden in der /etc/inetd.conf auskommentiert, bzw. in der entsprechenden Konfigurationsdatei in /etc/xinetd.d/ auf disabled=yes
gesetzt.
Hernach muß mit
/etc/init.d/*inetd reload
dem inetd gesagt werden, daß er seine Konfiguration neu einlesen soll. Damit sind dann nicht mehr benötigte Programme deaktiviert.
Beschränken
Über die Konfiguration
Programme wie squid, samba oder named können über entsprechende Statements in deren Konfigurationsdatei dazu gebracht werden, sich nur an bestimmte IP Adressen zu klemmen. So kann man z. B. den named nur an localhost (127.0.0.1) und an die IP Adresse der internen Ethernetkarte klemmen. Dieser Dienst ist dann von außen nicht mehr erreichbar. Wohl kommen Antworten auf Anfragen von diesen Dienst wieder an ihn zurück. Wie das genau geht, ist vom Dienst abhängig und kann in der zugehörigen Doku nachgelesen werden.
Inetd/TCP Wrappers
Alle Inetd-Programme und manche Standalone Programme können über einen Eintrag in der /etc/hosts.allow auf einen IP Adreßbereich beschränkt werden, von dem aus zugegriffen werden darf. Zum Beispiel das interne 192.168er Netz. Beispiele stehen in der /etc/hosts.allow. Der Programmname muß entweder 1:1 aus der /etc/inetd.conf übernommen werden oder bei Standalones kann das auch unabhängig vom eigentlichen Programmanmen sein. Siehe zugehörige Doku.
Dichtmachen
Manche Programme lassen sich nicht so ohne weiteres beschränken. Das betrifft hauptsächlich UDP basierte Dienste wie z. B. ntpd oder snmp. Als zusätzliche Sicherheit können auch bereits wie oben restriktierte Programme noch zusätzlich per Firewallregel zugriffsbeschränkt werden. Siehe Doku zu iptables.
Ein Sonderfall sind die RPC-Programme, wie NFS- und NIS-Server und dergleichen. Deren Port kann sich bei jedem Neustart theoretisch ändern. Von daher wäre es wünschenswert, wenn diese Ports mit diesem kleinen Shellsnippet nach dem Hochstarten der Kiste dicht gemacht werden könnten, da RPC generell immer wieder ausnutzbare Fehler beinhaltet. Das Interface sollte man halt auch von ppp0 auf ippp0 oder sowas ändern, wenn das notwendig wäre.
rpcinfo -p localhost |grep -v "program.*vers.*proto.*port" \ |awk '{print $3"\t"$4}' |while read PROTO PORT; do iptables -t filter -A INPUT -p $PROTO -s 0/0 --destination-port $PORT -d 0/0 -i ppp0 -j DROP done
Sollten noch Fragen offen sein oder jemand Tippfehler entdeckt haben → mail an mich.