En tant que root mysql, creons un utilisateur postfix qui aura le droit de seulement lire la base
mysql -u root -p
mysql>CREATE DATABASE `postfix`;
mysql>GRANT SELECT ON `postfix`.* TO 'postfix'@'127.0.0.1' IDENTIFIED BY 'password';
postfix.* signifie que vous appliquez les droits à toutes les tables de la base postfix.
postfix@127.0.0.1 signifie que autorisé postfix seulement depuis 127.0.0.1 (cad en local)
Password etant le mot de passe que vous attribuez à l'utilisateur postfix.
Pui, toujours tant que root, nous allons créer les tables mysql
USE postfix;
--
-- Structure de la table `domain`
--
CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`domain`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Domaines Virtuels';
--
-- Structure de la table `mailbox`
--
CREATE TABLE `mailbox` (
`email` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`actif` tinyint(1) NOT NULL default '1',
`imap` tinyint(1) NOT NULL default '1',
`pop3` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`email`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Boites Emails Virtuelles';
--
-- Structure de la table `alias`
--
CREATE TABLE `alias` (
`source` varchar(255) NOT NULL default '',
`destination` text NOT NULL,
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`source`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Alias Virtuels';
Maintenant nous sommes prêt du côté Mysql.
Postfix ne gere pas nativement les quotas.
Il y a 2 solutions : soit on telecharge les sources puis on applique un patch.
C'est le cas ici : http://doku.beyondhosting.fr/doku.php/howto:debian:postfix dans la section "Patch Quota pour Postfix". L'inconvenient est que le paquet ne sera plus mis à jour par le gestionnaire de paquets. Il faudra à chaque faille de securité decouverte re-compiler postfix.
Etant deja dans ce cas avec Mysql afin qu'il supporte SSL, j'ai donc plutot choisit de continuer à utiliser les paquets debian en ajoutant le dépot VDA (auteur du patch des quotas). Il faut juste s'assurer que vda sorte rapidement les mises à jour lorsqu'il y en a et qu'ils ne se fassent pas hacker...
Pour ajouter le depot, mettre ces lignes à la fin du fichier /etc/apt/sources.list
#postfix VDA
deb http://debian.home-dn.net/sarge postfix-vda/
On installe postfix avec le support mysql
apt-get update
apt-get install postfix postfix-mysql
L'installeur va alors vous poser quelques questions.
Pour un serveur dédié il faudra choisir "Systeme Internet", et pour le domaine votre domaine principale. Nous utiliserons test.priv pour les tests.
Ensuite, il est necessaire de creer un utilisateur pour les mails virtuels. Tous les mails virtuels arriveront dans /var/spool/Vmail/test.priv/user
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/spool/vmail/ -m
Puis editer /etc/postfix/main.cf
Modifier
myhostname = test.priv
#restrictions d'accès
# adresses d'expédition
# le "reject_unknown_sender_domain" verifie que le domaine existe
smtpd_sender_restrictions =
permit_mynetworks,
reject_unknown_sender_domain,
warn_if_reject reject_unverified_sender
# adresses de destination
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient
# client
smtpd_client_restrictions =
reject_unknown_client,
permit_mynetworks
Et ajouter ceci
disable_vrfy_command = yes
smtpd_helo_required = yes
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf,mysql:/etc/postfix/mysql-virtual_aliases_mailbox.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/vmail/
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "Desole, la boite email de l'utilisateur est pleine, essayez plus tard."
virtual_overquota_bounce = yes
Ensuite creer les fichiers suivants dans /etc/postfix
# mysql-virtual_domains.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = 'virtual'
table = domain
where_field = domain
additional_conditions = AND actif=1
# mysql-virtual_mailboxes.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
table = mailbox
where_field = email
additional_conditions = AND actif=1
# mysql-virtual_aliases.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = destination
table = alias
where_field = source
additional_conditions = AND actif=1
# mysql-virtual_aliases_mailbox.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = email
table = mailbox
where_field = email
additional_conditions = AND actif=1
# mysql-virtual_mailbox_limit_maps.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = quota
table = mailbox
where_field = email
Autoriser postfix à lire ces fichiers
chgrp postfix /etc/postfix/mysql-virtual_*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-virtual_*.cf
puis redemarrer postfix et checker la configuration
/etc/init.d/postfix restart
postfix check
regarder les logs dans /var/log
il y a mail.err, mail.info, mail.log, mail.warn
Avec mysql5, un probleme de connexion mysql peut survenir si vous avez activer skip-networking. Il suffit de le commenter, ecouter seulement sur 127.0.0.1 aura le même effet.
Maintenant nous allons ajouter la partie sasl et modifier la partie TLS dans /etc/postfix/main.cf
#sasl
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = test.priv
broken_sasl_auth_clients = yes
# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
Et ajouter ceci qui permet de limiter les spams et les scans
### Tarpit those bots/clients/spammers who send errors or scan for accounts
smtpd_error_sleep_time = 60
smtpd_soft_error_limit = 60
smtpd_hard_error_limit = 10
Enfin, nous allons modifier ceci dans /etc/postfix/main.cf pour autoriser les authentifications sasl
# adresses de destination
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient
Comme nous avons activé TLS, il faut generer les certificats dans /etc/postfix
openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650
Autoriser Postfix à lire ces certificats
chgrp postfix /etc/postfix/smtpd.*
chmod u=rw,g=r,o= /etc/postfix/smtpd.*
Ensuite, decommenter ces lignes dans /etc/postfix/master.cf
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
Pour utiliser les principales listes antispam dans /etc/postfix/main.cf, modifier ceci:
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient
Installons maitenant sasl et le module mysql pour PAM
apt-get install libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql
Creer un dossier pour sasl
mkdir -p /var/spool/postfix/var/run/saslauthd
Editez /etc/default/saslauthd.
Remplacez START=no en START=yes puis modifiez le paramètre OPTION
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
Créez ensuite le fichier /etc/pam.d/smtp. Il ne doit contenir seulement ces deux lignes (changez les différents paramètre):
auth required pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=postfix table=mailbox usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=mail table=mailbox column=email passwdcolumn=password crypt=1
Ensuite, créez le fichier /etc/postfix/sasl/smtpd.conf comme suit :
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: password
sql_database: postfix
sql_select: select password from mailbox where email = '%u'
Coreection d'un bug
dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
adduser postfix sasl
Puis redemarrer
/etc/init.d/postfix restart
postfix check
/etc/init.d/saslauthd restart
Regarder dans les logs si tout va bien comme vu precedemment
Maintenant nous allons tester que le smtp fait bien ce que nous voulons.
Vous aurez peut-etre besoin de telnet
apt-get install telnet-ssl
Ajoutons un domaine test2.priv, et un email test@test2.priv
mysql -u root -p
mysql>USE postfix
mysql>INSERT INTO domain VALUES ('test2.priv',1);
mysql>INSERT INTO mailbox VALUES ('test@test2.priv',ENCRYPT('secret'),0,1,1,1);
Creer une clée d'authentification pour ce serveur
% perl -MMIME::Base64 -e 'print encode_base64("\000test\@test2.priv\000secret")'
AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ
Depuis le serveur nous devons pouvoir envoyer vers l'exterieur ou vers un compte local.
Vers un compte local
telnet localhost 25
HELO test.priv
mail from:
250 ok
rcpt to:
250 ok
data
354 go ahead
From: John
To: Nobody
Subject: test postfix
test postfix
.
250 ok 1113954693 qp 29052
quit
Vers exterieur, recommencer la manipulation precedente avec un compte wanadoo par exemple au lieu de test@test2.priv.Attention si vous essayez depuis un reseau domestique et non un serveur dédié, la plupart des FAI bloquent le port 25 et donc le mail ne partira reellement pas.
Si tout est ok vous devez retrouver des emails dans /var/spool/vmail/test2.priv/test.
Depuis l'exterieur, si nous ne sommes pas identifié nous pouvons seulement envoyer vers un compte local. Si nous sommes identifier nous pouvons envoyer vers l'exterieur egalement. Nous allons en profiter pour tester l'authentification SSL.
Pour tester l'envoi vers un compte local, faire la meme manipulation que ci-dessus avec un telnet ip.du.serv.eur 25.
Idem vers un compte exterieur (du type @wanadoo.fr). A ce moment après avoir tapé rcpt to:
Il faut vous authentifier avec la clé que l'on a créé plus haut. tapez ceci dans le telnet:
AUTH PLAIN AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ=
235 ok, go ahead (#2.0.0)
puis refaire:
mail from: test@test.priv
250 ok
rcpt to: test@wanadoo.fr
250 ok
data
354 go ahead
From: John
To: Nobody
Subject: test postfix
test postfix
.
250 ok 1113954693 qp 29052
quit
Maintenant vous pouvez envoyer vers l'exterieur.
Testons maintenant le SSL, le smtp SSL ouvre un port 465. Pensez à l'ouvrir sur votre firewall.
openssl s_client -crlf -connect ip.du.serv.eur:465
puis refaire les memes manipulations que ci-dessus, tester l'authentification etc...
Voici la manipulation pour tester le TLS egalement
openssl s_client -starttls smtp -crlf -connect ip.du.serv.eur:25
Pour l'administration des quotas (3eme colonne de la table mailbox), sachez que pour autoriser 2Mo il faudra indiquer 2048000. Les valeurs sont à donner en bytes.
En cas de besoin, pour configurer Postfix en tant que MX secondaire d'un autre serveur de mails, ajoutez ceci dans /etc/postfix/main.cf
relay_domains = domain1.tld
Il faudra configurer les DNS de domain1.tld de la facon suivante:
domain1.tld. IN MX 10 mx1.domain1.tld.
domain1.tld. IN MX 20 backup.example.tld.
backup.example.tld etant notre postfix secondaire.
Pour renvoyer un utilisateur local vers une boite que l'on peut relever, on pourra ajouter comme alias
root vers test@test2.priv
root@localhost vers test@test2.priv
root@test.priv vers test@test2.priv
Sans ajouter localhost et test.priv à la table domain.
Maintenant, vous savez tout sur le fonctionnement d'un serveur SMTP du type Postfix. Bon courage!
Pour aller plus loin:
http://www.lea-linux.org/documentations/index.php/Postfix-courier-mysql-quota-spamassassin-amavis
http://doku.beyondhosting.fr/doku.php/howto:debian:postfix
http://postfix.state-of-mind.de/patrick.koetter/smtpauth/smtp_auth_mailclients.html
http://ftp.traduc.org/doc-vf/gazette-linux/html/2007/142/lg142-C.html
http://www.yocum.org/faqs/postfix-tls-sasl.html
http://www.postfix.org/SASL_README.html
http://linuxfr.org/~Dinmax/10161.html
http://www.bxlug.be/articles/108
Aucun commentaire:
Enregistrer un commentaire