Un serveur de mail complet et moderne (part. 2)

Rédigé par citizenz - - 2 commentaires

Il y a quelques temps, je vous proposais un tuto pour mettre en place un serveur de mail avec la plupart des fonctionnalités classiques (webmail, antispam avec Rpsamd, etc.)
Suite à de nombreuses demandes, questions, etc., je vous propose dans cette partie 2 de configurer votre zone DNS de manière plus précise afin d'éviter certains désagréments dus à une mauvaise configuration (Dmarc, SPF, DKIM, ...)

Lire la suite de Un serveur de mail complet et moderne (part. 2)

Un serveur de mail complet et moderne

Rédigé par citizenz - - 70 commentaires

Système de base : Ubuntu server 18.04

Hébergeur : Hetzner VPS CX11 (1 vCPU - 2 GB RAM - 20 GB SSD - 2.99 €/mois)

Composants du serveur de mail :
  • Postfix (SMTP)
  • Dovecot (IMAP)
  • Rspamd (Antispam)
  • Rainloop (Webmail)
  • Dkim
  • Filtres Sieve

0 - Changez le mot de passe root, créez un user système avec accès sudo. Passez en root.

1 - On met à jour
# apt-get update && apt-get upgrade

2 - On vérifie que sendmail n'est pas installé par défaut :

# service sendmail stop; update-rc.d -f sendmail remove
Si vous recevez l'erreur suivante ignorez-là :
"Failed to stop sendmail.service: Unit sendmail.service not loaded"
Ca signifie que tout est bon :)

3 - On crée un groupe et un user vmail :
# groupadd -g 5000 vmail
# useradd -u 5000 -g vmail -s /usr/sbin/nologin -d /var/mail/vmail -m vmail

4- On installe quelques appli utiles + nginx, php, mysql (Mariadb) :
# apt install mc screen htop vim-nox curl git unzip ntp ntpdate nginx mariadb-server openssl /
php7.2-fpm php7.2 php7.2-common php7.2-gd php7.2-mysql php7.2-imap php7.2-cli php7.2-cgi /
php-pear mcrypt imagemagick libruby php7.2-curl php7.2-intl php7.2-pspell php7.2-recode /
php7.2-sqlite3 php7.2-tidy php7.2-xmlrpc php7.2-xsl memcached php-memcache php-imagick /
php-gettext php7.2-zip php7.2-mbstring

####### MYSQL #######

5 - On sécurise Mysql en ajoutant un mot de passe root :
# mysql_secure_installation
  • Enter current password for root (enter for none): ENTREE
  • Set root password? [Y/n] Tapez Y
  • New password: Entrez le mot de passe pour le user root
  • Re-enter new password: mot de passe de nouveau...
  • Remove anonymous users? [Y/n] Tapez Y
  • Disallow root login remotely? [Y/n] Tapez Y
  • Remove test database and access to it? [Y/n] Tapez Y
  • Reload privilege tables now? [Y/n] Tapez Y

####### POSTFIXADMIN #######

6 - On télécharge Postfixadmin (la dernière version au 09/10/19 est la 3.2) :
# wget https://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz
# tar xzf postfixadmin-3.2.tar.gz

7 - On déplace postfixadmin en /var/www/postfixadmin et on crée le répertoire templates_c :

# mv postfixadmin-3.2/ /var/www/postfixadmin
# rm -f postfixadmin-3.2.tar.gz
# mkdir /var/www/postfixadmin/templates_c

8 - On change les droits :
# chown -R www-data: /var/www/postfixadmin

