linuxed:serverlinuxed

Ceci est une ancienne révision du document !


~~ODT~~

Configuration du serveur Linuxed

Distribution GNU/Linux CentOS 6.x (pour du support à long terme).

  • Serveur SMTP avec Postfix
  • Antispam & Antivirus avec Amavis/Clamav/SpamAssassin
  • Serveur IMAP/POP avec Cyrus
  • Serveur de bases de données MySQL
  • Serveur Web Apache
  • Serveur de tunnels VPN OpenVPN

Ces différents services sont maintenant répartis dans différentes VMs.

Cheminement d'un mail:

  1. postfix :25 ⇒ sqlgrey :10030 (pour gestion liste grise)
  2. postfix ⇒ amavisd :10024 (pour filtrage du contenu, antivirus et spam)
  3. amavisd ⇒ postfix :10025 (pour livraison)
  4. postfix ⇒ cyrus (livraison)

Pré-requis

⇒ Attention, le package postfix de Fedora 8 ne supporte pas MySQL, il faut donc le recompiler pour activer le support. Le support MySQL est necessaire pour la gestion des comptes simplifiés avec Cyrus (webcyradm etc).

Le support de MySQL est présent avec le paquet postfix de CentOS 6.

Gestion liste grise

Postgrey est utiliser pour gérer la liste grise.

# yum install postgrey

⇒ Ne pas oublier de modifier le fichier /etc/init.d/postgrey pour indiquer dans la variable OPTIONS que postgrey doit écouter sur le port 10030 (et non sur un socket unix).

Sur RedHat/CentOS 6, avec le dépôt epel, postgrey n'est plus disponible. Son remplaçant est sqlgrey.

Installation de postfix

L'installation se fait via le paquet disponible dans les dépôts officiels:

# yum install postfix

Configuration de postfix

Voici le fichier de configuration /etc/postfix/main.cf actuellement utilisé:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
# AntiVirus / AntiSpam
content_filter = smtp-amavis:[127.0.0.1]:10024
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
disable_vrfy_command = yes
html_directory = no
inet_protocols = ipv4
mail_owner = postfix
mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
message_size_limit = 20480000
mydestination = $myhostname, localhost.$mydomain, localhost, mysql:/etc/postfix/mysql-mydestination.cf
mydomain = linuxed.net
mynetworks = 192.168.0.0/16, 127.0.0.1, 172.16.4.2, 172.16.3.2, 172.16.2.2, 172.16.254.0/24, [2001:41d0:1:b877::]/64, [2001:41d0:2:43df::/64], 37.187.23.86, 5.196.26.28
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
recipient_delimiter = +
relay_domains = $mydestination
sample_directory = /usr/share/doc/postfix-2.6.6/samples
sender_canonical_maps = mysql:/etc/postfix/mysql-canonical.cf
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_hostname
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_rbl_client zen.spamhaus.org, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service unix:postgrey/socket
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
smtpd_sender_restrictions = check_client_access hash:/etc/postfix/access, reject_sender_login_mismatch, reject_non_fqdn_sender, reject_unknown_sender_domain
#smtpd_tls_CAfile = /etc/pki/postfix/ca.crt
smtpd_tls_CAfile = /etc/letsencrypt/live/smtp.linuxed.net/chain.pem
#smtpd_tls_cert_file = /etc/pki/postfix/mx01.virt.linuxed.net.crt
smtpd_tls_cert_file = /etc/letsencrypt/live/smtp.linuxed.net/cert.pem
#smtpd_tls_key_file = /etc/pki/postfix/mx01.virt.linuxed.net.key
smtpd_tls_key_file = /etc/letsencrypt/live/smtp.linuxed.net/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = yes
tls_random_source = dev:/dev/urandom
transport_maps = mysql:/etc/postfix/mysql-transport.cf, regexp:/etc/postfix/transport_regexp
unknown_local_recipient_reject_code = 550
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf, regexp:/etc/postfix/virtual_regexp
smtpd_sender_login_maps = mysql:/etc/postfix/mysql-virtual.cf, regexp:/etc/postfix/virtual_regexp

Et voici le fichier /etc/postfix/master.cf:

smtp      inet  n       -       n       -       -       smtpd
pickup    fifo  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
smtp      unix  -       -       n       -       -       smtp
relay     unix  -       -       n       -       -       smtp
        -o fallback_relay=
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
old-cyrus unix  -       n       n       -       -       pipe
  flags=R user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -m ${extension} ${user}
