Instal·larem i configurarem un servidor de correu-e amb certificats SSL, amb accés per Roundcube i amb Spamassassin pels filtres de correu brossa.
Els certificats que s’utilitzen són verificats per Let’s Encrypt (veure entrada).
Recomanacions prèvies:
Configuració del FQDN:
$ sudo nano /etc/hosts
I la configuració:
127.0.0.1 localhost localhost
127.0.1.1 mail.aniolmarti.cat mail
YourIP mail.aniolmarti.cat mail
El fitxer /etc/hostname
, en aquest cas, ha de contenir mail.aniolmarti.cat
.
Instal·lem paquets:
$ sudo apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
Quan ens surti la pantalla de configuració marquem “Internet Site”.
A “System mail name” podem posar el nostre FQDN o el nostre domini (jo opto pel FQDN).
Creació de taules al MySQL
Creem la base de dades servermail
:
# mysqladmin -p create servermail
Entrem amb l’usuari root
:
# mysql -u root -p
Creem un nou usuari per la base de dades:
mysql > GRANT SELECT, UPDATE ON servermail.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'P@ssw0rd';
mysql > FLUSH PRIVILEGES;
Accedim a la DB servermail
:
mysql> USE servermail;
Creem les taules:
mysql> CREATE TABLE `virtual_domains` (`id` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> CREATE TABLE `virtual_users` (`id` INT NOT NULL AUTO_INCREMENT,`domain_id` INT NOT NULL,`password` VARCHAR(106) NOT NULL,`email` VARCHAR(120) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `email` (`email`),FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> CREATE TABLE `virtual_aliases` (`id` INT NOT NULL AUTO_INCREMENT,`domain_id` INT NOT NULL,`source` varchar(100) NOT NULL,`destination` varchar(100) NOT NULL,PRIMARY KEY (`id`),FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Afegim contingut a les taules:
mysql> INSERT INTO `servermail`.`virtual_domains` (`id` ,`name`) VALUES ('1', 'aniolmarti.cat'),('2', 'mail.aniolmarti.cat');
mysql> INSERT INTO `servermail`.`virtual_users` (`id`, `domain_id`, `password` , `email`) VALUES ('1', '1', ENCRYPT('P@ssw0rd'), 'webmaster@aniolmarti.cat');
A la taula “virtual_aliases” de moment no hi posem res, ja que és per fer redireccions. Per afegir un àlies seria:
mysql> INSERT INTO `servermail`.`virtual_aliases` (`id`, `domain_id`, `source`, `destination`) VALUES ('1', '1', 'alias@example.com', 'email1@example.com');
Sortim del MySQL:
mysql> exit
Configuració del Postfix
Fem un backup del fitxer original:
# cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
L’editem:
# nano /etc/postfix/main.cf
Els “TLS parameters” els deixem així:
# TLS parameters
# Incoming
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.aniolmarti.cat/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.aniolmarti.cat/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtpd_tls_mandatory_ciphers = high
# Outgoing
smtp_tls_cert_file=/etc/letsencrypt/live/mail.aniolmarti.cat/fullchain.pem
smtp_tls_key_file=/etc/letsencrypt/live/mail.aniolmarti.cat/privkey.pem
smtp_use_tls = yes
smtp_tls_security_level = may
smtp_tls_mandatory_ciphers = high
# SASL Authentication
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Canviem el paràmetre “mysdestination” a “localhost” i “myhostname” al nostre FQDN:
mydestination = localhost
myhostname = mail.aniolmarti.cat
Afegim les línies:
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Preparem aquests 3 fitxers per realitzar la connexió amb el MySQL:
# nano /etc/postfix/mysql-virtual-mailbox-domains.cf
Ha de quedar:
user = usermail
password = P@ssw0rd
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'
El segon:
# nano /etc/postfix/mysql-virtual-mailbox-maps.cf
Que quedi:
user = usermail
password = P@ssw0rd
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'
I l’últim:
# nano /etc/postfix/mysql-virtual-alias-maps.cf
I que quedi:
user = usermail
password = P@ssw0rd
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Reiniciem el Postfix:
# /etc/init.d/postfix restart
Comprovem que trobi el nostre domini (correcte si retorna 1):
(L’últim en lloc d’1 hauria de retornar el correu que és redirigit).
# postmap -q aleation.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
# postmap -q webmaster@aleation.net mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
# postmap -q alias@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Habilitar el port 465 per la connexió segura:
# nano /etc/postfix/master.cf
Busquem la línia addient i ho deixem així:
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
Busquem la línia “smtps inet n – n – – smtpd” i ho modifiquem:
“465 inet n - n - - smtpd”
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
Reïniciem el postfix:
# /etc/init.d/postfix restart
Configuració del Dovecot
Fem un backup dels fitxers:
# cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.bak
# cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.bak
# cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.bak
# cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.bak
# cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.bak
# cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.bak
Editem el “dovecot.conf”:
# nano /etc/dovecot/dovecot.conf
Revisem que aquesta línia no estigui comentada:
!include conf.d/*.conf
Habilitem IMAP:
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp
Editem un altre fitxer:
# nano /etc/dovecot/conf.d/10-mail.conf
Canviem alguns paràmetres:
mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = mail
Establim els permisos i les carpetes per cada domini:
# mkdir -p /var/mail/vhosts/aleation.net
# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /var/mail
# chown -R vmail:vmail /var/mail
# chmod -R 770 /var/mail
Editem el fitxer “10-auth.conf”:
# nano /etc/dovecot/conf.d/10-auth.conf
Descomentem:
disable_plaintext_auth = yes
!include auth-sql.conf.ext
Modifiquem:
auth_mechanisms = plain login
Comentem:
#!include auth-system.conf.ext
Configurem la connexió a la BDD:
# nano /etc/dovecot/conf.d/auth-sql.conf.ext
Ha de quedar:
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
També modifiquem:
# nano /etc/dovecot/dovecot-sql.conf.ext
Descomentem i modifiquem:
driver = mysql
connect = host=127.0.0.1 dbname=servermail user=usermail password=P@ssw0rd
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
Editem permisos:
# chown -R vmail:dovecot /etc/dovecot
# chmod -R o-rwx /etc/dovecot
Editem el fitxer “10-master.conf”:
# nano /etc/dovecot/conf.d/10-master.conf
Notem els canvis que s’hi fan:
##Uncomment inet_listener_imap and modify to port 0
service imap-login {
inet_listener imap {
port = 0
}
#Create LMTP socket and this configurations
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
#inet_listener lmtp {
# Avoid making LMTP visible for the entire internet
#address =
#port =
#}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
#group =
}
#unix_listener /var/spool/postfix/private/auth {
# mode = 0666
#}
user = dovecot
}
service auth-worker {
# Auth worker process is run as root by default, so that it can access
# /etc/shadow. If this isn't necessary, the user should be changed to
# $default_internal_user.
user = vmail
}
Editem el fitxer “10-ssl.conf”:
# nano /etc/dovecot/conf.d/10-ssl.conf
Modifiquem els paràmetres:
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.ltec.cat/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.ltec.cat/privkey.pem
Reiniciem el Dovecot:
# /etc/init.d/dovecot restart
Roundcube
Baixem el Roundcube i el descomprimim:
$ wget https://github.com/roundcube/roundcubemail/releases/download/1.2.2/roundcubemail-1.2.2-complete.tar.gz
$ tar -xvzf roundcubemail-1.2.2-complete.tar.gz
# mv roundcubemail-1.2.2 /var/www/roundcube
# chown -R www-data:www-data /var/www/roundcube
Creem la base de dades:
# mysql -u root -p
mysql> CREATE DATABASE roundcube;
mysql> CREATE USER 'roundcube'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON roundcube.* TO 'roundcube'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> exit
Instal·lem paquets:
# apt-get install php-pear php5-intl php5-mcrypt && sudo php5enmod intl mcrypt
Activem mòduls:
# a2enmod deflate expires headers rewrite ssl
Instal·lem paquets PHP PEAR:
# pear install Auth_SASL Net_SMTP Net_IDNA2-0.1.1 Mail_mime Mail_mimeDecode
Creem el site:
# nano /etc/apache2/sites-available/mail.exemple.com.conf
Amb les nostres dades ha de quedar així:
<VirtualHost *:80>
ServerAdmin correu@exemple.com
ServerName mail.exemple.com
ServerAlias mail.exemple.com
DocumentRoot /var/www/roundcube
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =mail.exemple.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</VirtualHost>
També creem el site /etc/apache2/sites-available/mail.exemple.com-le-ssl.conf
:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin correu@exemple.com
ServerName mail.exemple.com
ServerAlias mail.exemple.com
DocumentRoot /var/www/roundcube
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live/exemple.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/exemple.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Afegim el fus horari a /etc/php5/apache2/php.ini
:
date.timezone = Europe/Berlin
Reiniciem l’Apache:
# service apache2 restart
Per configurar el Roundcube només cal accedir a: https://mail.example.com/installer
Un cop configurat cal eliminar el directori de l’instal·lador:
# rm -r /var/www/roundcube/installer
Plugin “password”
Activem el plugin:
# nano /var/www/roundcube/config/config.inc.php
Busquem la línia:
$config['plugins'] = array();
La modifiquem:
$config['plugins'] = array(‘password’);
Configurem el plugin:
# cp /var/www/roundcube/plugins/password/config.inc.php.dist /var/www/roundcube/plugins/password/config.inc.php
# nano /var/www/roundcube/plugins/password/config.inc.php
Busquem i modifiquem les línies:
$config['password_driver'] = 'sql';
$config['password_confirm_current'] = true;
$config['password_minimum_length'] = 6;
$config['password_require_nonalpha'] = false;
$config['password_log'] = false;
$config['password_login_exceptions'] = null;
$config['password_hosts'] = array('localhost');
$config['password_force_save'] = false;
$config['password_algorithm'] = 'sha512-crypt';
// SQL Driver options
$config['password_db_dsn'] = 'mysql://user:pass@localhost/servermail';
$config['password_query'] = 'UPDATE virtual_users SET password=ENCRYPT(%p) WHERE email=%u LIMIT 1';
$config['password_crypt_hash'] = 'sha512';
Desactivar múltiples identitats
Per defecte Roundcube et permet crear identitats amb el correu-e que tu vulguis i el nom que tu vulguis. Per canviar-ho cal editar la configuració.
Editem el fitxer /var/www/roundcube/config/config.inc.php
:
// Set identities access level:
// 0 - many identities with possibility to edit all params
// 1 - many identities with possibility to edit all params but not email address
// 2 - one identity with possibility to edit all params
// 3 - one identity with possibility to edit all params but not email address
// 4 - one identity with possibility to edit only signature
$config['identities_level'] = 3;
Spamassassin
Instal·lem:
# apt-get install spamc spamassassin
Configurem els permisos:
# groupadd -g 5555 spamd
# useradd -u 5555 -g spamd -s /sbin/nologin -d /usr/local/spamassassin spamd
# mkdir -p /usr/local/spamassassin/log
# chown spamd:spamd -R /usr/local/spamassassin
Activem l’Spamassassin canviant ENABLED=0
per ENABLED=1
a /etc/default/spamassassin
.
Configurem l’Spamassassin editant /etc/spamassassin/local.cf
:
rewrite_header Subject ***** SPAM _SCORE_ *****
report_safe 0
required_score 5.0
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1
skip_rbl_checks 0
use_razor2 0
use_dcc 0
use_pyzor 0
Configurem el Postfix editant /etc/postfix/master.cf
:
smtp inet n - - - - smtpd
-o content_filter=spamassassin
spamassassin unix - n n - - pipe
user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
Configurar registre SPF
Aquest apartat s’enfoca a configurar el registre SPF (de l’anglés Sender Policy Framework) del domini. Fer-ho és una manera d’evitar spam i que els teus correus-e no s’intepretin com a tal.
L’SPF li permet a l’administrador especificar quins servidors poden enviar correu en nom d’aquell domini. Per fer-ho cal crear un nou registre TXT a la zona DNS del domini.
Jo utilitzo:
v=spf1 mx a ip4:A.B.C.D ~all
Si voleu més informació sobre SPF podeu visitar aquesta entrada de DigitalOcean.
I fins aquí l’entrada.
Configurar DKIM
Els apunts per configurar DKIM els podeu trobar en aquesta entrada.