Mailfilterung mit SIEVE auf dem IMAP-Server
Zur Filtern von E-Mails auf IMAP-Server wurde die Programmiersprache SIEVE konzipiert - die genaue Spezifikationen erfolgten hierzu im RFC 5228. Das Hauptaugenmerk von SIEVE liegt auf Einfachheit, Erweiterbarkeit, sowie auf Unabhängigkeit von der verwendeten Zugriffsart und Architektur wie auch dem verwendeten Betriebssystem. Sieve wurde spezifiziert, um den Usern die Möglichkeit zu beiten, bereits serverseitig auf einfache Art eigene Regeln zur Filterung von E-Mails zu definieren. Sieve-Scripte werden bereits während der Zustellung der eMail am IMAP-Server ausgeführt.
Weitere Hintergrundinformationen finden man unter anderem in dem Wikipedia-Artikel zu SIEVE.
sieveshell
Mit Hilf der sieveshell, aus dem Paket cyrus-imapd-utils, kann der versierte, technisch begabte Nutzer, seine eigenen Filterregeln einspielen, verwalten und/oder löschen.
Möchte man zum Beispiel automatisch generierte Nachrichten, von sieve beim Einliefern bei unserem Cyrus-IMAP-Server vorsortieren lassen, so gehen wir wie folgt vor:
Script erstellen
Mit dem Editor unserer Wahl erstellen wir uns ein einfaches Textfile, mit den entsprechenden Filterregeln. So sollen Nachrichten von der Adresse logwatch@nausch.org in den Unterordner /root/logwatch, Nachrichten, die im Betreff das Schlüsselwort „FaxMaster“ und die mit dem Schlüsselwort „PostMaster“ in den Ordner /root/FaxMaster bzw. /root/PostMaster einsortiert werden.
$ vim eigene_Filterregel require ["fileinto"]; if header :contains "from" ["logwatch@nausch.org"] { fileinto "INBOX/root/logwatch"; } elsif header :contains "subject" "FaxMaster" { fileinto "INBOX/root/FaxMaster"; } elsif header :contains "subject" "PostMaster" { fileinto "INBOX/root/PostMaster"; } else { fileinto "INBOX"; }
Script hochladen
Damit wir unser selbst definiertes Script auch nutzen können, müssen wir es auf unseren IMAP-Server hochladen. Hierzu melden wir uns von unserem Nutzer-Login mittels cyradm an unserem IMAP-Server an. Dank unserer saslauth Konfiguration, erfolgt die Authentifizierung gegen unseren LDAP-server und wir müssen uns kein weiteres Passwort merken.
[django@nss ~]$ sieveshell imap.nausch.org connecting to imap.nausch.org Please enter your password: >
Nach dem Prompt der sieveshell können wir uns mittels des „?“ den Befehlsumfang anzeigen lassen.
> ?
Usage:
sieveshell [-u username] [-a authname] [-r realm] <server>
help - this screen
list - list scripts on server
put <filename> [<target name>]
- upload script to server
get <name> [<filename>]
- get script. if no filename display to stdout
delete <name> - delete script.
activate <name> - set a script as the active script
deactivate - deactivate all scripts
quit - quit
Mittels put laden wir unser zuvor erstelle Textfile auf den Server hoch.
> put eigene_Filterregel
Mittel List bekommen wir all unsere hinterlegten Scripte anzeigen lassen. Auf dem Server können durchwegs mehrere Scripte hinterlegt sein, aber nur eines ist aktiv!
> list erster_Versuch eigene_Filterregel smartsieve <- active script
Mittels activate <Scriptname> aktivieren wir dann unser neues Script; ein list zeigt uns unsere Änderung entsprechend an.
> activate eigene_Filterregel > list erster_Versuch eigene_Filterregel <- active script smartsieve
Dass diese Vorgehensweise, wie Eingangs schon erwähnt, nur für den versierten technischen Nutzer geeignet ist und den WAF1) nicht sonderlich hebt, ist selbstredent. Es muss also eine komfortablere Möglichkeit geschaffen werden. Somit sind wir beim nächsten Thema smart-sieve angelangt.
smart-sieve
SmartSieve ist eine sieve Filter-GUI bzw. Web-Basierte Management-Client. Es ist eine grafische Benutzeroberfläche zum Erstellung und zum Verwaltung von sieve-Skripten auf einem Cyrus-IMAP Mailserver. Hiermit haben auch nicht technisch versierte Nutzer unseres Cyrus-IMAP-Servers die Möglichkeit, Regeln für sieve zu erstellen um e-Mails und Abwesenheitsnachrichten, ohne Vorkenntnisse über die sieve-Script-Sprache, zu definieren und zu verändern.
Installation
Paketabhängigkeiten
Vor der eigentlichen Installation von SmartSive installieren wir noch drei notwendige PHP-Komponenten (php-imap, php-mcrypt und php-pecl-idn).
# yum install php-imap php-mcrypt php-pecl-idn
Download
Von der Projektseite auf SourceForge.net laden wir uns die aktuelle Version, hier weiter beschrieben smartsieve-1.0-RC2.tar.gz, herunter.
# wget http://ovh.dl.sourceforge.net/sourceforge/smartsieve/smartsieve-1.0-RC2.tar.gz
Installation
Das Paket entpacken wir mittels:
# tar xvfz smartsieve-1.0-RC2.tar.gz
Das entpackte Verzeichnis verschieben wir nach /usr/share, passen die Nutzerrechte entsprechend an und löschen dann anschließend das Archiv wieder.
# mv /usr/share/smartsieve-1.0-rc2 /usr/share/smartsieve # chown -R root:apache smartsieve # rm /usr/share/smartsieve-1.0-RC2.tar.gz
VHost-Definition
Für unsere Nutzer legen wir einen eigenen V-Host an, über dessen später die Userzugriffe erfolgen sollen. Mit dem Editor unserer Wahl bearbeiten wir also unsere Apache-Konfigdatei /etc/httpd/conf.d/vhosts.conf.
# vim /etc/httpd/conf.d/vhosts.conf
- vhosts.conf
# # smartsieve.nausch.org # <VirtualHost *:80> ServerAdmin webmaster@nausch.org ServerName smartsieve.nausch.org:80 ServerAlias smartsieve.nausch.org *.smartsieve.nausch.org ServerPath / DocumentRoot "/usr/share/smartsieve" <Directory "/usr/share/smartsieve"> Options FollowSymLinks AllowOverride AuthConfig Order allow,deny Allow from all </Directory> AddType application/x-httpd-php .php DirectoryIndex index.php ErrorLog logs/smartsieve_error.log CustomLog logs/smartsieve_access.log combined </VirtualHost>
Mittels eines anschließende Reload geben wir unseren neu definierten VHost dem System bekannt.
# service httpd restart
Konfiguration
servers.php
Im Verzeichnis ../smartsieve/conf/ befindet sich die Serverdefinition in dem PHP-Script servers.php. Diese passen wir unseren Gegebenheiten entsprechend an, so dass nur noch unser IMAP-Server aktiv ist. Den Rest löschen, bzw. Marken wir mittels / / aus.
# vim /usr/share/smartsieve/conf/servers.php <?php $servers['cyrus'] = array( 'display' => 'Cyrus IMAP Server @ nausch.org', 'server' => 'imap.nausch.org', 'sieveport' => '2000', 'imapport' => '143/imap/notls', 'maildomain' => 'nausch.org' ); ?>
config.php
Die eigentliche Konfiguration von SmartSieve erfolgt dann über die Konfigurationsdatei config.php, welche ebenfalls im Verzeichnis ../smartsieve/conf/ liegt. Auch diese bearbeiten wir mittels vi.
# vim /usr/share/smartsieve/conf/config.php
Zur Dokumentation haben sind nachfolgend nur die aktiven Zeilen ausgegeben.
<?php $default->language = "de_DE"; $default->charset = "ISO-8859-1"; $default->proxy_authz_users = array(); $default->user_select_lang = true; $default->user_select_server = false; $default->user_supply_scriptfile = false; $default->allow_multi_scripts = false; $default->scriptfile = 'smartsieve'; $default->allow_write_unrecognised_scripts = true; $default->allow_change_mode = false; $default->allow_regex = false; $default->allow_custom = true; $default->notify_methods = array('mailto', 'sms'); $default->use_forward_mail_interface = true; $default->use_vacation_interface = true; $default->use_whitelist = true; $default->spam_filter = array('header'=>'X-Spam-Score', 'matchStr'=>'^[0-9]', 'matchType'=>':regex', 'not'=>false); $default->websieve_auto_matches = false; $default->session_name = 'SmartSieve'; $default->cookie_domain = $_SERVER['SERVER_NAME']; $default->page_title = 'SmartSieve'; $default->login_page_heading = 'Willkommen beim SmartSieve-Server bei nausch.org'; $default->initial_page = 'main.php'; $default->vacation_days = '1'; $default->max_vacation_days = '30'; $default->max_field_chars = 500; $default->max_textbox_chars = 50000; $default->update_activate_script = false; $default->return_after_update = false; $default->socket_timeout = 4; $default->crypt_lib = 'null'; $default->crypt_args = array(); $default->sasl_mech = 'plain'; $default->logging = true; $default->logging_level = LOG_DEBUG; $default->logging_method = 'syslog'; $default->logging_facility = 'LOG_MAIL'; $default->logging_ident = 'smartsieve'; $default->logging_args = array(); ?>
Programmstart
Mit dem Webbrowser unserer Wahl öffnen wir die Eingangsseite.
Nach erfolgter Anmeldung befinden wir uns im Hauptbildschirm, in der wir nun unsere benutzerindividuellen Regeln anlegen, verwalten und löschen können. Dies erfolgt hierbei Benutzerintuitiv und bedarf keiner großartigen Beschreibung mehr - der WAF ist somit gesichert!