[* : A partir de maintenant, vous penserez à remplacer "your_secret_password" par votre VRAI mot de passe dans tous les fichiers d'exemple !]

9 - On crée la base mysql pour postfixadmin :

# mysql -u root -p
CREATE DATABASE postfixadmin;
GRANT ALL ON postfixadmin.* TO 'postfixadmin'@'localhost' IDENTIFIED BY 'your_secret_password';
FLUSH PRIVILEGES;
exit

10 - On crée /var/www/postfixadmin/config.local.php :
<?php
$CONF['configured'] = true;

$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'your_secret_password';
$CONF['database_name'] = 'postfixadmin';

$CONF['default_aliases'] = array (
'abuse'      => 'abuse@example.com',
'hostmaster' => 'hostmaster@example.com',
'postmaster' => 'postmaster@example.com',
'webmaster'  => 'webmaster@example.com'
);
$CONF['fetchmail'] = 'NO';
$CONF['show_footer_text'] = 'NO';
$CONF['quota'] = 'YES';
$CONF['domain_quota'] = 'YES';
$CONF['quota_multiplier'] = '1024000';
$CONF['used_quotas'] = 'YES';
$CONF['new_quota_table'] = 'YES';
$CONF['aliases'] = '0';
$CONF['mailboxes'] = '0';
$CONF['maxquota'] = '0';
$CONF['domain_quota_default'] = '0';
?>

11 - On installe le schéma de la base en lançant le script suivant :
sudo -u www-data php /var/www/postfixadmin/public/upgrade.php

12 - Puis on crée le superadmin Postfixadmin :
sudo bash /var/www/postfixadmin/scripts/postfixadmin-cli admin add
[* Veillez à changer your_secret_password et example.com !]
Welcome to Postfixadmin-CLI v0.2
---------------------------------------------------------------

Admin: 
> postmaster@example.com

Password: 
> your_secret_password

Password (again): 
> your_secret_password

Super admin:
(Super admins have access to all domains, can manage domains and admin accounts.) (y/n)
> y

Domain: 
> example.com

Active: (y/n)
> y

The admin postmaster@example.com has been added!

13 - On installe Letsencrypt (certbot) :
# apt install software-properties-common lsb-release
# add-apt-repository ppa:certbot/certbot
# apt update
# apt install python-certbot-nginx

14 - On crée le fichier Nginx dans /etc/nginx/conf.d/mail.example.com.conf (à adapter avec votre vrai nom de domaine)
server {   
   listen 80;  
   listen [::]:80;  
   server_name mail.example.com;  
   root /var/www/postfixadmin/public;  
   index index.php;  
   location / {     
      try_files $uri $uri/ /index.php;  
   }  
   location ~* .php$ {       
      fastcgi_split_path_info ^(.+?.php)(/.*)$;       
      if (!-f $document_root$fastcgi_script_name) {return 404;}       
      fastcgi_pass  unix:/run/php/php7.2-fpm.sock;       
      fastcgi_index index.php;       
      include fastcgi_params;       
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
   }
}

15 - On va créer le certificat Letsencrypt et laisser certbot configurer le fichier Nginx pour nous :

# certbot --nginx -d mail.example.com
On renseigne premièrement l'adresse e-mail à laquelle les alerte de renouvellement de certificat seront envoyées.
Puis on accepte les "Termes du service" : A
Je réponds ensuite NON (n) pour partager mon adresse e-mail.
Enfin, je choisis la réponse 2 (Redirect) afin que toutes les requêtes soient redirigées en HTTPS automatiquement.

16 - Ouvrez votre fichier /etc/nginx/conf.d/mail.example.com.conf et ajoutez http2 comme ceci :
../..
    listen [::]:443 ssl http2; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
../..
 ... et on redémarre Nginx :
# service nginx restart
 

####### POSTFIX & DOVECOT #######

17 - Les paquets Dovecot chez Ubuntu ne sont pas à jour.
On va donc installer Dovecot depuis le répertoire Dovecot Community afin de tirer avantages, notamment, du module imap_sieve :
# wget -O- https://repo.dovecot.org/DOVECOT-REPO-GPG | sudo apt-key add -
# echo "deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/$(lsb_release -cs) $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/dovecot.list
# apt update
# debconf-set-selections <<< "postfix postfix/mailname string $(hostname -f)"
# debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'"
# apt install postfix postfix-mysql dovecot-imapd dovecot-lmtpd dovecot-pop3d dovecot-mysql

18 - Configuration de Postfix
# mkdir -p /etc/postfix/sql
[* : vous veillerez à changer P4ssvv0rD par votre VRAI mot de passe]
# nano /etc/postfix/sql/mysql_virtual_domains_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
 
# nano /etc/postfix/sql/mysql_virtual_alias_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
 
# nano /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
 
# nano /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query  = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
 
# nano /etc/postfix/sql/mysql_virtual_mailbox_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
 
# nano /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'

Puis on complète la configuration du fichier main.cf de Postfix :
# postconf -e "virtual_mailbox_domains = mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf"
# postconf -e "virtual_alias_maps = mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf"
# postconf -e "virtual_mailbox_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf"

# postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
# postconf -e 'smtp_tls_security_level = may'
# postconf -e 'smtpd_tls_security_level = may'
# postconf -e 'smtp_tls_note_starttls_offer = yes'
# postconf -e 'smtpd_tls_loglevel = 1'
# postconf -e 'smtpd_tls_received_header = yes'
 
# postconf -e 'smtpd_tls_cert_file = /etc/letsencrypt/live/mail.exampple.com/fullchain.pem'
# postconf -e 'smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem'
 
# postconf -e 'smtpd_sasl_type = dovecot'
# postconf -e 'smtpd_sasl_path = private/auth'
# postconf -e 'smtpd_sasl_local_domain ='
# postconf -e 'smtpd_sasl_security_options = noanonymous'
# postconf -e 'broken_sasl_auth_clients = yes'
# postconf -e 'smtpd_sasl_auth_enable = yes'
# postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'

On configure le fichier master.cf de Postfix afin qu'il ressemble à ça :
submission inet n       -       y       -       -       smtpd 
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

smtps     inet  n       -       y       -       -       smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

... et on redémarre Postfix :
# service postfix restart

####### DOVECOT CONFIG #######

19 - On va configurer Dovecot :
[* : veillez à bien changer "your_secret_password" par votre VRAI mot de passe]
# nano /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=postfixadmin user=postfixadmin password=your_secret_password
default_pass_scheme = MD5-CRYPT
iterate_query = SELECT username AS user FROM mailbox
user_query = SELECT CONCAT('/var/mail/vmail/',maildir) AS home,   CONCAT('maildir:/var/mail/vmail/',maildir) AS mail,   5000 AS uid, 5000 AS gid, CONCAT('*:bytes=',quota) AS quota_rule   FROM mailbox WHERE username = '%u' AND active = 1
password_query = SELECT username AS user,password FROM mailbox   WHERE username = '%u' AND active='1'
 
# nano /etc/dovecot/conf.d/10-mail.conf
...
mail_location = maildir:/var/mail/vmail/%d/%n
...
mail_uid = vmail
mail_gid = vmail

...
first_valid_uid = 5000
last_valid_uid = 5000

...
mail_privileged_group = mail
...
mail_plugins = quota
...
 
# nano /etc/dovecot/conf.d/10-auth.conf
...
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
...
#!include auth-system.conf.ext
!include auth-sql.conf.ext
...

# nano /etc/dovecot/conf.d/10-master.conf
...
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
...
}
...
service auth {
  ...
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }
  ...
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  ...
}
...

