====== Mailserver ====== * postfix * dovecot - IMAP * roundcube -> https://mail.pinneberg.freifunk.net/ * baikal - CalDAV, CardDAV * sieve - Filter * spamassassin - SPAM Abweht * postgrey - Greylisting * policyd-weight - Gewichtete Regeln, z.B. für Blacklists Für Tips siehe auch: https://www.debinux.de/2015/05/mailserver-from-scratch-debian-8/, zum Testen eignet sich auch das Programm ''swaks'' sehr gut. ===== Mailkonfiguration auf den Gateways ===== .ffpi # /etc/aliases mailer-daemon: postmaster postmaster: root nobody: root hostmaster: root usenet: root news: root webmaster: root www: root ftp: root abuse: root noc: root security: root root: hostmaster@pinneberg.freifunk.net Die folgende Konfiguration gilt nicht für gate04, da dieser der Haupt-Mailserver ist und natürlich eine erheblich komplexere Konfiguration erfordert. Im folgenden sind nur die anzupassenden Zeilen der Konfiguation aufgeführt: myhostname = .ffpi mydestination = .pinneberg.freifunk.net, .ffpi, localhost.ffpi, localhost relayhost = gate04.ffpi ===== Installation des Hauptservers ===== Um eine leichte Benutzerkonfiguration über ein Web-Frontend zu ermöglichen wird das Paket //postfixadmin// verwendet. Dieses speichert die notwendigen Datein in einer MySQL-Datenbank. Die Datenbank bekommt später noch Zusatzfunktionen, sie wird auch von Dovecot verwendet. TODO * Es wird eine MySQL-Datenbank benötigt * Datenbank ''postfixadmin'' * Sonstiges * SPF * DKIM (siehe https://kofler.info/dkim-konfiguration-fuer-postfix/) ==== Postfix ==== Wir verwenden eine Konfiguration mit virtuellen Benutzern. groupadd -g 5000 vmail useradd -m -d /var/vmail -s /bin/false -u 5000 -g vmail vmail chmod 2770 /var/vmail/ # Link the mailbox uid and gid to postfix. virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 # Set the base address for all virtual mailboxes virtual_mailbox_base = /var/vmail # Handing off local delivery to Dovecot's LMTP, and telling it where to store mail transport_maps = hash:/etc/postfix/transport # Virtual domains, users, and aliases virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual-alias-maps.cf, hash:/var/lib/mailman/data/virtual-mailman # Handle SMTP authentication using Dovecot smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = [...] permit_sasl_authenticated, [...] Die Zustellung wird in einer eigenen Datei konfiguriert: # Teil 1: Domains pinneberg.freifunk.net lmtp:unix:private/dovecot-lmtp freifunk-pinneberg.de lmtp:unix:private/dovecot-lmtp ffpi lmtp:unix:private/dovecot-lmtp # Teil 2: Einzelne Benutzer service@pinneberg.freifunk.net osticket:osTicket Support helpdesk@pinneberg.freifunk.net osticket:osTicket Helpdesk noc@pinneberg.freifunk.net osticket:osTicket NOC info@pinneberg.freifunk.net osticket:osticket keys@freifunk-pinneberg.de osticket:osticket Zum eleganten Verwalten der Queue wird ''pfqueue'' verwendet. Folgende Konfigurationsdatei ist manuell anzulegen: # /etc/pfqueue.conf # backend_name=postfix2 ==== Postfixadmin ==== Postfixadmin ist ein Web-Frontend für die Benutzer- bzw. die Adreßverwaltung: https://mail.pinneberg.freifunk.net/postfixadmin/ Es wird das gleichnamige Debian-Paket installiert. Als Benutzer wird //postfix// gewählt, die Datenbank nennen wir //postfixadmin//. Konfiguration über * https://mail.pinneberg.freifunk.net/postfixadmin/setup.php * Datenbankkonfiguration in der Datei ''dbconfig.inc.php'' * Programmkonfiguration: ''/etc/postfixadmin/config.inc.php'' ist die Vorlage, geänderte Optionen werden in die neu zu erstellende Daten ''config.local.php'' eingetragen: * ''%%$CONF['encrypt']%%'' muß korrekt eingestellt werden. Im Zusammenspiel mit Dovecot sollte ''md5crypt'' funktionieren, als modernere Variante mit Dovecot-INtegration bietet sich ''dovecot:SHA256-CRYPT'' an. * ''%%$CONF['welcome_text']%%'' sollte auf eine freundliche Willkommensmeldung geändert werden Prüfe Datenbankeinträge: postalias -q mustermann@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf Wenn die Adresse gefunden wurde, wird ''1'' zurückgeliefert, ansonsten nichts. === Anpassungen / Customizing === Änderungen können ab Version 3 vorgenommen werden, dabei sind einige Regeln zu beachten: * Alle zusätzlichen Objekte mit dem Prefix ''x_'' kennzeichnen * In Zusatztabellen bitte die Felder ''created'', ''modified'' und ''active'' verwenden * Integration über ''*_struct_hook()'', in ''config.inc.php'' ist ein Beispiel dazu, Aktivierung dann mit ''$CONF[*_struct_hook]'' ==== SPAM-Abwehr ==== aptitude install spamassassin spamc postgrey policyd-weight TODO * **spamassassin** * Einbau als Content-Filter, Spamassassin läuft als Daemon im Hintergrund und wird bei Bedarf von ''spamc'' angesprochen. In dieser Konfiguration wird **kein** Amavis benötigt. smtp inet n - - - - smtpd -o content_filter=spamassassin [...] spamassassin unix - n n - - pipe user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} * aktivieren über ''/etc/default/spamassassin'' * **postgrey** * ''/etc/default/postgrey'' * mit Socket: ''%%POSTGREY_OPTS="--unix=/var/spool/postfix/postgrey/socket"%%'' * mit TCP: ''%%POSTGREY_OPTS="--inet=10023"%%'' * Frage: ist ein Socket besser, oder eine IP-Adresse? * Antwort: Der Socket hat viel weniger Overhead. Aber Zugriffsrechte beachten. * Falls mit Socket, Verzeichnis anlegen, falls noch nicht existent. TODO Klären, welche Berechtigungen für das Verzeichnis und den Socket notwendig sind. Im Standard sind die Einstellungen des Sockets ''srw-rw-rw-'' mkdir /var/spool/postfix/postgrey chown postfix.postgrey /var/spool/postfix/postgrey chmod 770 /var/spool/postfix/postgrey * postgrey neu starten, damit der Socket aktiviert wird * Zeile in ''/etc/postfix/main.cf'' unter ''smtpd_recipient_restrictions'' einfügen * mit Socket: ''check_policy_service unix:postgrey/socket'' * mit TCP: ''check_policy_service inet:127.0.0.1:10023'' * **policyd-weight** Trainieren einer Mail als SPAM: su -c "sa-learn --spam /tmp/spammail.eml" debian-spamd ==== Dovecot ==== * IMAP-Server * Benutzerverwaltung auch für Postfix * Filterregeln mit Sieve aptitude install dovecot-imapd dovecot-lmtp dovecot-mysql dovecot-pop3d \ dovecot-sieve dovecot-managesieved CREATE USER 'dovecot'@'localhost' IDENTIFIED BY 'DOVECOTPASS'; GRANT SELECT ON postfixadmin.mailbox TO 'dovecot'@'localhost'; GRANT SELECT,INSERT,UPDATE,DELETE ON postfixadmin.quota2 TO 'dovecot'@'localhost'; Im folgenden sind nur die Änderungen an den Dateien dokumentiert. Die Aufstellung ist momentan nicht endgültig überprüft und vermutlich auch noch unvollständig. Mit dem Plugin ''last_login'' kann der letzte Anmeldezeitpunkt gespeichert werden. Zu beachten, daß der Zugriff über das Dict-Modul läuft, welches auf Datenbanktabellen INSERT- und UPDATE-berechtigungen benötigt alter table mailbox add column x_last_login int(11) default NULL; grant insert (username, x_last_login), update (username, x_last_login) on postfixadmin.mailbox to 'dovecot'@'localhost'; ++++ Dovecot Konfigurationdsdateien | disable_plaintext_auth = yes auth_mechanisms = plain login !include auth-sql.conf.ext mail_location = maildir:/var/vmail/%u mail_uid = vmail mail_gid = vmail mail_privileged_group = mail mail_plugins = $mail_plugins quota service imap-login { inet_listener imap { port = 143 address = 127.0.0.1 } inet_listener imaps { port = 993 ssl = yes } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0666 user = postfix } } service auth { unix_listener auth-userdb { mode = 0600 user = vmail } # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } } service auth-worker { user = vmail } service dict { unix_listener dict { mode = 0600 user = vmail } } ssl = yes ssl_cert = -cert.pem ssl_key = .key ssl_dh_parameters_length = 2048 protocol lda { mail_plugins = $mail_plugins sieve } namespace inbox { mailbox Junk { auto = subscribe special_use = \Junk } mailbox Trash { auto = subscribe special_use = \Trash } } protocol imap { mail_plugins = $mail_plugins imap_quota } protocol lmtp { mail_plugins = $mail_plugins sieve } protocols = $protocols sieve service managesieve-login { inet_listener sieve { port = 4190 } plugin { quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=80%% quota-warning 80 %u } service quota-warning { executable = script /usr/local/bin/quota-warning.sh user = vmail unix_listener quota-warning { user = vmail } } plugin { quota = dict:User quota::proxy::quota } driver = mysql connect = host=localhost dbname=postfixadmin user=dovecot password=xxxxxxxx default_pass_scheme = MD5-CRYPT password_query = \ SELECT username, domain, password \ FROM mailbox WHERE username = '%u' AND active = 1 user_query = \ SELECT username AS user, \ 'vmail' AS uid, \ 'vmail' AS gid, \ '/var/vmail/%u' AS home, \ CONCAT('*:bytes=', CAST(quota AS CHAR)) AS quota_rule \ FROM mailbox WHERE username = '%u' AND active = 1 map { pattern = priv/quota/storage table = quota2 username_field = username value_field = bytes } map { pattern = priv/quota/messages table = quota2 username_field = username value_field = messages } ++++ ==== Protokollierung ==== Über ''local5'' in das syslog: log_path = syslog syslog_facility = local5 auth_verbose = yes auth_verbose_passwords = no Local5 facility in spezielle Dateien umleiten *.*;auth,authpriv,local5.none -/var/log/syslog # Dovecot local5.* -/var/log/dovecot.log local5.warning;local5.error;local5.crit -/var/log/dovecot-errors.log Logfile rotieren (vermutlich noch optimierungsfähig /var/log/dovecot*.log { missingok notifempty compress delaycompress sharedscripts postrotate doveadm log reopen endscript } ==== Tests ==== Prüfe, ob ein Benutzer existiert doveadm auth lookup mustermann@example.com doveadm auth lookup -x service=imap mustermann@example.com Prüfe, ob die Kennwortabfrage mit der MySQL-Datenbank funktioniert: doveadm auth test mustermann@example.com Einen Passwort-Hash kann man erzeugen mit dovecot pw -s MD5-CRYPT Informationen aus der Benutzerdatenbank abfragen doveadm user mustermann@example.com ==== Roundcube ==== * Homepage: https://roundcube.net/ * Web-Frontend * Nützliche Pakete apt-get install php5-sqlite php5-ldap * Paket herunterladen wget https://github.com/roundcube/roundcubemail/releases/download/1.2.3/roundcubemail-1.2.3-complete.tar.gz * Datenbank einrichten CREATE DATABASE roundcubemail; GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY '********'; * Installer-Verzeichnis aufrufen * Berechtigungen des Gesantsystems einstellen * Konfigurationsdateien im ''config''-Verzeichnis nicht für alle lesbar. Da stehen Zugangsdaten für die Datenbank drin! * Plugins aktivieren: Password, Managesieve * Optional Kalender * Konfiguration des virtuellen Servers anpassen AllowOverride All * Einstellungen in der Konfigurationsdatei ''config.inc.php'' vornehmen * ''$config['smtp_log'] = false;'', Datensparsamkeit, ''logs/sendmail'' soll nicht geschrieben werden === Plugin:password === Der Roundcube-Benutzer benötigt die Berechtigung die Mailboxtabelle zu lesen und das Password-Feld zu schreiben: GRANT SELECT, UPDATE (password) ON `postfixadmin`.`mailbox` TO 'roundcube'@'localhost' Das Plugin wird aktiviert in der zentralen Konfigurationsdatei ''config.inc.php''. in das Array ''$config['plugins']'' wird das Plugin mit seinem Namen eingetragen. Im Plugin-Verzeichnis wird ebenfalls eine ''config.inc.php'' angelegt. Dazu wird die ''.dist''-Datei kopiert. === Plugin:managesieve === Kopieren die Vorlage der Konfigurationsdatei ''config.inc.php.dist'' nach ''config.inc.php''. $config['managesieve_port'] = 4109; $config['managesieve_host'] = 'localhost'; TODO Quotas, auch ein Dovecot-Thema === Upgrade === Backup des Programmverzeichnisses tar cjf /var/backups/roundcube_2016-12-09.tar.bz2 -C /var/www/vhosts mail.pinneberg.freifunk.net Herunterladen der neuen Version cd /tmp wget https://github.com/roundcube/roundcubemail/releases/download/1.2.3/roundcubemail-1.2.3-complete.tar.gz tar xzf roundcubemail-1.2.3-complete.tar.gz cd roundcubemail-1.2.3 bin/installto.sh /var/www/vhosts/mail.pinneberg.freifunk.net Nach der dem Update sind Aufräumarbeiten notwending * Berechtigungen korrigieren * Benutzer einstellen: ''root.www-data'', ''www-data'' hat auch nur Leserechte, bis auf die Verzeichnisse ''temp'' und ''log'' chown -R root.www-data /var/www/vhosts/mail.pinneberg.freifunk.net * Dateien im config-Verzeichnis ==== Baikal ==== TODO * Zentraler Speicher für Adressen und Kalender * soll unter ''baikal.pinneberg.freifunk.net'' laufen * ''php-dom'' (''php7.0-xml'') benötigt