====== 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