Servidor de correu-e LAMP + Postfix + Dovecot + Roundcube

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.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.