service auth-worker {
  user = vmail
}

...

service dict {
  unix_listener dict {
    mode = 0660
    user = vmail
    group = vmail
  }
}
...

# nano /etc/dovecot/conf.d/10-ssl.conf
...
ssl = yes
...
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_dh = </etc/letsencrypt/ssl-dhparams.pem
...
ssl_cipher_list = EECDH+AES:EDH+AES+aRSA
...
ssl_prefer_server_ciphers = yes
...
 
# nano /etc/dovecot/conf.d/20-imap.conf
...
protocol imap {
...

  mail_plugins = $mail_plugins imap_quota
  ...
}
...

 # nano /etc/dovecot/conf.d/20-lmtp.conf
...
protocol imap {
  postmaster_address = postmaster@example.com
  mail_plugins = $mail_plugins
}
...

# nano /etc/dovecot/conf.d/15-mailboxes.conf
...
mailbox Drafts {
  special_use = Drafts
}
mailbox Spam {
  special_use = Junk
  auto = subscribe
}
mailbox Junk {
  special_use = Junk
}
...
 
# nano /etc/dovecot/conf.d/90-quota.conf
plugin {
quota = dict:User quota::proxy::sqlquota
quota_rule = *:storage=5GB
quota_rule2 = Trash:storage=+100M
quota_grace = 10%%
quota_exceeded_message = Quota exceeded, please contact your system administrator.
}

plugin {
quota_warning = storage=100%% quota-warning 100 %u
quota_warning2 = storage=95%% quota-warning 95 %u
quota_warning3 = storage=90%% quota-warning 90 %u
quota_warning4 = storage=85%% quota-warning 85 %u
}

service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = vmail

unix_listener quota-warning {
  group = vmail
  mode = 0660
  user = vmail
}
}

dict {
sqlquota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
 [* : veillez à bien changer your_secret_password par votre VRAI mot de passe !]
# nano /etc/dovecot/dovecot-dict-sql.conf.ext
...
connect = host=127.0.0.1 dbname=postfixadmin user=postfixadmin password=your_secret_password
...
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
}
...
# map {
#   pattern = shared/expire/$user/$mailbox
#   table = expires
#   value_field = expire_stamp
#
#   fields {
#     username = $user
#     mailbox = $mailbox
#   }
# }
...

# nano /usr/local/bin/quota-warning.sh
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=dict:User quota::noenforcing:proxy::sqlquota"
From: postmaster@example.com
Subject: Quota warning

Your mailbox is $PERCENT% full. Don't forget to make a backup of old messages to remain able to receive mails.
EOF

# sudo chmod +x /usr/local/bin/quota-warning.sh
... et on redémarre Dovecot :
# service dovecot restart

####### RSPAMD #######

20 - On commence par installer redis-server :
# apt install redis-server

21 - Puis on installe Rspamd :
# apt install software-properties-common lsb-release
# apt install lsb-release wget
# wget -O- https://rspamd.com/apt-stable/gpg.key | sudo apt-key add -
# echo "deb http://rspamd.com/apt-stable/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/rspamd.listsudo
# apt update
# apt install rspamd

22 - On va configurer Rspamd :
# nano /etc/rspamd/local.d/worker-normal.inc
bind_socket = "127.0.0.1:11333";

# nano /etc/rspamd/local.d/worker-proxy.inc
bind_socket = "127.0.0.1:11332";
milter = yes;
timeout = 120s;
upstream "local" {
  default = yes;
  self_scan = yes;
}

Il faut créer un mot de passe pour l'interface web de Rspamd :
# rspamadm pw --encrypt -p P4ssvv0rD
Notez bien la clé qui va s'afficher. Elle ressemblera à ça :
$2$khz7u8nxgopsfay3qta7ousbnmi19kew$zdat4nsm7nd3ctmiigx9kjyo111hcjodn1bob5jaxt7wpkieoc5b

# nano /etc/rspamd/local.d/worker-controller.inc
password = "CLE_GENEREE_PLUS_HAUT"
Puis on con tinue la configuration :
# nano /etc/rspamd/local.d/classifier-bayes.conf
servers = "127.0.0.1";
backend = "redis";

# nano /etc/rspamd/local.d/milter_headers.conf
use = ["x-spamd-bar", "x-spam-level", "authentication-results"];

On rédémarre Rspamd :
# systemctl restart rspamd

23 - On va configurer Nginx pour l'interface web de Rspamd :

