serverlinuxed

Ceci est une ancienne révision du document !


~~ODT~~

Configuration du serveur Linuxed

Distribution GNU/Linux Fedora 12 ou CentOS 5.x

  • 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

A faire.

Cheminement d'un mail:

postfix :25 ⇒ sqlgrey :10030 (pour gestion liste grise)

postfix ⇒ amavisd :10024 (pour filtrage du contenu, antivirus et spam)

amavisd ⇒ postfix :10025 (pour livraison)

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é:

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
mydomain = linuxed.net
myorigin = $mydomain
inet_interfaces = all 
mydestination = $myhostname, localhost.$mydomain, localhost, mysql:/etc/postfix/mysql-mydestination.cf
unknown_local_recipient_reject_code = 550
mynetworks = 192.168.0.0/16, 127.0.0.1, 172.16.3.2, 172.16.2.2
relay_domains = $mydestination
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
sender_canonical_maps = mysql:/etc/postfix/mysql-canonical.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf, regexp:/etc/postfix/virtual_regexp
transport_maps = mysql:/etc/postfix/mysql-transport.cf, regexp:/etc/postfix/transport_regexp
recipient_delimiter = +
 
mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
cyrus_destination_recipient_limit=1
  
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         xxgdb $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.4.5/samples
readme_directory = /usr/share/doc/postfix-2.4.5/README_FILES
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
broken_sasl_auth_clients = yes
smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_hostname
smtpd_sender_restrictions = check_client_access hash:/etc/postfix/access, reject_non_fqdn_sender, reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain, check_policy_service inet:[127.0.0.1]:10030
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
content_filter = smtp-amavis:[127.0.0.1]:10024
smtpd_helo_required = yes
unknown_local_recipient_reject_code = 550
disable_vrfy_command = yes
smtpd_data_restrictions = reject_unauth_pipelining

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"
  • serverlinuxed.1356345480.txt.gz
  • Dernière modification : 2015/10/11 16:30
  • (modification externe)