sa-learn auf verteilten Mailsystemen

Veröffentlicht in Uncategorized am November 25, 2009 von bitmuncher

In Zeiten, in denen Email immer wichtiger für die Firmen-Kommunikation ist, und viele Firmen eine volle Kontrolle über ihre Emails haben wollen, spielen verteilte Email-Systeme eine immer größere Rolle, selbst für Admins in mittelgrossen Betrieben. Diese bestehen zumeist aus einem Mail-Gateway, der Spam- und Virenfilter-Funktionen übernimmt, einem MTA/SMTP-Server und einem IMAP/POP3-Server.

Wer schonmal mit Spamassassin gearbeitet hat, wird da schnell auf die Frage kommen „Aber wie kann ich ein effektives Learning des Spamfilters erreichen, wenn sa-learn garkeinen Zugriff mehr auf die Postfächer hat?“ Auch dafür hat fast jeder Admin seine eigenen Ansätze. Manch einer richtet eine Email-Adresse ein, an die die User ihre nicht erkannten Spammails weiterleiten können. Und manch einer hängt via NFS o.ä. die Maildirs der Benutzer auf dem Mailgateway ein und richtet in den Mailboxen der User einen Ordner ein, in den sie ihre nicht erkannten Spammails werfen können.

Ein NFS-Mount stellt natürlich ein Sicherheitsrisiko dar, da ein erfolgreicher Angriff auf den Gateway auch gleichzeitig einen Zugriff auf die Postfächer gewährt, die man durch Trennung der einzelnen Systeme ja auch verhindern will. Über das Parsen von Emails hatte ich ja bereits vor geraumer Zeit unter http://www.hackerwiki.org/index.php/Email_Parsing_mit_den_MIME-Tools_für_Perl schonmal was geschrieben, wenn auch eher „andersrum“. Aus diesem Text geht eigentlich ja auch recht gut hervor, was man alles beachten muss beim Parsen von Emails, was bei weitergeleiteten Nachrichten immer notwendig ist, wenn man die eigentliche Spammail dort rausholen will.

Beide Methoden haben also ihre Vor- und Nachteile. Eine weitere Methode, die weder kompliziertes Email-Parsing noch NFS-Mounts auf dem Gateway benötigt, könnte so aussehen…

Zuerstmal richtet man einen extra Account auf dem Mail-Gateway ein. Dieser bekommt via sudoers das Recht ‘sa-learn’ als Mailuser auszuführen. Nun legen wir auf dem IMAP-Server ein Skript an, das die Spam-Mails einsammelt:

#!/usr/bin/perl

use File::Copy;
use File::Path qw(mkpath);

my ($action) = @ARGV;
my $targetdir = ($ENV{HOME}."/spammails");
my $targetfile = ($ENV{HOME}."/spammails.tar.gz");