# nano /etc/nginx/conf.d/spam.example.com.conf
server {
listen 80; 
listen [::]:80; 
server_name spam.example.com

location / { 
proxy_pass http://127.0.0.1:11334/;    
proxy_set_header Host $host;    
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    


}
On va demander et installer un certificat Lets'encrypt :
# certbot --nginx -d spam.example.com

24 - On va terminer la configuration de Postfix on intégrant les paramètres pour Rspamd :
# postconf -e "milter_protocol = 6"
# postconf -e "milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}"
# postconf -e "milter_default_action = accept"
# postconf -e "smtpd_milters = inet:127.0.0.1:11332"
# postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
... et on redémarre Postfix :
# systemctl restart postfix

####### DOVECOT 2 #######

25 - On termine la config de Dovecot en intégrant le module Sieve pour filtrer les mails
# apt install dovecot-sieve dovecot-managesieved

# nano /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
postmaster_address = postmaster@example.com
mail_plugins = $mail_plugins sieve
}

# nano /etc/dovecot/conf.d/20-imap.conf
...
protocol imap {
...
mail_plugins = $mail_plugins imap_quota imap_sieve
...
}
...

# nano /etc/dovecot/conf.d/20-managesieve.conf
...
service managesieve-login {
inet_listener sieve {
port = 4190 
}
...
}
..

service managesieve {
process_limit = 1024
}
...

# nano /etc/dovecot/conf.d/90-sieve.conf
plugin {
... 
# sieve = file:~/sieve;active=~/.dovecot.sieve 
sieve_plugins = sieve_imapsieve sieve_extprograms 
sieve_before = /var/mail/vmail/sieve/global/spam-global.sieve 
sieve = file:/var/mail/vmail/sieve/%d/%n/scripts;active=/var/mail/vmail/sieve/%d/%n/active-script.sieve 

imapsieve_mailbox1_name = Spam 
imapsieve_mailbox1_causes = COPY 
imapsieve_mailbox1_before = file:/var/mail/vmail/sieve/global/report-spam.sieve 

imapsieve_mailbox2_name = * 
imapsieve_mailbox2_from = Spam 
imapsieve_mailbox2_causes = COPY 
imapsieve_mailbox2_before = file:/var/mail/vmail/sieve/global/report-ham.sieve 

sieve_pipe_bin_dir = /usr/bin 
sieve_global_extensions = +vnd.dovecot.pipe 
.... 
}

26 - Puis on crée un répertoire qui va accueillir les scripts Sieve:
# mkdir -p /var/mail/vmail/sieve/global

# nano /var/mail/vmail/sieve/global/spam-global.sieve
require ["fileinto","mailbox"];

if anyof(
header :contains ["X-Spam-Flag"] "YES", 
header :contains ["X-Spam"] "Yes", 
header :contains ["Subject"] "*** SPAM ***" 

{
fileinto :create "Spam"; 
stop; 
}

# nano /var/mail/vmail/sieve/global/report-spam.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];

# nano /var/mail/vmail/sieve/global/report-ham.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_ham"];
... et on redémarre Dovecot :
# systemctl restart dovecot

Il faut maintenant compiler les scripts Sieve et appliquer les bons droits :
# sievec /var/mail/vmail/sieve/global/spam-global.sieve
# sievec /var/mail/vmail/sieve/global/report-spam.sieve
# sievec /var/mail/vmail/sieve/global/report-ham.sieve
# chown -R vmail: /var/mail/vmail/sieve/

####### DKIM #######

27 - Dkim
DomainKeys Identified Mail (DKIM) est une méthode d'authentification par courrier électronique qui ajoute une signature cryptographique aux en-têtes des messages sortants.
Il permet au destinataire de vérifier qu'un courrier électronique prétendant provenir d'un domaine spécifique a bien été autorisé par le propriétaire de ce domaine.
Le but principal de cette opération est d'empêcher les messages électroniques falsifiés.

On peut avoir différentes clés DKIM pour tous les domaines et même plusieurs clés pour un seul domaine, mais pour simplifier cet article, nous allons utiliser une seule clé DKIM qui pourra ultérieurement être utilisée pour tous les nouveaux domaines.

On va créer un répertoire afin d'accueillir les clés Dkim :
# mkdir /var/lib/rspamd/dkim/
Et on va créer la clé Dkim :
# rspamadm dkim_keygen -b 2048 -s mail -k /var/lib/rspamd/dkim/mail.key /var/lib/rspamd/dkim/mail.pub
Dans cet exemple, on utilise "mail" comme sélecteur Dkim.
On applique les bonnes permissions :
# chown -R _rspamd: /var/lib/rspamd/dkim
# chmod 440 /var/lib/rspamd/dkim/*
On va enseuite "dire" à Rspamd de regarder au bon endroit pour les clés Dkim :
# nano /etc/rspamd/local.d/dkim_signing.conf
selector = "mail";
path = "/var/lib/rspamd/dkim/$selector.key";
allow_username_mismatch = true;
Rspamd prend également en charge la signature ARC (Authenticated Received Chain). Rspamd utilise le module dkim pour traiter les signatures ARC afin que nous puissions simplement copier la configuration précédente :
# cp /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf
... et on redémarre Rspamd :
# systemctl restart rspamd

####### DNS #######

28 - Vous devez aussi configurer vos DNS.
N'oubliez pas de configurer :
- une entrée MX (serveur de mail) :
Exemple : domain.com. MX 10 mail.s2ii.xyz.   
- une entrée SPF
Exemple : domain.com. TXT "v=spf1 a mx ~all"   
- une entrée _dmarc
Exemple : _dmarc.domain.com. TXT "v=DMARC1; p=none; adkim=r; aspf=r;"    
- une entrée Dkim

Vous trouverez la clé publique Dkim ici :
# cat /var/lib/rspamd/dkim/mail.pub
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdBRCqYzshc4LmmkxUkCH/rcIpSe/QdNIVmBrgqZmZ5zzWQi7ShdFOH7V32/VM1VRk2pkjDV7tmfbwslsymsfxgGhVHbU0R3803uRfxAiT2mYu1hCc9351YpZF4WnrdoA3BT5juS3YUo5LsDxvZCxISnep8VqVSAZOmt8wFsZKBXiIjWuoI6XnWrzsAfoaeGaVuUZBmi4ZTg0O4yl"  
"nVlIz11McdZTRe1FlONOzO7ZkQFb7O6ogFepWLsM9tYJ38TFPteqyO3XBjxHzp1AT0UvsPcauDoeHUXgqbxU7udG1t05f6ab5h/Kih+jisgHHF4ZFK3qRtawhWlA9DtS35DlwIDAQAB"  
) ;
[* ceci est un exemple, n'oubliez pas d'adapter cette config avec votre VRAIE config]

