fetchmail Integration in postfixadmin
Viele Benutzer haben auch Mailboxen bei anderen Anbietern, z.B. bei gmx oder web.de. Damit diese Benutzer ihre E-Mails aggregieren können, wird fetchmail eingerichtet. fetchmail ist bereits in postfixadmin integriert, somit können fetchmail-Einträge über postfixadmin verwaltet werden (derzeit leider nur von Administratoren). Über das mitgelieferte fetchmail.pl-Skript werden die Daten aus der Datenbank ausgelesen, fetchmail aufgerufen, die Mails durch amavisd-new überprüft und an die Mailboxen der Benutzer ausgeliefert. Das perl-Skript wurde etwas angepasst, damit es mit postgres interagieren kann. Des Weiteren wurden die Dateinamen etwas angepasst.
Installation:
aptitude install fetchmail aptitude install liblockfile-simple-perl
Nötige Verzeichnisse für das Skript anlegen:
mkdir /var/run/fetchmail touch /var/run/fetchmail/fetchmail-all.lock
Das Skript:
fetchmail.pl
#!/usr/bin/perl use DBI; use MIME::Base64; # use Data::Dumper; use File::Temp qw/ mkstemp /; use Sys::Syslog; # require liblockfile-simple-perl use LockFile::Simple qw(lock trylock unlock); openlog("fetchmail-all", "pid", "mail"); sub log_and_die { my($message) = @_; syslog("err", $message); die $message; } # read options and arguments $configfile = "/etc/fetchmail/config"; @ARGS1 = @ARGV; while ($_ = shift @ARGS1) { if (/^-/) { if (/^--config$/) { $configfile = shift @ARGS1 } } } # postgres settings $database="postfix"; $hostname="127.0.0.1"; $user="postfix"; $password="XXXXXX"; $run_dir="/var/run/fetchmail"; # use specified config file if (-e $configfile) { do $configfile; } $dsn = "DBI:Pg:database=$database;host=$hostname"; $lock_file=$run_dir . "/fetchmail-all.lock"; $lockmgr = LockFile::Simple->make(-autoclean => 1, -max => 1); $lockmgr->lock($lock_file) || log_and_die "can't lock ${lock_file}"; #postgres connect $dbh = DBI->connect($dsn, $user, $password) || log_and_die "cannot connect the database"; $sql=<<SQL; SELECT id,mailbox,src_server,src_auth,src_user,src_password,src_folder,fetchall,keep,protocol,mda,extra_options,usessl FROM fetchmail WHERE date_part('epoch',now())-date_part('epoch',date) > poll_time*60 SQL my (%config); map{ my ($id,$mailbox,$src_server,$src_auth,$src_user,$src_password,$src_folder,$fetchall,$keep,$protocol,$mda,$extra_options,$usessl)=@$_; syslog("info","fetch ${src_user}@${src_server} for ${mailbox}"); $cmd="user '${src_user}' there with password '".decode_base64($src_password)."'"; $cmd.=" folder '${src_folder}'" if ($src_folder); $cmd.=" mda ".$mda if ($mda); # $cmd.=" mda \"/usr/local/libexec/dovecot/deliver -m ${mailbox}\""; $cmd.=" is '${mailbox}' here"; $cmd.=" keep" if ($keep); $cmd.=" fetchall" if ($fetchall); $cmd.=" ssl" if ($usessl); $cmd.=" ".$extra_options if ($extra_options); $text=<<TXT; set postmaster "postmaster" set nobouncemail set no spambounce set properties "" set syslog poll ${src_server} with proto ${protocol} $cmd TXT ($file_handler, $filename) = mkstemp( "/tmp/fetchmail-all-XXXXX" ) or log_and_die "cannot open/create fetchmail temp file"; print $file_handler $text; close $file_handler; $ret=`/usr/bin/fetchmail -f $filename -i $run_dir/fetchmail.pid`; unlink $filename; $sql="UPDATE fetchmail SET returned_text=".$dbh->quote($ret).", date=now() WHERE id=".$id; $dbh->do($sql); }@{$dbh->selectall_arrayref($sql)}; $lockmgr->unlock($lock_file); closelog();
Damit das Skript regelmäßig ausgeführt wird, legen wir einen Cronjob dafür an (als Benutzer root). In der hier gezeigten Konfiguration wird das Skript alle 5 Minuten ausgeführt.
crontab -e:
*/5 * * * * /PFAD/ZU/fetchmail.pl &> /dev/null
Der neue Server: Teil 7 roundcube
Oft hat man nicht die Möglichkeit mit einen E-Mail Client - wie z.B. Evolution oder Thunderbird - arbeiten zu können, deshalb wird hier darauf eingegangen wie man einen Webmailer - in diesem Fall roundcube - inkl. postfixadmin-Integration und Sieve-Plugin installiert.
imapproxy
Da http ein "stateless"-Protokoll ist, kann es - anders als IMAP-Clients - keine Verbindungen offen halten und stellt deshalb sehr viele unnötige "LOGIN"-Anfragen. Um dies zu verhindern wird ein imapproxy installiert. Dieser wird dem Webmailer vorgeschaltet und hält die Verbindungen geöffnet. Stellt der Webmailer nun eine Anfrage an den Proxy, sucht dieser die Verbindung raus und benutzt die bestehende Verbindung anstatt eine neue aufzubauen. Der Proxy hält die Verbindung nicht für eine unbestimmte Zeit offen, sondern schließt sie nachdem ein Timeout abgelaufen ist.
Installation:
aptitude install imapproxy
Konfiguration:
listen_address 127.0.0.1
Wir ändern nur die oben genannte Zeile, den Rest belassen wir wie er ist. Da der IMAP-Proxy auf dem gleichen System wie der Mailserver läuft, lassen wir nur lokale Verbindungen zu.
Wenn nun ein Programm/Skript den IMAP-Proxy nutzen soll, gibt man Port 1143 an, anstatt Port 143.
roundcube
Für roundcube brauchen wir zunächst einen vHost. Im Weiteren wird davon ausgegangen, dass roundcube unter https://webmail.domain.tld/ verfügbar ist.
Zunächst muss die neueste roundcube Version von http://roundcube.net/ heruntergeladen und in den vHost entpackt werden, damit es über https://webmail.domain.tld/ verfügbar ist.
Nun legen wir eine Datenbank inkl. Benutzer für roundcube an und importieren das postgres-Schema:
su - postgres psql template1 CREATE USER roundcube WITH PASSWORD 'password'; CREATE DATABASE roundcube WITH OWNER roundcube ENCODING 'UNICODE'; \c - roundcube \i /PFAD/ZU/ROUNDCUBE/SQL/postgres.initial.sql \q
Nun rufen wir im Browser roundcube auf, hängen der URL aber noch "/installer" an und folgen danach den Anweisungen. Nachden wir die Konfigurationsdateien kopiert und am aufgeforderten Ort gespeichert haben, können wir roundcube über den Browser aufrufen und uns mit unserem IMAP-Benutzernamen und -passwort anmelden. Jedoch sollte man damit noch warten, bis postfixadmin-bridge installiert ist, denn dann wird automatisch der vollständige Name aus den postfixadmin-Tabellen übernommen.
postfixadmin-bridge
Zur Installation von rcpfa (= postfixadmin-bridge) wird patch benötigt:
aptitude install patch
Danach entpackt man rcpfa in den roundcube Ordner, wechselt in das neue Unterverzeichnis und führt folgenden Befehl aus:
sh INSTALL.TXTSollten während des Patch-Vorgangs Probleme auftreten, kann man sich die *.rej-Dateien anschauen und die Probleme ggf. händisch lösen. Nach der Installation muss noch die roundcube-Konfiguration angepasst werden (beim Patchen wurden neue Variablen in der Konfiguration hinzugefügt) und danach kann man im Einstellungs-Tab von roundcube Einstellungen aus postfixadmin ändern.
sieve rules
Das sieve-Plugin für roundcube kann man hier herunterladen: http://www.tehinterweb.co.uk/roundcube/#ptsieverules und anschließend mit
patch -ul -d /PFAD/ZU/ROUNDCUBE/ -p1 < /PFAD/ZUM/PATCH
installieren.
Die parallele Installation von rcpfa und sieve rules ist problematisch, da der Patch-Vorgang sehr wahrscheinlich an einer Stelle fehlschlägt und man selbst Hand anlegen muss.
Auch dieses Plugin hat Variablen zur roundcube-Konfiguration hinzugefügt, die angepasst werden müssen, bevor das Plugin benutzt werden kann.
mutt
Um auch über die Konsole auf E-Mails zugreifen kann, installieren wir zusätzlich noch mutt. Manche Leute fragen sich vielleicht, wozu man einen Konsolenmailer braucht, bzw. brauchen könnte. Ein interessanter Punkt ist, dass mutt einen weitaus größeren Funktionsumfang als ein Webmailer bietet und außerdem sieht es auch schick aus, wenn man seine Mails auf der Konsole liest.
Installation:
aptitude install mutt
Eine einfache Konfiguration ("~/.muttrc"):
set folder="imap://localhost" set spoolfile="imap://localhost/INBOX" set imap_authenticators="LOGIN" set imap_user="username" set imap_pass="password" set move=no set editor='vim -c "set t_Co=8" -c "syntax on" -c "/^$" -c "set tw=72" -c "set number"' set header_cache=~/.mutt_header
Die mutt-Konfiguration ist sehr rudimentär und sollte zusätzlich noch an die eigenen Bedürfnisse angepasst werden, z.B. Sent-Ordner definieren, GPG-Schlüssel definieren, ...
Quellen:
http://roundcube.net/
http://nejc.skoberne.net/projects/rcpfa/
http://www.tehinterweb.co.uk/roundcube/#ptsieverules
Der neue Server: Teil 5 postfix
Hier wird erklärt wie man postfix mit postgreSQL-Backend installiert, dovecot inkl. sieve konfiguriert, sowie postfixadmin einrichtet, um postfix bequem über ein Webinterface verwalten zu können.
Datenbank anlegen
Als Erstes legen wir einen Datenbankbenutzer inkl. Datenbank für postfix an:
su - postgres psql template1 CREATE USER postfix WITH PASSWORD 'password'; CREATE DATABASE postfix WITH OWNER postfix ENCODING 'UNICODE'; \q
Verzeichnis anlegen
Später werden alle Mailboxen unter "/var/vmail/DOMAIN/BENUTZERNAME/maildir/" liegen, deshalb erstellen wir nun den Ordner "/var/vmail" und vergeben entsprechende Rechte. Die Einsortierung nach "/var/vmail/DOMAIN/BENUTZERNAME/maildir/" geschieht später über SQL-Queries automatisch.
useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail mkdir /var/vmail chmod 770 /var/vmail/ chown vmail:mail /var/vmail/
postfixadmin
postfixadmin installieren wir direkt aus deren svn-Repository, um mit der aktuellste Version zu arbeiten. Sollte es zu Problemen kommen, kann man über http://postfixadmin.sourceforge.net/ die neueste stabile Version herunterladen.
cd /var/www/ svn co https://postfixadmin.svn.sourceforge.net/svnroot/postfixadmin/trunk postfixadmin-svn ln -s postfixadmin-svn postfixadmin
Danach passt man die Konfigurationsdatei "/var/www/postfixadmin/config.inc.php" an seine Wünsche und Anforderungen an. Nach Ausführen des "setup.php"-Skripts im Browser (und anschließendem Löschen/Umbenennen) ist postfixadmin einsatzbereit.
postfix
postfix installieren:
aptitude install postfix postfix-pgsql postfix-pcre
Während der Installation von postfix wird man gefragt, wie man postfix konfigurieren will, dort wählt man "Internet Site" aus (wobei dies später irrelevant ist, da wir die Konfiguration komplett selbst schreiben).
Datenbankverbindung konfigurieren
Damit postfix mit den Accounts, die in postfixadmin angelegt werden zusammenarbeitet, müssen wir verschiedene SQL-Queries anlegen:
relay-domains.cf:
user = postfix password = xxxxxxx dbname = postfix hosts = localhost query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = true
virtual-alias-maps.cf:
user = postfix password = xxxxxxxx dbname = postfix hosts = localhost query = SELECT goto FROM alias WHERE address='%s' AND active = true
virtual-domain-maps.cf:
user = postfix password = xxxxxxxx dbname = postfix hosts = localhost query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = false AND active = true
virtual-mailbox-limit-maps.cf:
user = postfix password = xxxxxxxx dbname = postfix hosts = localhost query = SELECT quota FROM mailbox WHERE username = '%s' AND active = true
virtual-mailbox-maps.cf:
user = postfix password = xxxxxxxx dbname = postfix hosts = localhost query = SELECT maildir || 'maildir' || '/' FROM mailbox WHERE username='%s' AND active = true
recipient checks
Mit recipient checks kann man E-Mailadressen anhand von regulären Ausdrücken prüfen und dadurch Mails entweder annehmen oder ablehnen. Hier werden invalide E-Mailadressen, bzw. welche mit "seltsamer" Syntax abgewiesen und E-Mails an postmaster, hostmaster, webmaster und abuse immer angenommen.
/etc/postfix/recipient_checks.pcre:
/^\@/ 550 Invalid address format. /[!%\@].*\@/ 550 This server disallows weird address syntax. /^postmaster\@/ OK /^hostmaster\@/ OK /^webmaster\@/ OK /^abuse\@/ OK
mx access
Über diese Datei werden E-Mails von Gegenstellen aus privaten IP-Blöcken, bzw. von Broadcast- und Multicast-Netzen von vorneherein abgewiesen, da diese im Internet prinzipiell nicht geroutet werden und es sich dabei mit extrem hoher Wahrscheinlichkeit um Spam handelt.
/etc/postfix/mx_access:
0.0.0.0/8 REJECT Domain MX in broadcast network 10.0.0.0/8 REJECT Domain MX in RFC 1918 private network 127.0.0.0/8 REJECT Domain MX in loopback network 169.254.0.0/16 REJECT Domain MX in link local network 172.16.0.0/12 REJECT Domain MX in RFC 1918 private network 192.0.2.0/24 REJECT Domain MX in TEST-NET network 192.168.0.0/16 REJECT Domain MX in RFC 1918 private network 224.0.0.0/4 REJECT Domain MX in class D multicast network 240.0.0.0/5 REJECT Domain MX in class E reserved network 248.0.0.0/5 REJECT Domain MX in reserved network
Nun muss daraus noch eine postfix-lookup table erstellt werden:
postmap /etc/postfix/mx_access
main.cf
Nun müssen wir noch postfix konfigurieren und alle Teilkonfigurationen, die wir gerade erstellt haben zusammenfügen. Dies geschieht über die Datei "/etc/postfix/main.cf":
# -------------------- GENERAL PART START -------------------- allow_percent_hack = no biff = no disable_vrfy_command = yes mydestination = $myhostname, $mydomain, localhost mydomain = domain.tld myhostname = mail.domain.tld mynetworks_style = host myorigin = $mydomain #home_mailbox = Maildir/ #mailbox_size_limit = 2147483648 #message_size_limit = 209715200 local_transport = dovecot masquerade_exceptions = root recipient_delimiter = + # -------------------- GENERAL PART END -------------------- # -------------------- VIRTUAL PART START -------------------- virtual_mailbox_base = /var/vmail relay_domains = proxy:pgsql:/etc/postfix/pgsql/relay-domain-maps.cf virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql/virtual-mailbox-maps.cf virtual_mailbox_domains = proxy:pgsql:/etc/postfix/pgsql/virtual-domain-maps.cf virtual_alias_maps = proxy:pgsql:/etc/postfix/pgsql/virtual-alias-maps.cf virtual_minimum_uid = 150 virtual_uid_maps = static:150 virtual_gid_maps = static:8 virtual_transport = dovecot dovecot_destination_recipient_limit = 1 unknown_local_recipient_reject_code = 550 # -------------------- VIRTUAL PART END -------------------- # -------------------- RESTRICTIONS PART START -------------------- smtpd_delay_reject = yes smtpd_helo_required = yes smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_reverse_client_hostname, permit smtpd_data_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_pipelining, permit smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, permit smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, check_recipient_mx_access cidr:/etc/postfix/mx_access, reject_unauth_destination, check_recipient_access pcre:/etc/postfix/recipient_checks.pcre, ### check_policy_service inet:127.0.0.1:12525, permit smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unknown_sender_domain, permit # -------------------- RESTRICTIONS PART END -------------------- # -------------------- SASL PART START -------------------- broken_sasl_auth_clients = yes smtpd_sasl_auth_enable = yes smtpd_sasl2_auth_enable = yes smtpd_sasl_local_domain = smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth # -------------------- SASL PART END -------------------- # -------------------- TLS PART START -------------------- smtpd_use_tls = yes smtpd_tls_security_level = may #smtpd_tls_auth_only = yes smtpd_tls_CAfile = /etc/postfix/ssl/demoCA/cacert.pem smtpd_tls_cert_file = /etc/postfix/ssl/server-crt.pem smtpd_tls_dh1024_param_file = /etc/postfix/ssl/dh_1024.pem smtpd_tls_dh512_param_file = /etc/postfix/ssl/dh_512.pem smtpd_tls_key_file = /etc/postfix/ssl/server-key.pem smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache # -------------------- TLS PART END --------------------
master.cf
Ans Ende der "/etc/postfix/master.cf" anhängen:
# Dovecot LDA dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d ${recipient}
Will man auch smtps (Port 465) zulassen, so entfernt man die Raute-Zeichen vor den untenstehenden Zeilen, damit sie wie folgt aussehen (die Leerzeichen vor der zweiten Zeile sind essentiell):
smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes
smpts kann nützlich sein, wenn Port 25 aus irgend einem Grund gesperrt sein sollte, denn es operiert auf Port 465, welcher seltener gesperrt ist (zumindest in Studentenwohnheimen und Universitäten), zusätzlich bietet es einen höheren Schutz als plaintext-smtp (doch einen geringeren als smtp+tls).
dovecot
Nun folgt die Konfiguration des dovecot E-Mail-Servers. Zunächst wird dovecot über aptitude:
aptitude install dovecot-imapd dovecot-pop3d
Jetzt wird dovecot noch konfiguriert:
/etc/dovecot/dovecot.conf:
## Dovecot configuration file base_dir = /var/run/dovecot/ # imap imaps pop3 pop3s (use imaps and pop3s if configured for SSL) protocols = imaps imap pop3s pop3 managesieve # Uncomment the ssl_listen statements and comment out listen if using SSL protocol imap { listen = *:143 ssl_listen = *:993 } protocol pop3 { listen = *:110 ssl_listen = *:995 } protocol managesieve { listen = *:2000 } log_timestamp = “%Y-%m-%d %H:%M:%S ” syslog_facility = mail # Where the mailboxes are located mail_location = maildir:/var/vmail/%d/%n/maildir mail_access_groups = vmail mail_debug = yes first_valid_uid = 150 last_valid_uid = 150 maildir_copy_with_hardlinks = yes protocol imap { login_executable = /usr/lib/dovecot/imap-login mail_executable = /usr/lib/dovecot/imap imap_max_line_length = 65536 mail_plugins = quota imap_quota imap_client_workarounds = outlook-idle delay-newmail } protocol pop3 { login_executable = /usr/lib/dovecot/pop3-login mail_executable = /usr/lib/dovecot/pop3 pop3_uidl_format = %08Xu%08Xv mail_plugins = quota pop3_client_workarounds = outlook-no-nuls oe-ns-eoh } protocol lda { postmaster_address = postmaster@ibutho.de sendmail_path = /usr/lib/sendmail auth_socket_path = /var/run/dovecot/auth-master mail_plugins = quota cmusieve sieve_global_path = /var/vmail/default.sieve log_path = /var/log/dovecot-deliver.log info_log_path = /var/log/dovecot-deliver.log } protocol managesieve { sieve = /var/vmail/%d/%n/dovecot.sieve sieve_storage = /var/vmail/%d/%n/sieve } auth_verbose = no auth_debug = yes #auth_debug_passwords = yes auth default { mechanisms = plain login passdb sql { args = /etc/dovecot/dovecot-sql.conf } userdb sql { args = /etc/dovecot/dovecot-sql.conf } userdb prefetch { } user = nobody socket listen { master { path = /var/run/dovecot/auth-master mode = 0660 user = vmail group = mail } client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } } dict { } plugin { acl = vfile:/etc/dovecot/acls sieve = /var/vmail/%d/%n/dovecot.sieve } # Uncomment these if using SSL ssl_cert_file = /etc/ssl/certs/ibutho_server.pem ssl_key_file = /etc/ssl/private/ibutho_privatekey.pem ssl_ca_file = /etc/ssl/certs/root.pem ssl_parameters_regenerate = 168 verbose_ssl = no # If you want client certificates, use these lines # ssl_verify_client_cert = yes # ssl_require_client_cert = yes # ssl_username_from_cert = yes
Damit das logging nach "/var/log/dovecot-deliver.log" funktioniert, muss die Datei mit entsprechenden Rechten ausgestattet sein:
touch /var/log/dovecot-deliver.log chmod 640 /var/log/dovecot-deliver.log chown vmail:mail /var/log/dovecot-deliver.log
/etc/dovecot/dovecot-sql.conf:
driver = pgsql connect = host=localhost dbname=postfix user=postfix password=xxxxxxxx default_pass_scheme = MD5 user_query = SELECT '/var/vmail/' || maildir AS home, 'maildir:/var/vmail/' || maildir || 'maildir' AS mail, 150 AS uid, 8 AS gid, 'maildir:storage=' || quota AS quota FROM mailbox WHERE local_part = split_part('%n', '+', 1) AND domain = '%d' AND active = true password_query = SELECT username AS user, password, '/var/vmail/' || maildir AS userdb_home, 'maildir:/var/vmail/' || maildir || 'maildir' AS userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = true
Testen der Konfiguration
Zuerst kann man serverseitig mittels "netstat -tulpen" testen, ob der Server auf allen beabsichtigten Ports lauscht (110, 143, 993, 995, 2000). Danach kann man mittels "telnet SERVER_IP 143", bzw. "telnet SERVER_IP 110" testen, ob man eine Verbindung bekommt. Ist dies der Fall, bietet es sich an auszuprobieren, ob man mit einem Mailprogramm auf das Postfach zugreifen kann (es muss natürlich eins in postfixadmin angelegt sein), bzw. ob man auch Mails empfangen und versenden kann.
Ein weiterer wichtiger Test, den man durchführen sollte, ist, ob der Mailserver als "open relay" missbraucht werden kann (kurz und knapp heißt das, ob der Server möglicherweise eine "Spam-Schleuder" ist). Dies kann man u.a. hier testen: http://www.abuse.net/relay.html. Sollten alle Tests Erfolg haben, hat man einen funktionsfähigen Mailserver.
Quellen:
postfixadmin/DOCUMENTS/POSTFIX_CONF.txt
http://blog.schalanda.name/archives/178-EUserv-vServer-Active-Installation-des-Mailsystems.html
http://codepoets.co.uk/postfixadmin-postgresql-courier-squirrelmail-debian-etch-howto-tutorial
http://wiki.rootforum.de/mailserver/postfix
http://wiki.rootforum.de/mailserver/postfix/postfix-admin
http://forum.rootforum.de/viewtopic.php?f=111&t=46643
http://www.postfix.org/postconf.5.html
http://wiki.dovecot.org/MainConfig
http://wiki.dovecot.org/ManageSieve
http://wiki.dovecot.org/LDA/Sieve
http://wiki.dovecot.org/HowTo/DovecotLDAPostfixAdminMySQL
