Thematischer Schwerpunkt dieser Ausgabe ist die kontinuierliche Überwachung von Servern, Clients und anderen Geräten im Netzwerk: mit dem IPMI-Plugin, dem ... (mehr)

OSSEC

Wer Wert auf Plattformunabhängigkeit legt, verwendet das Host-basierte IDS OSSEC. Dessen aktuelle Version findet sich auf [7], »aptitude install libprelude-dev« installiert die fürs Kompilieren notwendigen Entwicklerbibliotheken von Prelude. Nach dem Entpacken des Tarballs ins Unterverzeichnis »src« aktiviert dort »make setprelude« die Prelude-Unterstützung, »install.sh« startet die Installation. Die angebotene lokale Installation reicht für Anwender aus, die keine Anbindung von Hardware-Endgeräten oder anderen Clients planen. In der Regel sollte der Admin hier jedoch »server« wählen und den Integrity Check Daemon sowie die Rootkit Detection Engine aktivieren. Gegen Brute-Force-Attacken hilft es, durch Active Response und Firewall-Drop die attackierenden Hosts automatisch zu blockieren, je nach System via IPtables, IPchains oder IPfw (Abbildung 2).

Abbildung 2: Das Installations- und Konfigurationstool von Ossec übernimmt auch fortgeschrittene Einstellungen, zum Beispiel die Kombination mit Firewalls und Active Response.

Damit False Positives nicht zu Problemen im Netzwerk führen, hilft eine Whitelist mit IP-Adressen. Im darauf folgenden Schritt kann der Admin den Empfang von Syslog-Nachrichten aktivieren, wenn er zum Beispiel plant Hardware-Appliances per Syslog anzubinden.

Jetzt korrigiert er noch die Datei »/var/ossec/etc/ossec.conf« , damit OSSEC die Informationen an Prelude übergibt:

<ossec_config>
<global>
<email_notification>no</email_notification>
<prelude_output>yes</prelude_output>
</global>

Zu guter Letzt muss der Admin auch OSSEC in Prelude registrieren:

prelude-admin register OSSEC "idmef:wadmin:r" Listen-IP_des_Prelude-Managers-uid ossec -gid ossec

Hier muss er bei UID und GID »ossec« verwenden, da der Analysedienst unter diesem Benutzeraccount läuft. Nach der Installation startet das HIDS-System mit »/var/ossec/bin/ossec-control start« .

Bevor sich ein Agent an OSSEC anbinden lässt, muss der Admin ihn auf dem Server registrieren. Das erledigt der Befehl »/var/ossec/bin/manage_agents« mit einem tastaturgesteuerten Konsolenmenü (siehe Abbildung 3).

Abbildung 3: Das Skript manage_agents stellt ein einfaches Menü zur Verfügung, mit dem Admins die Client-Agenten auf dem Server registrieren.

Nach der Angabe des Namens gibt der Admin hier die IP-Adresse ein. Ist die dynamisch vergeben, gibt er das Klasse-C-Netzwerk an, in dem sich der Agent befindet (zum Beispiel 10.21.81.0/24). Dann wählt er eine ID für den Agenten, wobei er den Standardvorschlag für den ersten Agenten »001« ohne Weiteres beibehalten kann. Um ihn am Endgerät anzubinden, ist noch ein Authentifikationsschlüssel notwendig. Den gibt es mit »/var/ossec/bin/manage_agents -e 001« .

Um einen Windows-Client an OSSEC und Prelude anzubinden, bedarf es auf dem System der Libprelude [13]. Deren Installation ist mit wenigen Klicks beendet, wobei der Admin außer »Source Code« alle Komponenten der Software auswählt (Abbildung 4). Im Anschluss führt der Windows-Administrator den Eintrag »Manage Agent« (im Startmenü im Ordner »OSSEC« ) aus. Nach Eingabe der »OSSEC Server IP« und des Schlüssels kann der Windows-Rechner eine Verbindung mit dem IDS-System herstellen.

Abbildung 4: Bei der Installation des Windows-Agenten für OSSEC sollte der Admin alles außer dem Quellcode auswählen.

Ein Klick auf »Save« speichert die angegeben Daten, das Feintuning der Konfiguration findet sich unter »View | Config« (Abbildung 5). Nach dem nächsten Neustart stellt OSSEC die Anbindung über einen Windows-Dienst her.

