Perdition (proxy pop/imap/sieve)

L’idée est d’accéder aux services de messagerie (pop/imap/sieve) depuis une machine en DMZ. Cette machine ne disposera pas d’un serveur POP/IMAP ni d’un accès au stockage des mails. Pour que l’utilisateur accède à ses emails, on passera donc par un proxy: perdition.

Dans les contraintes que l’on s’ajoute, on veut que les services ne soient utilisables qu’en mode sécurisé (TLS ou SSL).

Pour la suite:

  • $HIDDENSERVER correspond au serveur de POP/IMAP/SIEVE réel ;
  • $PORT correspond au port sur lequel le service est disponible sur $HIDDENSERVER
  • $MAILSRVCRT / $MAILSRVKEY sont les fichiers (avec leur chemin complet) avec les clés publiques/privées du serveur de mail ;
  • sur le serveur $HIDDENSERVER, il faut que l’on puisse se connecter en clair ou alors ajouter tls_outgoing à ssl_mode pour que perdition se connecte à $HIDDENSERVER en TLS ou ssl_outgoing pour utiliser du SSL (cf: perdition(8));
  • la configuration SSL/TLS peut paraître redondante, mais vu qu’il y a un processus par service, on est obligé de répéter toute la conf 🙁

/etc/default/perdition:

Ici, on reste standard: on se contente de dire à l’init qu’on veut démarrer perdition et que l’on veut tout:

RUN_PERDITION=yes
POP3=yes
POP3_FLAGS=
POP3S=yes
POP3S_FLAGS=
IMAP4=yes
IMAP4_FLAGS=
IMAP4S=yes
IMAP4S_FLAGS=
MANAGESIEVE=yes
MANAGESIEVE_FLAGS=

/etc/perdition/perdition.conf:

username nobody
group nogroup
connection_limit 1024 # 0: unlimited, default: 64

imap – /etc/perdition/perdition.imap4.conf:

nb: ici PORT=143

outgoing_server $HIDDENSERVER
outgoing_port $PORT
protocol IMAP4
imap_capability "IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA ACL ACL2=UNION STARTTLS"
ssl_mode tls_listen,tls_listen_force # tls_listen active le support de STARTTLS, tls_listen_force rend son utilisation obligatoire
ssl_ca_accept_self_signed # si nécessaire
ssl_cert_file $MAILSRVCRT
ssl_key_file $MAILSRVKEY

imap4s – /etc/perdition/perdition.imap4s.conf:

nb: ici PORT=143

outgoing_server $HIDDENSERVER
outgoing_port $PORT
protocol IMAP4S
imap_capability "IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA ACL ACL2=UNION"
ssl_mode ssl_listen
ssl_ca_accept_self_signed # si nécessaire
ssl_cert_file $MAILSRVCRT
ssl_key_file $MAILSRVKEY

pop3 – /etc/perdition/perdition.pop3.conf:

nb: ici PORT=110

outgoing_server $HIDDENSERVER
outgoing_port $PORT
protocol POP3
ssl_mode tls_listen,tls_listen_force # tls_listen active le support de STLS, tls_listen_force rend son utilisation obligatoire
ssl_ca_accept_self_signed # si nécessaire
ssl_cert_file $MAILSRVCRT
ssl_key_file $MAILSRVKEY

pop3s – /etc/perdition/perdition.pop3s.conf:

nb: ici PORT=110

outgoing_server $HIDDENSERVER
outgoing_port $PORT
protocol POP3S
ssl_mode ssl_listen
ssl_ca_accept_self_signed # si nécessaire
ssl_cert_file $MAILSRVCRT
ssl_key_file $MAILSRVKEY

sieve – /etc/perdition/perdition.managesieve.conf:

nb: ici PORT=4190

outgoing_server $HIDDENSERVER
outgoing_port $PORT
protocol MANAGESIEVE
ssl_mode tls_listen,tls_listen_force # tls_listen active le support de STARTTLS, tls_listen_force rend son utilisation obligatoire
ssl_ca_accept_self_signed # si nécessaire
ssl_cert_file $MAILSRVCRT
ssl_key_file $MAILSRVKEY

Tests:

Pour le détail des tests, voir mon mémo telnet.

  • test simple en clair (on doit se faire jeter):
telnet monippublique 110 (ou 143 ou 4190)
  • test avec TLS:
openssl s_client -starttls pop -connect monippublique:110
openssl s_client -starttls imap -connect monippublique:143
gnutls-cli --starttls -p 4190 monippublique
  • test avec SSL
openssl s_client -connect monippublique:995
openssl s_client -connect monippublique:993

Pour aller plus loin: fail2ban

le filtre – /etc/fail2ban/filter.d/perdition.conf:

[Definition]
failregex = perdition\.[a-z0-9]+\[[0-9]+\]: Auth: <HOST>:[0-9]+.*status="failed

le jail – /etc/fail2ban/jail.local:

À la fin du fichier jail.local, on rajoute simplement:

[perdition]
enabled  = true
port     = 110,995,143,993,4190
filter   = perdition
logpath  = /var/log/mail.log

Autres possibilités de perdition (non étudiées/utilisées/testées):

  • dispatcher les connexions aux services de messagerie vers plusieurs serveurs réels en fonction de l’utilisateur (ou du groupe d’utilisateurs)
  • authentification directement faite par perdition (via mysql, postgresql ou ldap)