Sicherheit von Linux-Systemen Konfiguration von SuSE Linux Professional 9.3 Christian Mück-Lichtenfeld Organisch-Chemisches Institut July 11, 2005
Überblick Ziele: Gefahren erkennen System sicher konfigurieren Angriffe erkennen (bzw. verhindern) Zielgruppe: Linux-Einsteiger, Admins mit Linux als Ausnahmefall Beispiel: SuSE Professional 9.3 keine Themen: WLAN, Authentifizierung, Samba
Part I Bedrohungen
Bedrohungsanalyse Potentielle Angriffswege Lokaler Angriff Angemeldeter Benutzer nutzt Schwachstellen aus und führt unerwünschte Aktivitäten aus Ziel: (root-) Privilegien erlangen, die einem normalen Benutzer nicht zustehen DOS-Angriff (denial of service) Verteilte gehäufte Abfrage von Diensten führt zu Überlastung des Rechners Netzattacken Angriff über einen unsicheren Netz-Zugang zum System auf einen Dienst, der nicht laufen müsste oder der Sicherheitslücken hat. spoofing ( man-in-the-middle ) Angreifer gibt vor, ein (autorisiertes) System im Netz zu sein z.b. arp-spoofing, SSH-Angriff In allen Fällen werden Sicherheitslücken ausgenutzt ( exploits)
Bedrohungsanalyse Angriffswege Viele Wege führen zum Ziel des Hackers (Privilegierte Bereiche/Programme) SPOOFING (MAN IN THE MIDDLE) KERNELSPACE PRIV Service Port root USERSPACE Application LOKALER ANGRIFF DOS NETZANGRIFF
Bedrohungsanalyse Angriffsszenarien Spionage (Passwörter, Daten allgemein) Missbrauch des Rechners (Filesharing, Spam-Mailer, Angriff auf weitere Rechner) Zerstörung von Daten
Part II
Sicherheitslücken kennen Mailinglisten suse-security-announce-subscribe@suse.com Advisories (zur Sicherheit) bei www.linux-community.de Literatur z.b. Linux-Magazin (www.linux-magazin.de) linux hacker s guide (Markt & Technik) Linux Security Cookbook (O Reilly) Eigenen Rechner überprüfen verdächtige Prozesse, Dateien, Ports
Logfiles analysieren Überwachung der Logfiles syslogd erzeugt Ausgabe in /var/log/messages Befehl z.b. grep -i connect /var/log/messages Jun 16 16:17:44 nwztux portmap[22117]: connect from 128.176.245.69 to getport(mountd): request from unauthorized host Jun 16 16:17:44 nwztux portmap[22118]: connect from 128.176.245.69 to getport(mountd): request from unauthorized host Jun 16 16:18:23 nwztux sshd[22119]: refused connect from ::ffff:128.176.245.69 (::ffff:128.176.245.69) Jun 18 02:13:33 nwztux sshd[25380]: refused connect from ::ffff:60.28.0.162 (::ffff:60.28.0.162) Jun 18 03:09:41 nwztux sshd[25459]: refused connect from ::ffff:221.251.21.162 (::ffff:221.251.21.162) Jun 18 18:54:07 nwztux sshd[26780]: refused connect from ::ffff:65.166.159.14 (::ffff:65.166.159.14) Jun 18 23:10:25 nwztux sshd[27099]: refused connect from ::ffff:200.68.112.137 (::ffff:200.68.112.137) Jun 18 23:18:59 nwztux sshd[27119]: refused connect from ::ffff:200.68.112.137 (::ffff:200.68.112.137) Jun 19 11:42:58 nwztux sshd[28326]: refused connect from ::ffff:211.202.3.150 (::ffff:211.202.3.150) Jun 20 20:25:47 nwztux sshd[31388]: refused connect from ::ffff:211.202.3.150 (::ffff:211.202.3.150) Tools zur Logfile-Überwachung: Analog (http://www.analog.cx/) Swatch (http://swatch.sourceforge.net/) LogSurfer
Prozesse überwachen Überwachung der Prozesse Befehl ps -ef grep Username zeigt die Prozesse des Users an iltis:~ # ps -ef grep nobody nobody 7189 1 0 08:25? 00:00:00 /sbin/portmap nobody 7198 1 0 08:25? 00:00:00 /usr/sbin/mdnsd -f /etc/rendezvous.conf -b root 12610 8377 0 10:38 pts/7 00:00:00 grep nobody Befehl strace -p PID verfolgt die Systemaufrufe des Prozesses Analyse der Aktivität eines verdächtigen Prozesses iltis:~ # strace -p 7198 Process 7198 attached - interrupt to quit select(7, [3 4 5 6], NULL, NULL, 1, 446000) = 0 (Timeout) rt sigprocmask(sig BLOCK, [HUP INT USR1 PIPE TERM], NULL, 8) = 0 rt sigprocmask(sig UNBLOCK, [HUP INT USR1 PIPE TERM], NULL, 8) = 0 gettimeofday({1119429587, 826316}, NULL) = 0 gettimeofday({1119429587, 826367}, NULL) = 0 gettimeofday({1119429587, 826410}, NULL) = 0 gettimeofday({1119429587, 826453}, NULL) = 0 gettimeofday({1119429587, 826496}, NULL) = 0 select(7, [3 4 5 6], NULL, NULL, 5, 0) = 0 (Timeout)
Netzwerkverbindungen überwachen Überwachung der Netzverbindungen des lokalen Rechners Befehl z.b. lsof -i -n -P iltis:/usr/sbin lsof -i -n -P COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME dhcpcd 6625 root 4u IPv4 18524 UDP *:68 portmap 7210 nobody 3u IPv4 19793 UDP *:111 portmap 7210 nobody 4u IPv4 19806 TCP *:111 (LISTEN) mysqld-ma 7430 mysql 3u IPv4 21059 TCP *:3306 (LISTEN) master 7561 root 11u IPv4 21266 TCP 127.0.0.1:25 (LISTEN) master 7561 root 12u IPv6 21267 TCP [::1]:25 (LISTEN) sshd 7746 root 3u IPv6 22081 TCP *:22 (LISTEN) ssh 8226 meier 3u IPv4 23577 TCP 127.0.0.1:12051->127.0.0.1:22 (ESTABLISHED) sshd 8230 root 3u IPv6 23578 TCP 127.0.0.1:22->127.0.0.1:12051 (ESTABLISHED) sshd 8230 root 6u IPv4 23632 TCP 127.0.0.1:6010 (LISTEN) sshd 8230 root 7u IPv6 23633 TCP [::1]:6010 (LISTEN) sshd 8230 root 11u IPv4 69274 TCP 127.0.0.1:6010->127.0.0.1:11316 (ESTABLISHED) cupsd 10373 lp 0u IPv4 28016 TCP *:631 (LISTEN) cupsd 10373 lp 2u IPv4 28017 UDP *:631 fwbuilder 18895 root 3u IPv4 69273 TCP 127.0.0.1:11316->127.0.0.1:6010 (ESTABLISHED) firefox-b 19302 meier 26u IPv4 70013 TCP 128.176.245.32:26706->128.176.188.115:80 (ESTABLISHED) oder netstat -t (TCP) (-u (UDP)) iltis:~ # netstat -t Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 ILTIS.UNI-MUENSTER:9097 DOEDEL.UNI-MUENSTER:ssh ESTABLISHED tcp 0 0 localhost:21838 localhost:ssh ESTABLISHED tcp 0 0 localhost:44216 localhost:filenet-tms ESTABLISHED tcp 0 0 localhost:filenet-tms localhost:44216 ESTABLISHED tcp 0 0 localhost:ssh localhost:21838 ESTABLISHED tcp 0 0 ILTIS.UNI-MUENSTER.:ssh MRBEAN.UNI-MUENST:33521 ESTABLISHED
Dateisystem überwachen Überwachung des Dateisystems (Intrusion detection) z.b. tripwire (http://sourceforge.net/projects/tripwire/) erzeugt Fingerabdrücke der wichtigen Systemdateien speichert die Daten in einer Datenbank findet Abweichungen vom gespeicherten Snapshot Dateisystemüberwachung simpel: rpm-datenbank iltis:/usr/sbin # rpm -V samba-3.0.13-1.1 S.5...T /usr/sbin/smbd iltis:/usr/sbin # Überprüfung / Suche nach rootkits: chkrootkit (http://www.chkrootkit.org/) (z.zt. 57 rootkits/würmer) Stinger von McAffee
Useraktivitäten beobachten Überwachung der Useraktivität Befehl lastlog iltis:~ # lastlog Username Port From Latest root pts/7 localhost Wed Jun 22 09:00:45 +0200 2005 bin **Never logged in** daemon **Never logged in** lp **Never logged in** mail **Never logged in** news **Never logged in** uucp **Never logged in** games **Never logged in** man **Never logged in** at **Never logged in** wwwrun pts/8 iltis.uni-muenst Wed Jun 22 09:01:10 +0200 2005 ftp **Never logged in** named **Never logged in** postfix **Never logged in** mysql **Never logged in** sshd **Never logged in** ntp **Never logged in** messagebus **Never logged in** haldaemon **Never logged in** gsc **Never logged in** meier :0 console Wed Jun 22 08:35:46 +0200 2005
Abwehr eines lokalen Angriffs Abwehr eines lokalen Angriffs nur vertrauenswürdige Benutzer zulassen keine anonymen Accounts Server nicht physikalisch öffentlich zugänglich machen Server nicht für normale User zum Login öffnen keine Root-Shells offenlassen z.b. in der bash mit export TMOUT=180 logout nach 3 Minuten Inaktivität regelmässige Systemupdates durchführen sichere Grundeinstellungen (yast2)
SuSE Grundeinstellungen zur Sicherheit Yast2 Sicherheit Local Security Configuration yast2 security
SuSE Grundeinstellungen zur Sicherheit Yast2 Sicherheit Passwort-Einstellungen
SuSE Grundeinstellungen zur Sicherheit Yast2 Sicherheit Reboot durch User verhindern Rechner sollte auch physikalisch unzugänglich sein!
SuSE Grundeinstellungen zur Sicherheit Yast2 Sicherheit Login Einstellungen Delay verhindert Passwort-Rateversuche
SuSE Grundeinstellungen zur Sicherheit Yast2 Sicherheit User ID und Group ID
SuSE Grundeinstellungen zur Sicherheit Yast2 Sicherheit Dateirechte und Pfade
Systemupdates Manueller Systemupdate Start des manuellen Systemupdates (YOU = Yast Online Update) yast2 online update, Auswahl des Servers
Systemupdates Manueller Systemupdate Auswahl der Patches (Sicherheitsrelevant: rot)
Systemupdates Manueller Systemupdate Installation
Systemupdates Automatischer Systemupdate Konfiguration des Updatezeitpunktes:
Konfiguration von Netzwerkdiensten Netzwerkdienste kontrollieren normalerweise muss für jeden Dienst ein Dämon laufen. z.b. httpd als Webserver, in.ftpd als ftp-server inetd (Internet-Dämon) kontrolliert, welches Programm (Dämon) gestartet wird, wenn bestimmer Dienst angefordert wird heute: xinetd hat den inetd abgelöst Konfiguration: /etc/xinet.d/ xinetd ist mit libwrap (TCP-Wrapper) Support compiliert Konfiguration über die Dateien /etc/hosts.deny und /etc/hosts.allow
Konfiguration von Netzwerkdiensten Services konfigurieren (xinetd) Start mit yast2 inetd
Konfiguration von Netzwerkdiensten xinted Konfiguration Datei /etc/xinetd.d/service (eine Datei pro Dienst) hier: telnet # default: off # description: Telnet is the old login server which is INSECURE and should \ # therefore not be used. Use secure shell (openssh). # If you need telnetd not to "keep-alives" (e.g. if it runs over a ISDN \ # uplink), add "-n". See man telnetd for more details. service telnet { socket_type = stream protocol = tcp wait = no user = root server = /usr/sbin/in.telnetd disable = yes } was fehlt noch? Zugriffskontrolle per Rechner
Konfiguration von Netzwerkdiensten TCP-Wrapper Konfiguration Datei /etc/hosts.deny (Zugriff verweigern) # /etc/hosts.deny # See man tcpd and man 5 hosts_access as well as /etc/hosts.allow # for a detailed description. all: ALL Datei /etc/hosts.allow (Zugriff auf die definierten Services) # /etc/hosts.allow # See man tcpd and man 5 hosts_access for a detailed description # of /etc/hosts.allow and /etc/hosts.deny. # ALL: 127.0.0.1 127.0.0.2 \ 128.176.216.17 128.176.124.24 \ 128.176.233.0/255.255.255.0 sshd: 134.194.20.10 in.ftpd: 64.20.10.2
Konfiguration von Netzwerkdiensten Andere Applikationen mit TCP-Wrapper Support # package name daemon path token # ---------------------------------------------------------------------------- # ssh, openssh /usr/sbin/sshd sshd, sshd-fwd-x11, sshd-fwd-<port> # quota /usr/sbin/rpc.rquotad rquotad # tftpd /usr/sbin/in.tftpd in.tftpd # portmap /sbin/portmap portmap # The portmapper does not verify against hostnames # to prevent hangs. It only checks non-local addresses. # # (kernel nfs server) # nfs-utils /usr/sbin/rpc.mountd mountd # nfs-utils /sbin/rpc.statd statd # # (unfsd, userspace nfs server) # nfs-server /usr/sbin/rpc.mountd rpc.mountd # nfs-server /usr/sbin/rpc.ugidd rpc.ugidd # # (printing services) # lprng /usr/sbin/lpd lpd # cups /usr/sbin/cupsd cupsd # The cupsd server daemon reports to the cups # error logs, not to the syslog(3) facility. # # (Uniterrupted Power Supply Software) # apcupsd /sbin/apcupsd apcupsd # apcupsd /sbin/apcnisd apcnisd
Konfiguration von Netzwerkdiensten Runlevel konfigurieren Start mit yast2 runlevel (Runlevel 3 und 5: mit Netzwerk)
Konfiguration von Netzwerkdiensten Runlevel konfigurieren Dienste nur im echten Bedarfsfall (Server) installieren, z.b.: apache2 (Webserver) cups (Printerqueues) mysql (Datenbank) nfsserver Postfix MTA (Mail) rsyncd (remote Backup/Replikation)
Konfiguration von Netzwerkdiensten Apache Konfiguration Datei /etc/apache2/httpd.conf (kein TCP-Wrapper support)... # forbid access to the entire filesystem by default <Directory /> Options None AllowOverride None Order deny,allow Deny from all Allow from localhost Allow from 128.176.216.147 Allow from 128.176.0.0/255.255.0.0 </Directory>...
Konfiguration von Netzwerkdiensten Konfiguration des SSH-Dienstes Zahlreiche Konfigurationsoptionen mit Hilfe der Datei /etc/ssh/sshd config: UsePAM yes: benutzt PAM- statt ssh-einstellungen PermitRootLogin no: root darf nicht! PasswordAuthentication no: verhindert getunnelte Klartextpassworte usw. usw.
Überwachung von aussen Überwachung der Ports von aussen Portscanner testet die TCP/UDP-Ports eines Rechners testet die Verfügbarkeit der Dienste eines Rechners Sollte (darf!) man nur an den eigenen Rechnern einsetzen! ist im Prinzip ein Hacker-Tool... gibt es in vielen Varianten, z.t. mit GUI (SAINT, ISS, Nessus) einfaches Kommandozeilen-Tool: nmap
Überwachung von aussen nmap Beispiel Windows-Rechner: iltis:~ # nmap billgates Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-06-21 13:15 CEST Interesting ports on BILLGATES.UNI-MUENSTER.DE (128.176.216.248): (The 1660 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 135/tcp open msrpc 139/tcp open netbios-ssn 445/tcp open microsoft-ds MAC Address: 00:0D:7D:4E:42:9A (Hewlett Packard) Nmap finished: 1 IP address (1 host up) scanned in 0.544 seconds Linux-Rechner: iltis:~ # nmap thorwald Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-06-21 13:18 CEST \ Interesting ports on THORWALD.UNI-MUENSTER.DE (128.176.216.199):\ (The 1657 ports scanned but not shown below are in state: closed)\ PORT STATE SERVICE\ 22/tcp open ssh\ 37/tcp open time\ 111/tcp open rpcbind\ 631/tcp open ipp 3052/tcp open PowerChute 6000/tcp open X11 MAC Address: 00:1f:a6:f2:dc:a4 (Micro-star International CO.) Nmap finished: 1 IP address (1 host up) scanned in 0.511 seconds
Firewall Konzept der Firewall Netz komponente, die IP-Pakete bewertet (Paketanalyse / Paketfilter) IP-Pakete oder Protokolle können blockiert werden Adressen können maskiert werden (NAT) Eine Firewall ist Bestandteil des Kernels (iptables Modul). SuSEFirewall ist ein Konfigurationstool dafür
Firewall
Firewall Konfiguration von iptables Kommandozeilenbefehl: iptables options Auszug aus einen FW-Skript:... for element in ${BANNED IP[@]} do iptables -A banned -p all -s $element -j DROP done for element in ${FULLACCESS IP[@]} do iptables -A knownhosts -p tcp -s $element -j allowed iptables -A knownhosts -p all -s $element -j ACCEPT done for element in ${INTERMEDIATE IP[@]} do iptables -A knownhosts -p all -s $element -j intermediate done... etwas komplexe Syntax Anleitung: http://iptables-tutorial.frozentux.net und Literatur (z.b. iptables kurz & gut, O Reilly)
Firewall SuSEFirewall Start mit yast2 firewall (1) Zuordnung der Interfaces (external / internal / DMZ)
Firewall SuSEFirewall (2) Auswahl der erlaubten Dienste
Firewall SuSEFirewall (3) Auswahl der erlaubten Ports
Firewall SuSEFirewall (4) Abschliessen und Anwenden
Firewall Besseres Firewallinterface SuSEFirewall: geringe Granularität (keine Def. von Netzen, Hosts) besser: Spezielle GUIs zur Konfiguration der Firewall (auch pf, PIX, ipfilter): fwbuilder http://www.fwbuilder.org Grafische Erstellung der Filterregeln Remote Administration verschiedener Firewalls (ssh) vordefinierte Dienste und IP-Ranges Gruppierung von Objekten (Hosts, Netze und Services)
Firewall DEMO fwbuilder und nmap 1 Erstellen einer Policy 2 nmap Demonstration: Schutz durch Firewall
Part III Message
Message Take-Home-Message 1 Systempflege! Jeder Rechner muss Software-Updates erleben (oft vernachlässigt: Messrechner) 2 Systemanalyse wissen, was läuft - verdächtige Aktivitäten müssen erkannt werden 3 Nur Ressourcen vergügbar machen, die benötigt werden jeder Dienst ist ein potentieller Angriffpunkt 4 Sichere Konfiguration der Dienste IP-Bereiche definieren (TCP-Wrapper) Firewall möglichst zielgenau konfigurieren 5 Benutzer-Policy Nur authentifizierte Benutzer (möglichst Domänen-Accounts) zulassen