sub collect_spammails
{
    my @spammails = </imap/*/*/Maildir/.INBOX.spam_unknown/cur/*>;

    # pruefen ob der zielordner vorhanden ist
    if(! -e "$targetdir") {
        mkpath($targetdir);
    }

    # spammails nach $targetdir moven
    foreach my $this_spammail (@spammails) {
        move($this_spammail, $targetdir)
            or die "Couldn't move file: $!n";
    }
}

sub compress_spammails()
{
    my $cmd = "tar -czf ".$targetfile." ".$targetdir;
    my $out = `$cmd`;
    print $out;
}

sub cleanup_spammails
{
    if(unlink($targetfile != 0)) {
        print "Couldn't cleanup $targetfile.n";
    }
    my $files_path = $targetdir."/*";
    my @files = <$files_path>;
    foreach my $this_file (@files) {
        unlink($this_file);
    }
}

if($action eq 'collect') {
    &collect_spammails();
    &compress_spammails();
} elsif($action eq 'cleanup') {
    &cleanup_spammails();
} else {
    print "Unknown parameter.n";
}

Der Pfad zu den Maildirs muss natürlich angepasst werden. Dieses Beispiel geht davon aus, dass die Spam-Emails in /imap/<domain>/<benutzername>/Maildir/.INBOX.spam_unknown/cur/ liegen. Es lässt sich nun ganz einfach vom Gateway aus mittels SSH aufrufen und sammelt die Spammails in einem Tarball zusammen, den man dann via ‘scp’ auf den Gateway holen und auspacken kann. Auf dem Gateway müsste also nur folgendes ausgeführt werden:

1. ssh -i keyfile benutzer@imapserver /pfad/zum/skript.pl collect
2. scp -i keyfile benutzer@imapserver:/pfad/zum/tarball/spammails.tar.gz ./
3. tar -xzf spammails.tar.gz
4. cd spammails
5. sudo -u mailbenutzer sa-learn –spam *
5. cd .. && rm -r spammails*
6. ssh -i keyfile benutzer@imapserver /pfad/zum/skript.pl cleanup

Natürlich lässt sich das auch in einem Skript zusammenfassen. ;) Der Keyfile-Parameter deutet ja schon darauf hin, dass hier SSH mit Key-Auth verwendet wird. Deswegen wird auch ein extra User verwendet und nicht der Benutzer des Mailservers oder gar root. Ein Angreifer kann somit auch wenn er auf die Idee kommt die User-Accounts auf Keyfiles zu durchforsten nur einen unauthorisierten Zugriff auf die anderen Systeme erlangen. Und selbst dies kann man ja auch noch einschränken, indem man eine restricted Shell verwendet, die nur die für seinen Job notwendigen Befehle zulässt.

Update von OpenSolaris

Veröffentlicht in operating systems mit den Tags , , , , am November 26, 2008 von bitmuncher

Ein wenig gewöhnungsbedürftig ist das Updaten bei Solaris ja, aber eigentlich ist es ziemlich genial und wenn man weiss wie, ist es auch ganz einfach. :) Elementar sind die Werkzeuge beadm für den Umgang mit alternativen Boot-Umgebungen und natürlich pkg für das eigentliche Update.

Damit ihr nicht die gleichen Probleme habt wie ich, hier mal ein kleiner Guide zum Updaten eines OpenSolaris-Release mit einem Build kleiner 93. Wer bereits einen Build >93 verwendet, kann ja einfach image-update verwenden. Für einen Build <93 ist noch folgendes zur Vorbereitung, oder besser gesagt zum Absichern, dass nicht viel schief gehen kann, notwendig…

Die komplette Prozedur ist natürlich mit Root-Rechten durchzuführen. Zuerstmal setzen wir uns die $BUILD-Umgebungsvariable. Das verhindert Tippfehler bei der Build-Nummer und unverständliche Fehlermeldungen. ;)

$ BUILD=`uname -v | sed s/snv_//`

Dann sorgen wir dafür, dass wir eine aktuelle IPS-Software installiert haben

$ pfexec pkg refresh
$ pfexec pkg-install SUNWipkg@0.5.11-0.$BUILD
$ pfexec pkg-install entire@0.5.11-0.$BUILD

Das sollte man auch bei einem Build >=93 tun. Mit einem solchen Build kann an dieser Stelle mit image-update fortgefahren werden (pfexec pkg image-update). Sonst sollten wir eine alternative Boot-Umgebung verwenden. Um eine Liste der aktuellen BEs (Boot Environments) zu bekommen, können wir

$ beadm list

verwenden. Wer noch nie ein Update gemacht hat, kann getrost ‘opensolaris-’ als Namen für sein neues BE verwenden. Ansonsten richtet euch nach dem Namensschema, das bisher verwendet wurde. Wir erstellen also das neue BE.

$ pfexec beadm create opensolaris-

Mounten dieses nach /mnt

$ pfexec beadm mount opensolaris- /mnt

Updaten es

$ pfexec pkg -R /mnt image-update

Und aktivieren es

$ pfexec beadm activate opensolaris-

Wer so wie ich noch Build 86 benutzt, sollte unbedingt auch den Grub updaten, sonst gibt es beim Booten richtig Probleme. Also einmal

$ pfexec /mnt/boot/solaris/bin/update_grub -R /mnt

ausführen.

Damit nun beim Booten in das neue BE nichts mehr schief gehen kann, sollte /mnt beim Reboot nicht mehr gemountet sein. Wir unmounten also /mnt

beadm unmount opensolaris-

Nun können wir in das neue BE booten und alles sollte laufen. Wenn alles läuft, kann das alte BE wie gewohnt entfernt werden.

Überlegungen zu Amazon EC2 Instanzen als Ziel von Angriffen

Veröffentlicht in security mit den Tags , , , , , am September 15, 2008 von bitmuncher

Cloud-Computing ist ein Stichwort, das heutzutage in vielen Firmen, die grössere Webapplikationen oder Homepages unterhalten, in aller Munde ist. Amazons EC2-Plattform dürfte wohl momentan die grösste Cloud-Computing-Umgebung sein, die derzeit existiert.

Was ist EC2?

Die EC2-Plattform gibt jedem die Möglichkeit eigene virtuelle Server auf von Amazon bereitgestellter Hardware zu booten. Dazu lassen sich eigene System-Images auf der S3-Plattform von Amazon speichern, die dann direkt geladen werden. Jede Instanz erhält, solange sie läuft, einen eindeutigen Public-DNS-Eintrag der Form ec2-XXX-XXX-XXX-XXX.compute-X.amazonaws.com, über den auf die Instanz zugegriffen werden kann. Dabei bildet der Bereich XXX-XXX-XXX-XXX die IP der Instanz.

Was macht EC2-Instanzen zu einem lohnenden Angriffsziel?

Da gerade Web-Plattformen ihre Webserver mit EC2 entlasten, findet man dort oftmals Quelltexte verschiedenster Plattformen, deren Verkauf oder Veröffentlichung sicherlich für einige Probleme bei diesen Firmen sorgen kann. Da auch Datenbanken gern dann auf diesen Instanzen laufen, kommt man so auch leicht an die kompletten Kundenstämme der betroffenen Plattform und andere sensible Daten. Laufen auf den EC2-Instanzen keine eigenen Datenbanken, findet man fast immer bestehende Tunnel in die DMZ der angegriffenen Plattform.

Was macht den Angriff auf EC2-Instanzen einfacher als direkte Angriffe auf die zugehörige Plattform?

Schaut man sich mal in der Liste der öffentlich verfügbaren AMIs (Amazon Machine Images) etwas genauer um, findet man dort Unmengen veralteter Systeme. Natürlich erstellen die meisten Admins eigene Images, aber dies geschieht oftmals auf Basis von bestehenden Public-AMIs. Erstellt man ein eigenes AMI aus einem vorhandenen öffentlichen, kopiert man sein X.509-Zertifikat und die zugehörige Schlüsseldatei nach /mnt und erstellt mittels der EC2-Tools ein neues AMI, das man dann auf seinen S3-Speicher kopiert und als AMI für seine UserID registriert. Dieses AMI ist dann ‘private’ und kann nur über den zugehörigen Account genutzt werden. Bei der Erstellung von AMIs werden aber offenbar immer wieder ein paar typische Fehler gemacht.

Zuerstmal wird zumeist nicht beachtet, dass alle Public-AMIs bereits für den root-Account einen SSH-Key in der /root/.ssh/authorized_keys liegen haben, dessen Private-Key auch zumeist irgendwo im System rumschwirrt. Jemand, der sich also das zugrunde liegende Public-AMI bootet, kann so einen passenden Key für den root-Account erlangen. Weiterhin wird bei der Absicherung des Systems nicht beachtet, dass keine echte DMZ aufbaubar ist. Vergleichbar ist das mit Rootservern oder VServern, wie man sie bei jedem Hoster mieten kann. Dadurch werden viele DoS-Lücken nicht gefixt, die sonst die Firewall oder das IDS/IPS abfangen würde. (D)DoS-Angriffe auf eine EC2-Instanz können aber für den zugehörigen Account ziemlich teuer werden, denn dort gibt es keine Traffic-Flatrates.

Und das Problem der fehlenden DMZ erstreckt sich noch weiter… Um auf die Datenbanken (ich bleibe einfach mal beim Beispiel der Webplattformen) zuzugreifen, muss auf die DMZ der Plattform zugegriffen werden. Dabei spielt es keine Rolle, ob eine replizierte Datenbank auf der Instanz selbst läuft (meiner Erfahrung nach die häufigste Methode, da die Performance damit besser ist) oder ob direkt auf die Datenbankserver der Plattform zugegriffen wird. Zumeist werden für die Zugriffe auf die DMZ SSH- oder VPN-Tunnel verwendet. Nun muss man nicht lange raten um sich zu denken, dass die Keys dafür zumeist in den AMIs eingebunden und somit direkt auf der laufenden Instanz verfügbar sind. Hat man also Zugriff auf die Instanz, kommt man auch ganz schnell an alle anderen statischen Teile der zugehörigen Plattform.

Doch damit nicht genug… Auffällig ist auch, dass die Images offenbar nicht so schnell aktualisiert werden, wie es bei den zugehörigen statischen Teilen der Plattformen der Fall ist. Macht man bei einer EC2-Instanz ein Update, muss aus der Instanz ein neues AMI erstellt werden, damit es beim nächsten Booten auch wieder aktualisiert ist. Dies kostet natürlich Zeit, weswegen die Updates von EC2-Instanzen meist ziemlich hinterher hinken. Man findet sogar Instanzen, deren AMIs schon seit Monaten nicht aktualisiert wurden, so dass man passende Exploits auf jeder schlechten Cracker-Seite findet.

Zusammengefasst liegen die Schwächen von EC2-Instanzen in folgenden Punkten

  • schlechte Einrichtung des AMI
  • schlechte Update-Politik
  • Nicht-Beachtung des Fehlens einer DMZ und externer Schutzsysteme wie Firewall, IDS/IPS usw.
  • Zugriffe auf die DMZ einer Plattform über Tunnel

Wie bekommt man raus welches Image einem AMI zugrunde liegt?

Dies ist zumeist über die Fingerprints der Systeme möglich, wie man sie z.B. mit nmap ermitteln kann. Zuerstmal ermittelt man allgemein das System, das auf dem AMI läuft. Anhand der Kernel-Version sucht man nach passenden Public-AMIs, die man sich dann bootet und deren Fingerprints mit dem Ziel vergleicht. Auf diese Weise kann man recht gut das Public-AMI ermitteln, das als Grundlage des Instanz-AMI diente. Der Rest verlangt dann zumeist nur noch ein paar Grund-Skills um sich Zugang zur Instanz zu verschaffen.

Was sollte ein Admin, der mit EC2 arbeitet, beachten?

  • bei der Einrichtung der AMIs kein public AMI verwenden oder dieses gründlich säubern
  • zusätzlicher Schutz vor Angriffen muss eingerichtet werden
  • Keys für notwendige Tunnel in die DMZ sollten von einem Remote-Medium geholt werden, das ausgehängt wird, wenn der Tunnel aufgebaut wurde
  • SSH-Port verlegen (sollte man eh bei jedem Server tun)
  • tmp-Verzeichnis sollte von einem Remote-Server (z.B. Rootserver) kommen und noexec gemountet werden, per Default haben EC2-Instanzen keine extra tmp-Partition
  • Updates regelmässig machen und nach jedem Update ein neues AMI erstellen
  • sobald ein Reboot notwendig ist immer das zuletzt erstellte AMI booten, keinen normalen Reboot machen

Naja… es gäbe noch einiges mehr, das man erwähnen könnte, aber ich brauch jetzt erstmal eine Tüte Schlaf. Wer Rechtschreibfehler findet, kann sie behalten. :D

Traffic-Hiding via SSH ganz legal

Veröffentlicht in security mit den Tags , , am September 13, 2008 von bitmuncher

Immer wieder wird mir die Frage gestellt, wie man denn verhindern kann, dass der Provider sieht welche Internetseiten man besucht usw., da ja auch Gevatter Staat mit Gerichtsbeschluss solche Daten einfordern kann. Glücklicherweise muss man dafür aber keine illegalen Mittel einsetzen. Ein einfacher VServer oder Rootserver (bitte nur zulegen, wenn ihr Ahnung davon habt, siehe http://root-und-kein-plan.ath.cx/ ) und ein SSH-Client mit Tunneling-Möglichkeiten reicht dafür völlig aus.

Zuerstmal richte man sich auf dem Server einen anonymisierenden Proxy ein. Wichtig ist, dass es sich um einen privaten Server handelt, der seine Dienste nur nach Authentifizierung zur Verfügung stellt. In dem Fall seid ihr nämlich nicht dazu verpflichtet Verbindungsdaten zu loggen. Ihr stellt ja keine öffentlich erreichbaren Dienste zur Verfügung. Ich liebe die schwammige deutsche Gesetzeslage in dieser Hinsicht. :D

Steht der Proxy, legt ihr mittels ‘ssh’ einen Tunnel zwischen dem Proxy-Port und einem beliebigen freien Port auf dem Server. Selbst ein LKM-Trojaner um diesen Traffic unverschlüsselt abzufangen ist nicht gerade einfach zu basteln. Damit das Ganze aber auch für euren Provider unleserlich wird, legt ihr einen weiteren Tunnel zwischen eurem Desktop-Rechner und dem Tunnel-Port auf dem Server. Den auf eurem Desktop-Rechner verwendeten Port tragt ihr nun als Proxy in eure Browser-Konfiguration ein. Nun gibt es eigentlich nur noch die Möglichkeit eure Verbindung anhand von client-seitigen Skripten zu ermitteln. Diese müssen aber vom entsprechenden Server kommen, den ihr ansurft. Dass jemand was entsprechendes auf Provider-Seite in eure Verbindung schmuggelt (Stichwort: MITM), ist eher unwahrscheinlich. Er müsste dazu erstmal den SSH-Tunnel knacken. Wer besonders paranoid ist, kann natürlich auch Flash, Javascript und Java deaktivieren um clientseitige Scripte zu verhindern oder gleich einen Browser verwenden, der sowas nicht unterstützt. Wichtig ist ausserdem, dass der Server natürlich gut gesichert ist. Nur weil wir keine illegalen Mittel benutzen dürfen, heisst das ja leider nicht, dass Gevatter Staat das auch nicht darf. Daher…

- Passwort-Authentifizierung im SSH-Server ausschalten und Keyfiles verwenden
- sämtlichen Traffic, der nicht über den SSH-Tunnel und den Proxy geht z.B. mittels IDS unterbinden
- Kernel ohne Modul-Unterstützung verwenden um LKM-Trojaner zu verhindern
- alles noexec mounten, was keine Executables enthält
- root-Account umbenennen, im Idealfall Rollensystem z.B. mit SELinux verwenden
- Stack-Smashing-Guard einsetzen
- Tools wie fail2ban einsetzen um nach mehrfach fehlgeschlagener Authentifizierung die entsprechenden IPs automatisch auszusperren
- Dateisystem mittels File Alteration Monitoring überwachen

Hach wie gut dass Herr Schäuble nicht weiss, dass sein Überwachungswahn bei den Leuten, die sich auskennen, eh in’s Leere läuft.  B) :> Im übrigen kann man auf diese Weise auch die Zwangsproxy der Provider zumeist umgehen. Gerade Firmen wie Arcor und T-Online „sperren“ ja gern bestimmte Seiten, die sie für gefährlich halten. Auf diese Weise habt ihr die Möglichkeit wieder selbst zu entscheiden was gefährlich ist und was nicht. Das erspart das Warten in der Warteschlange der Hotline und Diskussionen mit inkompetenten Callcenter-Agents. Eine rechtliche Grundlage haben sie für diese Sperrungen eh nicht, außer den Jugendschutz. Wer aber einen Server mietet, muss mindestens 18 Jahre sein und theoretisch kann man ja die Freigabe beim Provider auch einfordern, was aber nervig ist. Da man auch keine Sicherheitslücke nutzt, ist die Sache völlig legal. Die Benutzung von SSH-Verbindungen ist ja nicht verboten. :)

Und bevor jetzt wieder die Frage kommt, was die Leute tun sollen, die sich keinen Server leisten können oder die nicht ausreichend Wissen für eine solche Kiste haben… Spart, bis ihr es euch leisten könnt (Vserver gibt es ab 10 Euro im Monat) und lernt, bis ihr damit sicher umgehen könnt.

Follow

Get every new post delivered to your Inbox.