Abbildung 5: Im Gegensatz zur Syslog-Anbindung überträgt der Windows-Agent seine Informationen bereits in der Default-Einstellung sicher verschlüsselt.

Für Hardware-Appliances wie Ciscos PIX-Firewalls eignet sich die Syslog-Funktionalität von OSSEC. Zwar ist sie bei der oben beschriebenen Installation aktiviert, doch standardmäßig empfängt der Server keine Syslog-Nachrichten. Vorher müssen die IP-Adressen, von denen ein Empfang dieser Nachrichten erlaubt ist, noch in der Konfigurationsdatei »/var/ossec/etc/ossec.conf« landen:

<remote>
<connection>syslog</connection>
<allowed-ips>10.21.81.4</allowed-ips>
<allowed-ips>10.21.81.9</allowed-ips>
<port>5140</port>
</remote>

In dieser Konfiguration verarbeitet OSSEC die Syslog-Nachrichten der beiden Rechner mit den Adressen 10.21.81.4 und 10.21.81.9.

Besonders hilfreich beim Aufspüren von Angreifern ist die Korrelator-Engine von Prelude [14]. Sie bietet die Möglichkeit, IDMEF-Ereignisse miteinander in Verbindung zu setzen und so einen Korrelations-Alarm zu erzeugen, der alle betreffenden Einzelalarme enthält (Abbildung 6). Die Installation des Prelude-Correlator erfolgt unter Debian mit »aptitude install prelude-correlator« , registrieren lässt sich der Agent mit:

Abbildung 6: Korrelationsalarme erfassen Angriffe auch dann, wenn der Hacker zum Beispiel versucht mehrere unterschiedliche Geräte anzugreifen, hier am Beispiel eines Portscan.
prelude-admin register prelude-correlator"idmef:rw" Listen-IP_des_Prelude-Managers-uid 0 -gid 0

Der Prelude-Correlator liefert bereits einige eigene Plugins mit, sie sind unter Debian im Ordner »/usr/share/pyshared/PreludeCorrelator/plugins/« zu finden und lassen sich über einen Eintrag in »/etc/prelude-correlator/prelude-correlator.conf« aktivieren. Die Zeilen

[BruteForcePlugin]
disable = false

aktivieren beispielsweise das Bruteforce-Plugin. Anschießend startet »/etc/init.d/prelude-correlator start« den Correlator.

Eigene Plugins

Wer selbst Plugins erstellen möchte, braucht Python-Grundkenntnisse und sollte das Kapitel 4.2 des IDMEF-RFC eingehend studieren [1]. Dieser Abschnitt des RFC behandelt die Nachrichtenklassen, die Plugin-Programmierer verwenden dürfen.

Das von dem Autor dieses Artikels extra geschriebene Beispiel-Plugin Portscangeoinfo (Listing 2) steht unter [15] zum Download. Es reagiert auf Portscans, die Snort und OSSEC erkannt haben, und macht es möglich, über einen Korrelationsalarm geografische Informationen des Angreifers auszugeben. Damit Snort die Portscans auch erkennt, muss der Portscan-Präprozessor in der »snort.conf« aktiviert sein.

Listing 2

main.py

