Servei de correu (postfix, courier, saslauth i openLDAP)

Objectiu:

Aquest tutorial explica com instal·lar i configurar un servidor de correu postfix. A més, per que els clients puguin consultar el seu correu, també instal·larem els paquets pop3 i imap de Courier.

També ens interessa que els clients s’autentiquin, tant per consultar el seu correu, com per enviar-ne. De les dues maneres, volem autenticar contra un servidor LDAP. Per això utilitzarem el paquet SASLAuth.

Finalment, per fer contents els nostres usuaris els hi instal·larem un antivirus i antispam al servidor. D’aquesta feina se n’encarregarà MailScanner conjuntament amb Spamassassin i Clam Anti-Virus.

Què és un servidor de correu?

A aquestes alçades explicar el que és un servidor de correu és una mica redundant, oi 😉 ?

Obtenció del software necessari:

Partim de la base que disposem d’un servidor amb Ubuntu 7.04 Server. És molt probable que aquest tutorial funcioni sobre d’altres distribucions, però ha estat provat principalment sobre Ubuntu.

NOTA: És molt recomanable seguir els tutorials d’aquesta mateixa pàgina abans de continuar ja que es suposaran implementats:

Utilitzarem l’eina apt per aconseguir tot el software necessari. S’ha entrat al sistema utilitzant l’usuari root. Per començar actualitzem les nostres fonts de apt.

$ apt-get update

Per instal·lar el paquet postfix executarem la següent comanda:

$ apt-get install postfix postfix-ldap procmail

Durant la instal·lació se’ns faran una sèrie de preguntes. Respondrem el següent:

  • Tipus de configuració?: Lloc d’Internet
  • Nom del correu: domini.com *

* Fixeu-vos que, a diferencia d’altres tutorials, no s’ha utilitzat domini.local, en aquest cas volem que el servidor de correu sigui accessible d’arreu.

Per defecte els arxius de configuració de postfix s’instal·len a la carpeta /etc/postfix. Particularment haurem de modificar l’arxiu /etc/postfix/main.cf i el /etc/postfix/master.cf. Podem veure que el sistema està funcionant si provem de connectar via telnet al port 25:

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ubuntu ESMTP Postfix

Tot correcte fins aquí.

Configuració:

El següent que farem és reconfigurar el paquet postfix:

$ dpkg-reconfigure postfix

Aquesta segona vegada ja ens demanarà més coses:

  • Tipus de configuració?: Lloc d’Internet
  • On hauria d’anar a parar el correu dirigit a root?: (en blanc)
  • Nom del correu: domini.com *
  • Altres destinacions per a les quals s’accepta correu?: domini.com
  • Forçar actualitzacions síncrones a la cua de correu?:
  • Xarxes locals?: 127.0.0.0/8
  • Voleu utilitzar procmail per al lliurament local?:
  • Mida màxima de la bústia: 0
  • Caràcter d’extensió de les adreces locals?: +
  • Protocols d’Internet?: ambdós

Ara l’arxiu main.cf quedarà modificat amb les noves opcions, el nostre és com aquest:

myhostname = ubuntu

smtpd_banner = $myhostname ESMTP $mail_name
biff = no

append_dot_mydomain = no
delay_warning_time = 4h

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = domini.com
relayhost =
mynetworks = 127.0.0.0/8
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

La configuració actual permet només als usuaris locals enviar missatges, això és, des de la mateixa màquina del servidor. L’integració amb LDAP ens permetrà dues coses interessants:

  • definir àlies de correu en el servidor LDAP
  • autenticar els usuaris als que permetrem fer relay a traves del servidor de correu.

El primer que farem és afegir un Unitat Organitzativa al nostre LDAP. Hem preparat el següent arxiu ldif (postfix.ldif):

dn:ou=Postfix,dc=domini,dc=local
ou: Postfix
objectClass: top
objectClass: organizationalUnit
userPassword: secret

dn:ou=alias,ou=Postfix,dc=domini,dc=local
ou: alias
objectClass: top
objectClass: organizationalUnit

Per afegir-lo al nostre servidor utilitzarem la següent comanda:

$ apt-get install ldap-utils
$ ldapadd -x -D "cn=admin,dc=domini,dc=local" -W -f postfix.ldif
Enter LDAP Password: secret
adding new entry "ou=Postfix,dc=domini,dc=local"
adding new entry "ou=alias,ou=Postfix,dc=domini,dc=local"

Instal·lació Courier i relacionats:

Els paquets de Courier afegeixen el següent al nostre servidor:

  • possibilitat d’accés amb pop3 o imap
  • respectius mòduls d’autenticacióó
  • schema LDAP

Els paquets que hem d’instal·lar són:

$ apt-get install courier-ldap courier-pop courier-imap courier-authdaemon

Aquesta comanda farà instal·lar força paquets extres, els podem acceptar tots. Durant la instal·lació ens demanara si volem crear uns directoris per l’administració via web, no és necessari en el nostre.