cyrus     unix  -       n       n       -       -       pipe
   user=cyrus argv=/usr/lib/cyrus-imapd/deliver -r ${sender} -m ${extension} ${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=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
retry     unix  -       -       n       -       -       error
smtp-amavis   unix   -   -   y   -   2   lmtp -o smtp_data_done_timeout=1200 -o disable_dns_lookup=yes
127.0.0.1:10025 inet n - y - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o mynetworks_style=host -o strict_rfc821_envelopes=yes -o smtpd_error_sleep_time=0 -o alias_maps= -o relocated_maps= -o virtual_alias_maps= -o virtual_mailbox_maps=

Le fichier pour la resolution canonique dans la base MySQL /etc/postfix/mysql-canonical.cf:

hosts = [DB HOST]
user = [DB USER]
password = [DB PASS]
dbname = [DB NAME]
table = virtual
select_field = alias
where_field = username
additional_conditions = and status = '1' limit 1

Le fichier pour la resolution des domaines gérés par le serveur /etc/postfix/mysql-mydestination.cf:

hosts = [DB HOST]
user = [DB USER]
password = [DB PASS]
dbname = [DB NAME]
table = domain
select_field = domain_name
where_field = domain_name

Le fichier pour la resolution des domaines à relayer /etc/postfix/mysql-relay.cf:

hosts = [DB HOST]
user = [DB USER]
password = [DB PASS]
dbname = [DB NAME]
table = domain
select_field = transport
where_field = domain_name

Le fichier pour la table des transports /etc/postfix/mysql-transport.cf:

hosts = [DB HOST]
user = [DB USER]
password = [DB PASS]
dbname = [DB NAME]
table = domain
select_field = transport
where_field = domain_name

Le fichier pour la gestion des comptes virtuels /etc/postfix/mysql-virtual.cf:

hosts = [DB HOST]
user = [DB USER]
password = [DB PASS]
dbname = [DB NAME]
table = virtual
select_field = dest
where_field = alias
additional_conditions = and status = '1'

Coté Mysql, voici la structure_des_bases_pour_la_gestion_des_mails.

Pour la partie authentification des utilisateurs en pop/imap il faut installer le support mysql pour pam avec le package pam_mysql:

# yum install pam_mysql

Le fichiers /etc/pam.d/pop, /etc/pam.d/imap, /etc/pam.d/sieve sont modifiés pour avoir le contenu suivant:

#%PAM-1.0
auth    sufficient      pam_mysql.so user=[DB USER] passwd=[DB PASS] host=[DB HOST] db=[DB NAME] table=accountuser usercolumn=username
passwdcolumn=password crypt=1 logtable=log logmsgcolumn=msg logusercolumn=user loghostcolumn=host logpidcolumn=pid logtimecolumn=time
account required        pam_mysql.so user=[DB USER] passwd=[DB PASS] host=[DB HOST] db=[DB NAME] table=accountuser usercolumn=username
passwdcolumn=password crypt=1 logtable=log logmsgcolumn=msg logusercolumn=user loghostcolumn=host logpidcolumn=pid logtimecolumn=time

Pour l'antispam, les packages amavisd-new, clamav et spamassassin doivent être installés.

# yum install amavisd-new clamav spamassassin

Voir le fichier de configuration d'amavis: /etc/amavisd/amavisd.conf

Voici le contenu du fichier /etc/clamd.d/amavisd.conf:

# Use system logger.
LogSyslog yes

# Specify the type of syslog messages - please refer to 'man syslog'
# for facility names.
LogFacility LOG_MAIL

# This option allows you to save a process identifier of the listening
# daemon (main thread).
PidFile /var/run/amavisd/clamd.pid

# Remove stale socket after unclean shutdown.
# Default: disabled
FixStaleSocket yes

# Run as a selected user (clamd must be started by root).
User amavis

# Path to a local socket file the daemon will listen on.
LocalSocket /var/spool/amavisd/clamd.sock

Mettre à jour la base antivirus:

 freshclam

Pour la partie collecte de mails coté utilisateur, il faut installer le package cyrus-imapd. Cyrus fournit les services IMAP et POP3 en version standard et sécurisée.

# yum install cyrus-imapd

Configuration du fichier /etc/cyrus.conf:

# standard standalone server implementation

START {
  # do not delete this entry!
  recover       cmd="ctl_cyrusdb -r"

  # this is only necessary if using idled for IMAP IDLE
  idled         cmd="idled"
}

# UNIX sockets start with a slash and are put into /var/lib/imap/sockets
SERVICES {
  # add or remove based on preferences
  imap          cmd="imapd" listen="imap" prefork=5
  imaps         cmd="imapd -s" listen="imaps" prefork=1
  pop3          cmd="pop3d" listen="pop3" prefork=3
  pop3s         cmd="pop3d -s" listen="pop3s" prefork=1
  sieve         cmd="timsieved" listen="sieve" prefork=1

  # these are only necessary if receiving/exporting usenet via NNTP
#  nntp         cmd="nntpd" listen="nntp" prefork=3
#  nntps                cmd="nntpd -s" listen="nntps" prefork=1

  # at least one LMTP is required for delivery
#  lmtp         cmd="lmtpd" listen="lmtp" prefork=0
  lmtpunix      cmd="lmtpd" listen="/var/lib/imap/socket/lmtp" prefork=1

  # this is only necessary if using notifications
#  notify       cmd="notifyd" listen="/var/lib/imap/socket/notify" proto="udp" prefork=1
}

EVENTS {
  # this is required
  checkpoint    cmd="ctl_cyrusdb -c" period=30

  # this is only necessary if using duplicate delivery suppression,
  # Sieve or NNTP
  delprune      cmd="cyr_expire -E 3" at=0400

  # this is only necessary if caching TLS sessions
  tlsprune      cmd="tls_prune" at=0400

  # index mailboxes
  squat cmd="squatter -r *" period=60
  squat cmd="squatter -r *@*" period=60
}

⇒ Attention: squat est assez gourmand. Pourquoi est-il en double??

Configuration de la partie collecte des mails, avec le fichier /etc/imapd.conf:

postmaster: postmaster@domaine.com
configdirectory: /var/lib/imap
partition-default: /var/spool/imap
admins: admin cyrus
sieve_admins: admin cyrus
sievedir: /var/lib/imap/sieve
sendmail: /usr/sbin/sendmail
hashimapspool: true
sasl_pwcheck_method: saslauthd
sasl_mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5
tls_cert_file: /etc/pki/cyrus-imapd/cyrus-imapd.pem
tls_key_file: /etc/pki/cyrus-imapd/cyrus-imapd.pem
tls_ca_file: /etc/pki/tls/certs/ca-bundle.crt
allowanonymouslogin: no
allowplaintext: yes
allowplainwithouttls: yes
servername: lutin
dracinterval: 0
drachost: localhost
createonpost: 1
unixhierarchysep: yes
virtdomains: yes

Pour migrer d'un serveur Cyrus vers un autre serveur Cyrus, il faut synchroniser les fichiers des comptes cyrus, ainsi que les fichiers des boites mails. Il faut bien sur arreter cyrus sur les 2 machines.

# rsync -azC --progress /var/lib/imap/* serveur2:/var/lib/imap/
# rsync -azC --progress /var/spool/imap/* serveur2:/var/spool/imap/

⇒ Attention: penser à restaurer les contextes SELinux avec la commande restorecon sur ces répertoires.

Pour générer le certificat:

# openssl req -new -nodes -out req.pem -keyout key.pem
# openssl rsa -in key.pem -out new.key.pem

A faire signer ensuite par un CA. Ou on signe soi-même:

# openssl x509 -in req.pem -out ca-cert -req -signkey new.key.pem -days 999
# cat ca-cert>> new.key.pem

Il s'agit d'une interface web d'administration de Cyrus. Le site officiel est http://www.web-cyradm.org.

Il est necessaire d'installer le support Pear::DB pour utiliser web-cyradm:

# yum install php-pear-DB

L'authentification se fera avec cyrus-sasl, il faudra installer le package cyrus-sasl-mysql. On active le support sasl avec postfix, le fichier de configuration suivant /usr/lib/sasl/smtpd.conf doit avoir le contenu suivant:

pwcheck_method: saslauthd
mech_list: plain login
saslauthd_version: 2

Mais c'est le contenu du fichier /usr/lib/sasl2/smtpd.conf qui est utilisé:

pwcheck_method: saslauthd
#mech_list: plain login
#pwcheck_method: pam
#pwcheck_method: auxprop
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_database: mail
sql_user: mail
sql_passwd: facteur
sql_select: SELECT password FROM accountuser WHERE username='%u' and domain_name='%r';

Il faut ensuite indiquer à saslauthd d'utiliser l'adresse mail complete en tant que login utilisateur (login@domain.com) avec l'option -r dans le fichier /etc/sysconfig/saslauthd:

# Directory in which to place saslauthd's listening socket, pid file, and so
# on.  This directory must already exist.
SOCKETDIR=/var/run/saslauthd

# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=pam

# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
FLAGS="-r"

Pour que postfix dispose des mécanismes SASL, il faut au minimum installer le paquet cyrus-sasl-plain:

 # yum install cyrus-sasl-plain

⇒ Attention à SELinux qui par défaut peut bloquer les connexions mysql depuis saslauthd.

Il existe squirrelmail et roundcube dans la categorie des excellents webmail.

# yum install squirrelmail

ou

# yum install roundcube

Il peut manquer certaines dépendances pour roundcube, notemment php-mcrypt:

# yum install php-mcrypt

SquirrelMail

La configuration se fait dans /etc/squirrelmail/config.php mais il est plus facile de passer par le script de configuration:

# /usr/share/squirrelmail/config/conf.pl

Maintenant que tout est configuré, il ne faut pas oublier d'activer au demarrage les services necessaires à la messagerie:

# chkconfig postfix on
# chkconfig saslauthd on
# chkconfig mysqld on
# chkconfig cyrus-imapd on

Pour activer IPv6 sur lighttpd, voici le contenu du fichier /etc/lighttpd/conf.d/ipv6.conf:

server.use-ipv6 = "enable"

Migration de Luchta vers Goigniu ici.

  • linuxed/serverlinuxed.1588953889.txt.gz
  • Dernière modification : 2020/05/08 16:04
  • de madko