01 # Please download http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz and place the content of the archive in /usr/share/GeoIP/ to get more detailled geographical information
02
03 # Please report bugs to rupprechter at dotlike dot net
04 # for more information please visit www.dotlike.net/portscangeoinfo.php
05
06 import os
07 import re
08 import shlex, subprocess
09 import sys
10
11 from PreludeCorrelator.context import Context
12 from PreludeCorrelator.pluginmanager import Plugin
13 from PreludeCorrelator.idmef import IDMEF
14
15 strout = None
16
17 class PortscanGeoinfoPlugin(Plugin):
18  def run(self, idmef):
19   classification = idmef.Get("alert.classification.text")
20
21   NMAPFSCAN = "PSNG_TCP_FILTERED_PORTSCAN"
22   NMAPSCANUDP = "PSNG_UDP_FILTERED_PORTSCAN"
23   NMAPPSNG = "ICMP PING NMAP"
24   TCPPSCAN = "(portscan) TCP Portscan"
25   NMAPSCAN = "PSNG_TCP_PORTSCAN"
26   SSHSCAN = "SSH insecure connection attempt (scan)."
27   SSHSCAN2 = "Possible attack on the ssh server (or version gathering)."
28   if classification != NMAPPSNG and classification != NMAPFSCAN and classification != TCPPSCAN and classification != NMAPSCAN and classification != SSHSCAN and classification != SSHSCAN2 and classification != NMAPSCANUDP:
29    return
30   source = idmef.Get("alert.source(*).node.address(*).address")
31   for saddr in source:
32    ctx = Context(("NETWORK_INFO_PORTSCAN_ATTACKER", saddr), { "expire": 600, "alert_on_expire": True }, update = True, idmef=idmef)
33    if ctx.getUpdateCount() == 0:
34     ctx.Set("alert.correlation_alert.name", "Network scan of host(s) detected" )
35     ctx.Set("alert.classification.text", "Network information for scanning host")
36     ctx.Set("alert.assessment.impact.severity", "high")
37      # only create one alert per source
38      # GeoIP
39      # only do GeoIP lookup if IP address is not private
40      if saddr.find("10.", 0, 4) != -1 or saddr.find("172.", 0, 4) != -1 or saddr.find("192.", 0, 4) == -1:
41      # if GeoIP City Database exists
42      if os.path.exists("/usr/Share/GeoIP/GeoLiteCity.dat") == True:
43       import GeoIP
44       gi = GeoIP.open("/usr/share/GeoIP/GeoLiteCity.dat",GeoIP.GEOIP_STANDARD)
45       geoinfo = gi.record_by_addr(saddr)
46       geo = re.sub(r'\'', r'', re.sub(r': ', r':', str(geoinfo)) )
47       idmef = IDMEF()
48       idmef.Set("alert.classification.text", "Geographical Information for portscanning host")
49       idmef.Set("alert.correlation_alert.name", geo )
50       idmef.Set("alert.assessment.impact.severity", "high")
51       idmef.Set("alert.assessment.impact.description", "Geographical information for portscanning host " + saddr)
52       idmef.alert()
53       ctx.update(idmef=idmef)
54      # else if only GeoIP Country Database exists
55      elif os.path.exists("/usr/share/GeoIP/GeoIP.dat") == True:
56       import GeoIP
57       gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)
58       idmef = IDMEF()
59       idmef.Set("alert.classification.text", "Geographical Information for portscanning host")
60       idmef.Set("alert.correlation_alert.name", str(gi.country_code_by_addr(saddr)) )
61       idmef.Set("alert.assessment.impact.severity", "high")
62       idmef.Set("alert.assessment.impact.description", "Geographical information for portscanning host " + saddr)
63       idmef.alert()
64       ctx.update(idmef=idmef)a

Der Korrelationsalarm »Network Information for scanning host« enthält sowohl die Geo-IP-Informationen als auch die zugehörigen Alarme der Snort-OSSEC-Sensoren. Das Plugin wartet 5 Minuten, sammelt alle Portscan-Ereignisse innerhalb dieses Zeitraums und packt sie gesammelt in einen Korrelationsalarm. Damit das klappt, muss der Admin vorher mit »aptitude install geoip-python libgeoip1« Geo-IP für Python installieren. Wer sich mit den Länderinformationen nicht zufriedengibt, dem hilft die Geo-IP-City-Lite-Datenbank von [16] weiter.

Abbildung 7: Erkennt das System einen Portscan von Snort oder OSSEC, dann erhält der Admin wenig später in der Liste der Alarme den Eintrag Geographical Information for portscanning host.
comments powered by Disqus

Artikel der Woche

Support-Ende von SMBv1

Mit dem aktuellen Update für Windows 10 und Windows Server 2016 steht eine Änderung ins Haus, die gerade für Benutzer älterer Linux-Distributionen große Auswirkungen hat. Nachdem Microsoft es über viele Jahre schon angekündigt hat, entfernt der Konzern mit dem aktuellen Update-Release den Support für das SMB-Protokoll 1. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Linux-Backup

Welche Backup-Lösung setzen Sie für Linux im professionellen Umfeld ein?

  • keine
  • eigene Scripts
  • rsnapshot
  • rdiff-backup
  • Bacula
  • Bareos
  • Borg
  • Duplicity
  • Amanda
  • Burp
  • Clonezilla
  • Acronis
  • Arkeia
  • SEP sesam
  • Veeam
  • Redo Backup
  • Relax-and-Recover
  • andere kommerzielle Software
  • andere Open-Source-Software

Google+

Ausgabe /2017

Microsite