Un cop feta la instal·lació podem comprobar amb nmap que tot està funcionant (encara sense configurar, però):

$ nmap localhost
Starting Nmap 4.20 ( http://insecure.org ) at 2007-06-19 18:48 CEST
Interesting ports on localhost (127.0.0.1):
Not shown: 1690 closed ports
PORT     STATE SERVICE
25/tcp   open  smtp
53/tcp   open  domain
110/tcp  open  pop3
143/tcp  open  imap
389/tcp  open  ldap

Nmap finished: 1 IP address (1 host up) scanned in 0.068 seconds

Anem ja a configurar tots els accessos al directori LDAP. El primer que fem és afegir el schema al directori.

$ cd /etc/ldap/schema/
$ cp /usr/share/doc/courier-authlib-ldap/authldap.schema.gz .
$ gunzip authldap.schema.gz

Com veurem a més endavant, guardarem tot el correu en una carpeta fora dels Homes dels usuaris del sistema, cosa que es baralla una mica amb la configuraciño típica de Courier. Així doncs, i aprofitant que estem en un mon linux on tenim llibertat d’acció modificarem una mica l’authldap.schema per adaptar-lo a les nostres necessitats. Afegirem un nou atribut:

attributetype ( 1.3.6.1.4.1.10018.1.1.15 NAME 'mailrootstore'
DESC 'Root folder for mail repositories'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

i modificarem l’objectClass CourierMailAccount:

objectclass ( 1.3.6.1.4.1.10018.1.2.1 NAME 'CourierMailAccount' SUP top AUXILIARY
DESC 'Mail account object as used by the Courier mail server'
MUST ( mail $ homeDirectory )
MAY ( uidNumber $ gidNumber $ mailbox $ uid $ cn $ gecos $ description $ loginShell $ quota $ userPassword $ clearPassword $ defaultdelivery $ disableimap $ disablepop3 $ disablewebmail $ sharedgroup $ disableshared $ mailhost $ mailrootstore) )

El que hem fet és afegir el mailrootstore, que definirem com la ruta estàtica a l’arrel d’una bústia de correu d’un usuari.

A continuació modifiquem l’arxiu /etc/ldap/slapd.conf per a que contingui la referència a aquest nou schema:

include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/authldap.schema

Afegir usuaris al directori LDAP amb suport de correu:

Ja podem doncs, afegir usuaris al directori. Ho podem fer de diverses maneres:

  • amb la comanda ldapadd a partir d’un fitxer .ldif
  • amb l’eina gràfica phpldapadmin, que és força més còmoda.
  • afegir els atributs de correu a usuaris ja existents que poguem tenir d’altres tutorials, com per exemple el de samba.

Els atributs a afegir al directori són:

  • objectClass: CourierMailAccount
  • mail: usuari@domini.com
  • mailrootstore: /home/busties/usuari
  • mailbox: Maildir/
  • quota: 0

Triem l’opció que ens vagi millor.

Per a que els missatges de correu es puguin guardar al disc fa falta crear una estructura de directoris. Concretament utilitzant l’eina maildirmake.

$ mkdir -pv -m 2755 /home/busties
$ chown -v root:Domain Users /home/busties

El grup que utilitzem és indiferent, en el nostre cas usem Domain Users. Tots els usuaris del correu hauran de pertànyer a aquest grup, si no existeix s’haurà de crear.

Aleshores, per a cada usuari haurem de crear un arxiu ocult anomenat .procmailrc amb el següent contingut:

PATH=/usr/bin:/bin:/usr/local/bin:.
MAILDIR=/home/busties/$LOGNAME/Maildir
DEFAULT=$MAILDIR/

Si ho creem en /etc/skel evitarem fer-ho manualment cada cop que afegim un usuari al sistema.

Finalment, un pas que si hem de fer manualment és crear l’estructura de correu amb:

$ mkdir /home/busties/usuari
$ cd /home/busties/usuari
$ maildirmake Maildir
$ chmod -R 0700 /home/busties/usuari
$ chown usuari:Domain Users /home/busties/usuari

L’estructura està llesta per emmagatzemar correus. Com això ho haurem de fer per a cada usuari no seria mala idea generar un script que ho fes automàticament.

Afegir àlies a l’LDAP:

És interessant poder definir àlies de correu. Els emmagatzemarem a la OU que hem creat abans al directori LDAP. Per fer un exemple en crearem un per mitja d’un arxiu alias.ldif:

dn: cn=Info,ou=alias,ou=Postfix,dc=domini,dc=local
cn: Info
sn: Exemple
mail: info@domini.com
maildrop: usuari@domini.com
objectClass: inetOrgPerson
objectClass: CourierMailAlias
objectClass: top

Per afegir aquest arxiu alias.ldif al directori farem:

$ ldapadd -x -D "cn=admin,dc=domini,dc=local" -W -f alias.ldif
Enter LDAP Password: secret
adding new entry "cn=Info,ou=alias,ou=Postfix,dc=domini,dc=local"

Ara hem de modificar de nou l’arxiu /etc/postfix/main.cf per a que aquest sapiga on anar a buscar la informació LDAP. Afegirem les següents línies a l’arxiu:

virtual_maps = ldap:valiases
valiases_server_host = adreça_ip_del_servidor_LDAP
valiases_search_base = ou=alias,ou=Postfix,dc=domini,dc=local
valiases_query_filter = (&(mail=%s)(objectClass=CourierMailAlias))
valiases_result_attribute = maildrop
valiases_bind = no

A més l’entrega local també l’ha de gestionar el Postfix amb l’accés a l’LDAP, afegim el següent a la configuració:

local_transport = local
local_recipient_maps = ldap:/etc/postfix/ldap_alias.cf unix:passwd.byname $alias_maps

L’arxiu /etc/postfix/ldap_alias.cf permet la connexió al servidor. Aquest conté:

domains_server_host = localhost
domains_search_base = dc=domini,dc=local
bind_dn = cn=admin,dc=domini,dc=local
scope = sub
bind = yes
version= 3
bind_pw = secret
server_host = localhost
server_port = 389
search_base = ou=Users,dc=domini,dc=local
query_filter = (mail=%s)
result_attribute = mail

En aquest punt ja podem recarregar la configuració del postfix:

$ /etc/init.d/postfix reload

Enviar el primer missatge:

Podem enviar un missatge mitjançant:

$ sendmail info@domini.com
test
.

L’usuari usuari@domini.com hauria de tenir un missatge nou a la carpeta /home/busties/usuari/Maildir/new/

Accés via pop3 i imap (configuració courier):

Per que els usuaris que es connectin via pop3 o imap es puguin autenticar contra l’LDAP també haurem de configurar l’authdaemon de courier. L’arxiu que s’ha de modificar és /etc/courier/authdaemonrc que haurà de contenir la següent línia:

authmodulelist="authldap"

Per configurar l’accés LDAP hem de modificar l’arxiu /etc/courier/authldaprc. Ha de contenir:

LDAP_URI                ldap://127.0.0.1
LDAP_PROTOCOL_VERSION   3
LDAP_BASEDN             dc=domini, dc=local
LDAP_BINDDN             cn=admin, dc=domini, dc=local
LDAP_BINDPW             secret
LDAP_TIMEOUT            5
LDAP_MAIL               uid
LDAP_FILTER             (objectClass=CourierMailAccount)
LDAP_HOMEDIR            mailrootstore
LDAP_MAILDIR            mailbox
LDAP_FULLNAME           cn
LDAP_CRYPTPW            userPassword
LDAP_DEREF              never
LDAP_UID uidNumber
LDAP_GID gidNumber
LDAP_AUTHBIND 1
LDAP_TLS                0

Finalment reiniciem el servei d’autenticació del courier:

$ /etc/init.d/courier-authdaemon restart

A partir d’aquest punt ja podem configurar els nostres clients pop3 i imap per accedir al servidor.

Ja tenim un servidor de correu amb autenticació pop3 i imap amb LDAP. L’informació dels àlies també es guarda a l’LDAP. Només ens falta l’autenticació en el moment de l’enviament. Això ho resoldrem amb SASLAuth.

Autenticació SMTP (SASLAuth):

La llibreria SASL ve a ser l’autenticació per a SMTP. La instal·lació es fa amb:

$ apt-get install sasl2-bin libsasl2-modules

El primer que farem és canviar l’arxiu /etc/default/saslauthd, ha de posar:

START=yes
MECHANISMS="ldap"

A continuació crearem l’arxiu /etc/saslauthd.conf amb el contingut:

ldap_servers: ldap://127.0.0.1
ldap_bind_dn: cn=admin, dc=domini, dc=local
ldap_bind_pw: secret
ldap_search_base: ou=Users,dc=domini,dc=local
ldap_filter: uid=%u
ldap_password_attr: userPassword

i ja el podem iniciar:

$ /etc/init.d/saslauthd start

Ara modifiquem l’arxiu /etc/postfix/master.cf, hem de treure el dimoni smtpd del chroot modificant la línia al respecte que quedi de la següent manera:

smtp      inet  n       -       n       -       -       smtpd

i recarreguem el postfix:

$ /etc/init.d/postfix reload

Afegim l’usuari postfix al grup sasl:

$ adduser postfix sasl

i ja podem afegir les següents línies al final del /etc/postfix/main.cf, controlen els permisos dels usuaris autenticats amb SASL:

smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_application = smtpd
smtpd_recipient_restrictions = reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit_auth_destination permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject

L’últim que queda fer és crear l’arxiu /etc/postfix/sasl/smtpd.conf amb el contingut:

pwcheck_method: saslauthd
mech_list: login

podem provar que l’autenticació SASL funciona amb la comanda:

$ testsaslauthd -u usuari -p secret
0: OK "Success."

i a correr! 🙂 A la segona part d’aquest tutorial afegirem Antispam i Antivirus.