####### RAINLOOP WEBMAIL #######

29 - On télécharge Rainloop :
cd /tmp
wget http://www.rainloop.net/repository/webmail/rainloop-community-latest.zip

# mkdir /var/www/webmail
# unzip rainloop-community-latest.zip -d /var/www/webmail
# chown -R www-data:www-data /var/www/webmail

30 - On crée le fichier Nginx pour Rainloop webmail :
# nano /etc/nginx/conf.d/webmail.example.com.conf
server {
listen 80; 
listen [::]:80; 
root /var/www/webmail; 
index index.php index.html index.htm;  
server_name webmail.example.com

client_max_body_size 100M; 

location / { 
try_files $uri $uri/ /index.php?$query_string; 
}      

location ~ .php$ { 
include snippets/fastcgi-php.conf;      
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;      
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;      
include fastcgi_params;      


location ^~ /data {  
deny all;      
}   

}

31 - On crée et on installe un certificat Letsencrypt HTTPS :

# certbot --nginx -d webmail.example.com

32 - ET VOILA... ou presque. La configuration "technique" est terminée.
Reste à configurer les noms de domaines et les boites mail dans Postfixadmin : https://mail.example.com
Je n’explique pas cette partie. Vous pourrez trouver plein d'exemples sur le net.

33 - Connection
Une fois tous les domaines et les boites mail configurées dans Postfixadmin, on va pouvoir se connecter sur l'interface d'admin de Rainloop à cette adresse : https://webmail.example.com/?admin afin de configurer les domaines.
Par défaut, le login est admin et le mot de passe 12345
Il vous suffira de changer le mot de passe après.
Une fois connecté à l'admin -- Onglet Domaine, Ajouter un domaine>

A - IMAP + SMTP
Partie IMAP
Serveur : mail.example.com
Sécurité : SSL/TLS
Port : 993

Partie SMTP

Serveur : mail.example.com
Sécurité : STARTTLS
Port : 587


Cliquez sur TEST, en bas à gauche de la fenêtre. Si TEST devient vert, la config est OK, si TEST devient rouge, il y a un truc qui cloche !

B - SIEVE

Cliquez sur configuration sieve (beta)
Cochez : Autoriser les scripts Sieve ET Autoriser les scripts personnels

Partie SIEVE
Serveur : mail.example.com
Sécurité : STARTTLS
Port : 4190

Partie SMTP

Serveur : mail.example.com
Sécurité : STARTTLS
Port : 587
 
Cliquez enfin sur Modifier.
 


Refaite cette même configuration pour chaque domaine que vous allez utiliser !

34 - L'interface du webmail étant elle située ici : https://webmail.example.com


[UPDATE] : pour activer l'auto learn (apprentissage) de Rspamd, créez le fichier suivant :
# nano /etc/rspamd/override.d/classifier-bayes.conf
autolearn = true;
Redémarrez Rspamd :
systemctl restart rspamd

Seedbox "complète" sous Debian 10 avec Rtorrent, Rutorrent, Emby, Couchpotato

Rédigé par citizenz - - 4 commentaires

SEEDBOX COMPLETE SOUS DEBIAN 10

Pourquoi créer une seedbox ?
- partager facilement les médias libres (films, animés, OS, etc.)

Cette seedbox sera composée de :
- Debian 10
- Rtorrent
- Rutorrent
- Emby
- Couchpotato
- phpsysinfo


Il reprend l'installation sur un serveur de type VPS Hetzner (https://hetzner.com/ ) + un volume monté en /home


Serveur VPS Hetzner CX21 (2 cpu, 4 GB RAM, 40 GB SSD, 1 Gbps): 5.88 €/M
+ volume supplémentaire de 200 GB monté en /home/seedbox pour fichiers médias : 9,60 €/M

AVANTAGES
- proc performant
- connexion 1 Gbps
- volume à la dimension voulue
- payable à l'heure

INCONVÉNIENTS
- VPS (ressource théoriquement partagées)
- Petit espace de stockage
- Trafic (Out) limité à... 20 TB
- Plus cher qu'un "petit" serveur Dédié Kimsufi ou Online

Postulats de départ :
- J'utilise la même annotation que le tuto de ex-rat : <username> signifie qu'il faut remplacer par son véritable nom d'utilisateur, <votre.domaine.com> signifie qu'il faut remplacer par son véritable nom de domaine, etc.
- Installation "fraîche" d'une Debian 10.
- Le Volume de 200 GB est monté en /home/<username>

--------------------------------------------
AVERTISSSEMENT :
Cet article n'a pas pour but de décrire la mise en place d'un "système" servant à "pirater" des oeuvre sous droit(s) d'auteur.
La seedbox devra être utilisée à des fins de test ou de partage de médias sous licences libres ou licences de libre diffusion (GPL, Creative commons, etc.).
--------------------------------------------


TUTORIEL : Go !
Une fois le serveur installé avec une Debian 10, on met à jour et on installe quelques applis :
sudo apt update && apt upgrade -y
sudo apt install -y sudo nano vim-nox htop git mc screen ntp rkhunter fail2ban ufw curl


On crée un utilisateur qui aura les droits sudo (il ne s'agit pas de l'utilisateur de la seedbox. Il s'agit d'un "vrai" utilisateur avec les droits sudo) :
sudo adduser citizenz
sudo adduser citizenz sudo


On crée le /home de l'utilisateur <username> (fichiers multimédia) :
sudo mkdir /home/<username>

On configure le fstab pour "monter" le volume à chaque redémarrage.
Pour trouver la config exacte de ce volume, dans votre Panel Hetzner, pour votre serveur :
- menu Volumes
- Trois petits points au bout de la ligne de votre volume puis Configuration

Sur mon serveur, ça donne ça :
sudo echo "/dev/disk/by-id/scsi-0HC_Volume_2942248 /home/<username> ext4 discard,nofail,defaults 0 0" >> /etc/fstab

Redémarrage nécessaire :
sudo reboot

L'essentielle de la config de base du système est prête, on va désormais suivre le tutoriel de ex_rat :
https://mondedie.fr/d/10831-tuto-installer-rutorrent-sur-debian-10-nginx-php-fpm


Après un reboot, on a accès à :
ruTorrent Webui
URL : XXX.XXX.XXX.XXX/rutorrent

SFTP
IP : XXX.XXX.XXX.XXX
Port : 22

Pour obtenir de l'aide plus facilement, un script de debug est dispo, qui permet d'obtenir un lien vers un récap' complet de vos fichiers de conf en rapport avec le tuto.
cd /tmp
git clone https://github.com/exrat/Script-Debug-MonDedie
cd Script-Debug-MonDedie
chmod a+x Script-Debug-Mondedie.sh && ./Script-Debug-Mondedie.sh


Vous aurez accès à un lien sur Pastebin. En ouvrant le lien dans votre navigateur vous verrez une "copie" des infos de votre système concernant votre seedbox.
En fin de fichier, il peut y avoir des erreurs qui s'affichent. Elles permettront certainement de voir où se situe votre problème de config et cela permettra d'y remédier rapidement.

#########################################
AJOUTS PERSOS
#########################################

-----------------------------------------
1/ Letsencrypt (HTTPS)
-----------------------------------------
Votre fichier Nginx de configuration pour votre seedbox (vhost) ne comporte pas de nom de domaine.
Si vous souhaitez en configurer un, il va falloir légèrement modifier le fichier.
Par contre, même si la connexion sur l’adresse IP + SSL restera possible, votre seedbox sera associée à un nom de domaine. A vous de voir si vous voulez faire ça (anonymat, etc.).

sudo nano /etc/nginx/sites-enable/seedbox.conf

Début du fichier :
server {   
listen 80 default_server;   
server_name _;

On va remplacer par : <votre.domaine.com> à remplacer par votre vrai nom de domaine ou sous-domaine... par exemple : seedbox.mondmaine.com
server {   
listen 80;   
server_name <votre.domaine.com>;

Vérifiez toujours que votre configuration Nginx ne comporte pas d'erreur - avant de relancer Nginx - avec la commande :
sudo nginx -t

Vous devriez avoir quelque chose comme ça si tout va bien :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

On va ajouter le plugin Nginx de Letsencrypt (certbot). Très pratique pour Nginx, cela permettra de générer "tout ce qu'il faut" et de configurer automatiquement votre fichier Nginx vhost pour HTTPS.
On installe quelques dépendances :
sudo apt install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing python3-zope.interface

Puis on installe le plugin Nginx pour certbot (letsencrypt) :
sudo apt install python3-certbot-nginx

On va demander un certificat SSL Letsencrypt avec la commande suivante :
* évidemment <www.your_domain> et <your_domain> sont à adapter avec votre VRAI domaine
** vous n'êtes pas obligé de déclarer un www. et vous pouvez juste faire : certbot --nginx -d <your_domain>
sudo certbot --nginx -d www.<votre.domaine.com>-d <votre.domaine.com>

1/ Vous devrez ensuite rentrer une adresse E-mail qui servira à vous envoyer des infos de renouvellement du certificat - valable 90 jours mais renouvelable - ou des infos de sécurité.
2/ Acceptez les termes du service.
3/ Vous pouvez répondre non à la question d'après qui consiste à donner votre e-mail.
4/ Enfin vous choisirez la manière dont le HTTPS sera configuré :
- soit en entrant l'URL HTTPS directement dans le navigateur, à savoir que vous aurez aussi le choix de rester en HTTP (choix 1)
- soit en redirigeant toutes les demandes sur HTTPS (choix 2)
Moi je prends le 2ème choix.

Une fois fait, vous aurez votre certificat Letsencrypt installé pour votre domaine et votre fichier vhost Nginx aura été reconfiguré automatiquement pour tenir compte de la nouvelle configuration.
En vous reconnectant sur votre seedbox, vous pourrez voir que le cadenas vert est apparu (sous Firefox). Votre seedbox est désormais accessible en HTTPS.

Petit ajout pour HTTP2 :
Vers la fin du fichier vhost Nginx seedbox.conf, vous verrez cette ligne :
listen 443 ssl; # managed by Certbot

Ajoutez http2 en fin de ligne, juste avant le point-virgule :
listen 443 ssl http2; # managed by Certbot

Redémarrez Nginx :
sudo /etc/init.d/nginx restart

HTTP2 va permettre d'apporter certaines fonctionnalités. Vous retrouvez toutes les infos ici : https://blog.eleven-labs.com/fr/http2-nest-pas-le-futur-cest-le-present/


-----------------------------------------------
2/ Emby
-----------------------------------------------
Emby (anciennement Media Browser) est un serveur multimédia conçu pour organiser, lire et diffuser du contenu audio et vidéo sur une variété de périphériques.
Très pratique (à mon goût...), il va permettre d'organiser tous les fichiers multimédia, les lire, etc.

On va prendre le lien pour Debian 9, Debian 10 n'existe pas... encore :
wget -nv http://download.opensuse.org/repositories/home:emby/Debian_9.0/Release.key -O Release.key
sudo apt-key add - < Release.key
sudo apt-get update
sudo echo 'deb http://download.opensuse.org/repositories/home:/emby/Debian_9.0/ /' > /etc/apt/sources.list.d/emby-server.list
sudo apt-get update
sudo apt-get install emby-server

Pour permettre à Emby de démarrer automatiquement à chaque reboot :
systemctl enable embyserver.service
systemctl start emby-server.service

Vous devriez pourvoir accéder à Emby sur le port 8096 de votre serveur/seedbox.
Exemple : http://<your_domain>:8096

(Attention pas d'accès en HTTPS, ca ne fonctionne pas chez moi...)
Lors de votre première connexion, plusieurs options de configuration vous seront proposées. Rien de compliqué.


--------------------------------------------
3/ Couchpotato
--------------------------------------------
CouchPotato est un téléchargeur automatique NZB et torrent.
Vous pouvez garder une liste de "films que je veux" et il recherchera les NZBs/torrents de ces films toutes les X heures.
Une fois qu'un film est trouvé, il téléchargera le torrent dans un répertoire spécifié.
Il correspond à la version "films" de SickRage.

J'ai choisi de mettre les fichier de Couchpotato dans /opt

sudo apt install git-core python python-cheetah
cd /opt
sudo git clone https://github.com/CouchPotato/CouchPotatoServer.git couchpotato
sudo cp couchpotato/init/ubuntu.default /etc/default/couchpotato
sudo nano /etc/default/couchpotato

Adaptez le fichier /etc/default/couchpotato comme ceci :
CP_USER=<username>
CP_HOME=/opt/couchpotato
CP_DATA=/opt/couchpotato
CP_PIDFILE=/var/run/couchpotato/couchpotato.pid
PYTHON_BIN=/usr/bin/python

Création d'un fichier service systemd :
sudo cp couchpotato/init/couchpotato.service /etc/systemd/system/couchpotato.service
sudo nano /etc/systemd/system/couchpotato.service

On adapte le path du ExecStart dans /etc/systemd/system/couchpotato.service :
ExecStart=/opt/couchpotato/CouchPotato.py

Pour permettre à Couchpotato de démarrer automatiquement à chaque reboot :
sudo systemctl enable couchpotato
sudo systemctl start couchpotato

Vous devriez pourvoir accéder à Couchpotato sur le port 5050 de votre serveur/seedbox.
Exemple : http://<your_domain>:5050

P.S. : Couchpotato c'est bien, mais on y trouve surtout des médias en langue anglaise (GB/US)... Il y a peu de médias FR.
La faute au "Searchers", c'est à dire aux sites de torrents référencés. Dommage qu'il ne soit pas possible d'en ajouter.

--------------------------------------------
4/ phpsysinfo
--------------------------------------------
PhpSysInfo (PSI) est une interface web, écrite avec le langage PHP, qui permet d'afficher des informations concernant le système et le matériel sur lequel elle est installée.
phpSysInfo est distribué sous GNU GPL version 2.

On télécharge la dernière version de phpsysinfo dans /var/www :
cd /var/www
wget https://github.com/phpsysinfo/phpsysinfo/archive/v3.3.1.tar.gz
tar xvfz v3.3.1.tar.gz
mv phpsysinfo-3.3.1/ phpsysinfo
chown -R www-data:www-data phpsysinfo
cd phpsysinfo
cp phpsysinfo.ini.new phpsysinfo.ini

Tout devrait fonctionner "tel quel".
Si vous voulez mettre phpsysinfo en FR :
nano phpsysinfo.ini
DEFAULT_LANG="fr"

--------------------------------------------
Résumé des accès :
--------------------------------------------
PAGE D'ACCUEIL : https://<your_domain> : y'a rien ! A vous de voir pour y mettre une page d'accueil, une "plateforme" type muximux (https://github.com/mescon/Muximux), etc.

RUTORRENT : https://<your_domain>/rutorrent - Connectez vous avec votre nom d’utilisateur <username> + mot de passe créés grâce au tuto de ex_rat

EMBY :  http://<your_domain>:8096 - Connectez vous avec votre nom d’utilisateur <username> + mot de passe créés grâce au tuto de ex_rat

COUCHPOTATO : http://<your_domain>:5050 - Connectez vous avec votre nom d’utilisateur <username> + mot de passe créés grâce au tuto de ex_rat

PHPSYSINFO : http://<your_domain>/phpsysinfo

PS : si vous avez installé un firewall (type UFW), pensez à ouvrir les ports suivants :
80 + 443 : HTTP + HTTPS
5050 : Couchpotato
8096 : Emby
Pensez aussi à SSH (généralement sur le port 22) et votre ou vos port(s) Rtorrent !

OneProvider : la Dacia des serveurs dédiés !

Rédigé par citizenz - - 7 commentaires

Je viens de découvrir Oneprovider .
OneProvider est une compagnie Canadienne qui offre une gamme complète de solutions en ligne : serveurs dédiés, virtuels, colocation dans plus 145 villes à travers le monde.
C'est en fait une filiale de Online... et des serveurs Online "reconditionnés"... ou "qui ont fait leur temps", etc.
Il y a notamment une gamme de serveurs dédiés impressionnante dans une bonne trentaine de villes d'Europe, d'Amérique du Nord et du sud, d'Asie, d'Afrique et d'Océanie. La gamme de serveur est très étendue (niveau proc, RAM, DD, etc.).

Avec les "Summer sell " vous pouvez trouver un dédié basé en France pour 6.99 €/m TTC !  C'est pas cher... mais certaine chose sont minimalistes.
Le panel de gestion client est plutôt pas mal fait, la gestion du serveur est plutôt pratique.
Mais première surprise lors de l'install ou de la reinstall de l'OS du serveur dédié, pas possible de choisir autre chose que des versions "anciennes" des OS (Debian v8, Ubuntu 14.04, ...) Ça commence à dater un peu.
Pourtant, sur l'annonce au moment de l'achat il est bien noté que Debian 9 fait partie des OS disponibles tout comme Ubuntu 18.04.
Par contre, sur simple demande au support, ils vous l'installent (Debian 9) après que vous leur ayez affirmé que vous êtes au courant que la réinstall va effacer toutes les données du serveur.

 

Mais à 6.99 €/mois, le serveur dédié que j'ai choisi (Intel Atom C2350 - 1.7 GHz, 4GB Ram DDR3, 1 TB HDD SATA et surtout une connexion à 1 Gb/s unmetered) est quand même pas mal !
Le processeur est assez limité mais pour un "petit" serveur web ou une seedbox, c'est parfait ! La connexion à 1 GB/s est parfaite !

Mais moi, je voulais me faire un serveur avec une Debian 10 O_o !!!

Donc pas d'autre alternative que d'upgrader à la main l'OS installé.
Plutôt que de passer de Jessie à Buster directement (je pense que ce n'est pas indiqué : vous confirmez ?), j'ai préféré upgrader vers Strech dans un premier temps, puis vers Buster dans un deuxième temps.
Voila comment je m'y suis pris et c'est en fait très simple.

Première chose à faire : s’assurer qu’on est bien à jour sur Jessie :
$ su
# apt update
# apt full-upgrade
# reboot


Puis on met à jour le fichier /etc/apt/sources.list en remplaçant jessie par stretch :
$ su
# sed -i 's|jessie|stretch|' /etc/apt/sources.list

Vérifiez aussi les dépôts dans /etc/apt/sources.list.d/

Puis on met à jour vers Stretch (v9) :
# apt update
# apt full-upgrade
# reboot

Bingo ! On est sous Debian Strech (9).

 

Vérifiez avec :
$ lsb_release -a

Vous aurez peut-être quelques fichiers à supprimer :
#apt autoremove
#reboot

Si tout est bon, on passe de Strech (9) à Buster (10) avec la même procédure :
$ su
# sed -i 's|stretch|buster|' /etc/apt/sources.list
# apt update
# apt full-upgrade
# reboot

Bingo (2) ! On est sous Debian Buster (10).

Vérifiez avec :
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

$ uname -a
Linux AMS-144116 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64 GNU/Linux

Bien que vous soyez en Debian 10 (Buster), vous garderez la version Debian 8 sur votre panel d'administration client OneProvider.

 

[NOTE] - Copier des fichiers à travers SSH grâce à SCP

Rédigé par citizenz - - Aucun commentaire

SCP est une commande présente dans toutes les distributions Linux.
Elle permet facilement de copier un fichier à partir d'un ordinateur sur un autre avec SSH.
Ca marche comme ça :
scp -r -p /chemin/du/dossier/source user@serveur-distant:/chemin/du/dossier/destination
-r: récursif
-p: préserve les dates de modification, d’accès, et les modes des anciens fichiers.
Vous pouvez aussi utiliser l'option -P (majuscule) pour indiquer le port de connexion SSH si celui-ci n'est pas le port 22 (par défaut).
Fil RSS des articles de cette catégorie