Skip to content

Etat des configurations du service Mail

Lopidurs edited this page May 17, 2022 · 20 revisions

Créer la base de donnée MariaDB

1. Créer le container mariaDB et s'y connecter

Maintenant on créer le container mariaDB nommé dbWoodyToys

docker run --detach --name dbWoodyToys --env MARIADB_USER=test-user --env MARIADB_PASSWORD=woody --env MARIADB_ROOT_PASSWORD=woody mariadb:latest

Pour se connecter à la DB via mySQL/mariaDB rentrer la commande:

docker exec -it dbWoodyToys mysql -u root -p

2. Configurer la base de données

Créer la database nommé woodyToys:

CREATE DATABASE woodyToys;

Créer maintenant un utilisateur et donné lui les droits:

CREATE USER 'admin'@'127.0.0.1' IDENTIFIED BY 'validerSVP';
GRANT SELECT ON woodyToys.* TO 'admin'@'127.0.0.1';
--recharge la db
FLUSH PRIVILEGES;

Accéder maintenant dans la db grâce à USE woodyToys; et créer 3 tables:

La table "domains"

Qui permet de gérer les différents dommaines qui recevront des mails

CREATE TABLE `domains` (
  `id` int(11) NOT NULL auto_increment,
  `domain_name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
);

La table "users"

Qui de toutes évidences va stocker tous nos utilisateurs et leur adresse mails:

CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(106) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE
);

La table "aliases"

Qui permettra de lié deux emails ensemble:

CREATE TABLE `aliases` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `source` varchar(100) NOT NULL,
  `destination` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE
);

Insérer des données

Insérer les premières données dans votre db grâce à:

INSERT INTO domains (domain_name) 
VALUES ('m1-2.ephec-ti.be');

INSERT INTO users (domain_id, password , email) 
VALUES ('1', 'CenClair', 'user1@m1-2.ephec-ti.be');

INSERT INTO users (domain_id, password , email) 
VALUES ('1', 'pasHash', 'user2@m1-2.ephec-ti.be');

Vérifier que tous c'est bien passé avec:

SELECT * FROM domains;

et

SELECT * FROM users;

Créer le service postfix

1. Créer le container mail et installer postfix

Pour commencer créer un simple containeur ubuntu nommé "mail" grâce à la commande:

docker run -it -d --name mail -p 25:25 ubuntu

Rendez-vous ensuite dans le container grâce à la commande:

docker exec -it mail bash

Mettez ensuite tous à jour avec:

apt-get update

Et installer postfix grâce à:

apt install postfix postfix-mysql

Pendant l'installation, il vous serra demandé d'accepter quelque chose donc entrer 'y'. Ensuite sélectionnez le type de configuration "internet site" donc entrer '2'. Enfin lorsqu'on vous demande "System mail name" entrer 'm1-2.ephec-ti.be'

2. Configurer postfix

Remplacer le fichier "main.cf" par:



smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no


append_dot_mydomain = no
readme_directory = no

compatibility_level = 2

# Configuration d'SSL/TLS
smtpd_tls_cert_file=/etc/letsencrypt/live/m1-2.ephec-ti.be/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/m1-2.ephec-ti.be/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous

# Activation d'SMTP et envoie à dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes


# Restrictions
smtpd_helo_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_invalid_helo_hostname,
        reject_non_fqdn_helo_hostname
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_recipient,
        reject_unknown_recipient_domain,
        reject_unlisted_recipient,
        reject_unauth_destination
smtpd_sender_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_sender,
        reject_unknown_sender_domain
smtpd_relay_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        defer_unauth_destination


# Configuration général de postfix
myhostname = m1-2.ephec-ti.be
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydomain = m1-2.ephec-ti.be
myorigin = $mydomain
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

# Dit que c'est dovecot qui s'occupe de l'envoie de mail en local
virtual_transport = lmtp:unix:private/dovecot-lmtp

# Connexion à la db
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,
        mysql:/etc/postfix/mysql-virtual-email2email.cf

# Restrictions + paramètres de MTA
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
#smtpd_etrn_restrictions = reject
#smtpd_reject_unlisted_sender = yes
#smtpd_reject_unlisted_recipient = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes
#smtpd_hard_error_limit = 1
smtpd_timeout = 30s
smtp_helo_timeout = 15s
smtp_rcpt_timeout = 15s
smtpd_recipient_limit = 40
minimal_backoff_time = 180s
maximal_backoff_time = 3h

# Codes d'erreurs
invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550

Créez maintenant les fichier permettant à postfix d'avoir les infos lui permettant de se connecter à la db et quelle commande SQL à faire pour vérifier que l'élément existe:

mysql-virtual-mailbox-domains.cf

user = admin
password = validerSVP
hosts = 172.17.0.3
dbname = woodyToys
query = SELECT 1 FROM domains WHERE domain_name='%s'

mysql-virtual-mailbox-maps.cf

user = admin
password = validerSVP
hosts = 172.17.0.3
dbname = woodyToys
query = SELECT 1 FROM users WHERE email='%s'

mysql-virtual-alias-maps.cf

user = admin
password = validerSVP
hosts = 172.17.0.3
dbname = woodyToys
query = SELECT destination FROM aliases WHERE source='%s'

mysql-virtual-email2email.cf

user = admin
password = validerSVP
hosts = 172.17.0.3
dbname = woodyToys
query = SELECT email FROM users WHERE email='%s'

Enfin modifier le fichier "master.cf" qui sert à postfix pour démarrer les différents services dont il a besoin:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
submission inet n       -       y      -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
relay     unix  -       -       y       -       -       smtp
        -o syslog_name=postfix/$service_name

showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd
maildrop  unix  -       n       n       -       -       pipe
  flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}

Créer le service dovecot

1. Installer dovecot

Aller dans le container mail grâce à:

docker exec -it mail bash

Installer maintenant docker grâce à:

apt install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

2. configurer dovecot

Tous d'abord configurer le fichier "dovecot.conf" pour activer les protocols et faire le lien avec les autres fichiers de configuration:

!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp
postmaster_address = postmaster at m1-2.ephec-ti.be
dict {
}
!include conf.d/*.conf
!include_try local.conf

Dans /etc/dovecot/conf.d/10-mail.conf trouver la variable "mail_location" qui est l'endroit où se situeront les mails et remplacez la ligne par:

mail_location = maildir:/var/mail/vhosts/%d/%n/

Créons maintenant le répertoire ou se trouveront les mails stocké grâce à:

sudo mkdir -p /var/mail/vhosts/m1-2.ephec-ti.be

Maintenant nous allons donné les droits du répertoire mail à vmail que nous mettrons dans le groupe du même nom:

 groupadd -g 5000 vmail
 useradd -g vmail -u 5000 vmail -d /var/mail
 chown -R vmail:vmail /var/mail

Dans le fichier /etc/dovecot/conf.d/10-auth.conf copier les lignes suivantes:

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext
!include auth-sql.conf.ext

Rempalcer le fichier /etc/dovecot/conf.d/auth-sql.conf.ext (qui permet créer l'authentification des utilisateurs) par:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/vhosts/%d/%n
}

Pour renseigner dovecot sur la DB, dans le fichier /etc/dovecot/dovecot-sql.conf.ext décommenter et changer les variables suivantes:

driver = mysql
connect = host=172.17.0.3 dbname=woodyToys user=admin password=validerSVP
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';

Enfin remplacer le fichier /etc/dovecot/conf.d/10-master.conf par:

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

service submission-login {
  inet_listener submission {
  }
}

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}

service imap {
}

service pop3 {
}

service submission {
}

service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

  user = dovecot
}

service auth-worker {
  user = vmail
}

service dict {
  unix_listener dict {
  }
}

Ce fichier renseigne à Dovecot comment utilisé les différents services dont il a besoin.

Clone this wiki locally