Desmitificando Postfix

Artículo aparecido en la revista TuxInfo nº 19.

En este tutorial, se tratará de instalar postfix con courier imap, y un
repositorio ldap, para las consultas. Se generará un repositorio LDAP, con
contenedores para usuarios, y agenda de direcciones, para ser usado con el
Squirrelmail. Puntualmente, yo usaré una versión de Squirrelmail modificada,
llamada Squirrelmail Outlook, que le da una visión muy parecida a la del
Outlook Web Access (OWA).

A la vez, lo que se buscará con este tutorial, es sentar las bases de
funcionamiento de un servidor Postfix con LDAP, y webmail. Estas mismas
bases serán las que necesitaremos para entender cómo funciona Zimbra, una
poderosa solución de correo electrónico, que explicaremos en un futuro
artículo.

Lo primero que haremos, es instalar el postfix.
root@marcelo:/home/marcelo# apt­get install postfix
smtpd_banner = Mailserver de Ejemplo
biff = no
home_mailbox=Maildir/
#[1] esto no va, pero es mostrar que escogemos maildir
append_dot_mydomain = no
myhostname = webmail.ejemplo.com.ar
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = webmail.ejemplo.com.ar,ejemplo.com.ar
relayhost =
mynetworks = 127.0.0.0/8, 192.168.1.0/24
mailbox_command =
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

Luego, lo configuraremos, para que el tipo de buzón que reciba, sea Maildir, para que
nuestro hostname, sea ejemplo.com, y para que las redes que permita relay, sean las
192.168.0.1/24, y la red de la placa local, 127.0.0.1/8

Le pondremos el banner, de Mailserver de Ejemplo, esto es lo que mostrará cuando se
conecte.
Cuando decimos mailbox_size_limit, decimos que no tenemos tamaño máximo.

Ahora, necesitaremos configurar el servidor IMAP, y el servidor pop. Para las primeras
prácticas, al servidor IMAP, y al pop, lo haremos validar por PAM. Luego, lo haremos
validar por OpenLDAP.
root@marcelo:/home/marcelo# apt­get install courier­imap
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes extras:

courier­authdaemon courier­authlib courier­authlib­userdb
courier­base
libfam0 libltdl3
Paquetes sugeridos:
courier­doc courier­imap­ssl
Paquetes recomendados
fam
Se instalarán los siguientes paquetes NUEVOS:
courier­authdaemon courier­authlib courier­authlib­userdb
courier­base courier­imap libfam0 libltdl3
0 actualizados, 7 se instalarán, 0 para eliminar y 186 no
actualizados.

A este punto, vale aclarar, que courier sólo acepta leer mails en formato Maildir. Por eso,
vale destacar en el archivo main.cf , de la configuración de postfix , la importancia de [1],
donde definimos que el formato de buzón, sea Maildir.

En alguna parte, nos va a preguntar, si queremos crear la consola de administración web,
a lo que contestamos que no.

Luego, realizamos lo mismo con el courier-pop.
Creando árbol de dependencias
Leyendo información de estado… Hecho
Paquetes sugeridos:
courier-doc courier-pop-ssl
Se instalarán los siguientes paquetes NUEVOS:
courier-pop

Ya digamos, que tenemos básicamente, todo lo que se necesitaría para enviar y recibir
correos, servidor pop, imap, y servidor de correo smtp. Ahora , vamos por más, lo vamos
a configurar, con antivirus, antispam, OpenLDAP, y libretas de direcciones compartidas
con el Squirrelmail!.

Vamos con lo complicado primero.
Sin exponer demasiado, que es LDAP, y su implementación de OpenLDAP, voy a decir
que es un servicio que sirve para la validación centralizada de diferentes servicios. Así
como para validar los usuarios del sistema, existe PAM, que utiliza los usuarios del
/etc/passwd, para validar el login, y demás, también podríamos validar los servicios vía
LDAP. Los invito a que revisen su directorio /etc/pam.d, y verán allí los diferentes servicios
que se están validando vía pam (Que es por defecto como se validan). Podría usarse
también para validar, MySQL, pero este tutorial escapa la validación por mysql, ya que
usaremos la integración con openldap, para las libretas de direcciones compartidas.

root@marcelo:/mnt/lost+found# apt­get install slapd
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes extras:
libdb4.2 libiodbc2 libldap­2.2­7
Paquetes sugeridos:
ldap­utils
Paquetes recomendados
db4.2­util
Se instalarán los siguientes paquetes NUEVOS:
libdb4.2 libiodbc2 libldap­2.2­7 slapd

En la instalación, nos preguntará password de admin, y eso, a este punto lo saltearemos,
pues tenemos una configuración especial para nuestro servidor.

Como veremos, se instalarán varios programas. SLAPD es el servidor que corre LDAP, y
después, son librerías que se usan. Se necesitarán, y vamos a instalar, las utilidades
clientes de ldap (ldap utils), y las utilidades de berkley db, (db4.2-util).

root@marcelo:/mnt/lost+found# apt-get install ldap-utils db4.2-util
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes NUEVOS:
db4.2-util ldap-utils

Para borrar los datos de LDAP que ha generado el debconf, hacemos lo siguiente

rm -fr /var/lib/ldap/*

copiamos nuestra configuración personalizada, donde destacaremos varios puntos.

# Allow LDAPv2 binds
allow bind_v2
# This is the main slapd configuration file. See slapd.conf(5) for more
# info on the configuration options.

#######################################################################
# Global Directives:

# Features to permit
#allow bind_v2

# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
# Schema check allows for forcing entries to
# match schemas for their objectClasses’s
schemacheck     on

# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile         /var/run/slapd/slapd.pid

# List of arguments that were passed to the server
argsfile        /var/run/slapd.args

# Read slapd.conf(5) for possible values
loglevel        0

# Where the dynamically loaded modules are stored
modulepath /usr/lib/ldap
moduleload back_bdb

#######################################################################
# SSL:
# Uncomment the following lines to enable SSL and use the default
# snakeoil certificates.
#TLSCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
#TLSCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
#######################################################################
# Specific Backend Directives for bdb:
# Backend specific directives apply to this backend until another
# ‘backend’ directive occurs
backend  bdb
checkpoint 512 30

#######################################################################
# Specific Backend Directives for ‘other’:
# Backend specific directives apply to this backend until another
# ‘backend’ directive occurs
#backend  <other>
#######################################################################
# Specific Directives for database #1, of type bdb:
# Database specific directives apply to this databasse until another
# ‘database’ directive occurs
database        bdb

# The base of your directory in database #1
suffix          «dc=ejemplo,dc=com,dc=ar»
rootdn  «cn=admin,dc=ejemplo,dc=com,dc=ar»
rootpw  nada
# Where the database file are physically stored for database #1
directory       «/var/lib/ldap»

# Indexing options for database #1
index           objectClass eq
# Save the time that the entry gets modified, for database #1
lastmod         on

# Where to store the replica logs for database #1
# replogfile /var/lib/ldap/replog

# The userPassword by default can be changed
# by the entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
# These access lines apply to database #1 only
access to attrs=userPassword
by dn=»cn=admin,dc=ejemplo,dc=com,dc=ar» write
by anonymous auth
by self write
by * none
# Ensure read access to the base for things like
# supportedSASLMechanisms.  Without this you may
# have problems with SASL not knowing what
# mechanisms are available and the like.

# Note that this is covered by the ‘access to *’
# ACL below too but if you change that as people
# are wont to do you’ll still need this if you
# want SASL (and possible other things) to work
# happily.
access to dn.base=»» by * read

# The admin dn has full write access, everyone else
# can read everything.
access to *
by dn=»cn=admin,dc=ejemplo,dc=com,dc=ar» write
by * read

Destaquemos las siguientes líneas.

suffix          «dc=ejemplo,dc=com,dc=ar»
rootdn  «cn=admin,dc=ejemplo,dc=com,dc=ar»
rootpw  nada
en estas líneas, lo que estamos declarando es.

suffix, sería el dominio del servidor de ldap. Si nuestro dominio es misol.org.ar, el suffix
sería

dc=misol,dc=org,dc=ar

rootdn, es el administrador de el servidor ldap. en este caso, sería el usuario admin,
declarado en
cn=admin,dc=ejemplo,dc=com,dc=ar
rootpw, es el password. Por comodidad a este ejemplo, lo dejé en texto claro. el password
es nada.
Luego, agregamos un archivo donde tenemos las definiciones básicas de los atributos
que necesitamos para LDAP.

Lo agregaremos en formato off-line, con el servidor sin validar, con el comando slapadd

El archivo a agregar, se llama data-agenda.ldif . NOTA: la extensión ldif, es la extensión
por defecto de los archivos que tienen datos a integrar en el servidor LDAP.
dn: dc=ejemplo,dc=com,dc=ar
objectClass: top
objectClass: dcObject
objectClass: organization
o: ejemplo
dc: ejemplo
structuralObjectClass: organization
entryUUID: 8b568d00-a010-102b-8267-c41632270fd5
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20070526200759Z
modifyTimestamp: 20070526200759Z
entryCSN: 20070526200759Z#000001#00#000000

dn: cn=admin,dc=ejemplo,dc=com,dc=ar
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e2NyeXB0fXBJYU1jbnBHUU8xbEE=
structuralObjectClass: organizationalRole
entryUUID: 8b628eac-a010-102b-8268-c41632270fd5
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20070526200759Z
modifyTimestamp: 20070526200759Z
entryCSN: 20070526200759Z#000002#00#000000

dn: ou=People,dc=ejemplo,dc=com,dc=ar
ou: People
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit

dn: ou=Libreta,dc=ejemplo,dc=com,dc=ar
ou: Libreta
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit

Sin extenderme en explicar LDAP, pues no es la intención de este tutorial, hemos creado
dos Unidades Organizacionales que serían los contenedores LDAP. Una unidad People,
donde contendrá todos los usuarios de el servidor, y otra agenda, que es
fundamentalmente para que el squirrelmail pueda consultar los usuarios de el sistema.

ahora, viene el comando de inserción, y luego, el de comprobación que todo ha salido
como queríamos!.
root@marcelo
root@marcelo
dn: dc=ejemplo,dc=com,dc=ar
objectClass: top
objectClass: dcObject
objectClass: organization
o: ejemplo
dc: ejemplo
structuralObjectClass: organization
entryUUID: 8b568d00­a010­102b­8267­c41632270fd5
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20070526200759Z
modifyTimestamp: 20070526200759Z
entryCSN: 20070526200759Z#000001#00#000000
dn: cn=admin,dc=ejemplo,dc=com,dc=ar
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin

description: LDAP administrator
userPassword:: e2NyeXB0fXBJYU1jbnBHUU8xbEE=
structuralObjectClass: organizationalRole
entryUUID: 8b628eac­a010­102b­8268­c41632270fd5
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20070526200759Z
modifyTimestamp: 20070526200759Z
entryCSN: 20070526200759Z#000002#00#000000

dn: ou=People,dc=ejemplo,dc=com,dc=ar
ou: People
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit
entryUUID: 6651dcde­b5a1­102b­97f4­93491f4cf66c
creatorsName: cn=admin,dc=ejemplo,dc=com,dc=ar
modifiersName: cn=admin,dc=ejemplo,dc=com,dc=ar
createTimestamp: 20070623064748Z
modifyTimestamp: 20070623064748Z
entryCSN: 20070623064748Z#000003#00#000000

dn: ou=Libreta,dc=ejemplo,dc=com,dc=ar
ou: Libreta
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit
entryUUID: 6653b9be­b5a1­102b­97f5­93491f4cf66c
creatorsName: cn=admin,dc=ejemplo,dc=com,dc=ar
modifiersName: cn=admin,dc=ejemplo,dc=com,dc=ar
createTimestamp: 20070623064748Z
modifyTimestamp: 20070623064748Z
Luego de esto, y fundamental, debemos reiniciar el servidor slapd
/etc/init.d/slapd restart

Si hasta acá anduvimos igual, debería funcionar todo bien, la inserción de los esquemas
estaría bien. Ahora vamos a agregar un usuario, y para eso, he desarrollado un script,
que agregará el usuario a nuestra base de ldap, en las estructuras contenedoras
correspondientes, de people, y de agenda. Veamos cómo es el script, y luego, cómo
ejecutarlo.
#!/bin/bash
#Script de generacion de Usuarios, basado en el de OpenXchange
#­­­­ Configuraciones de Sistema
LDAPSEARCH_BIN=/usr/bin/ldapsearch
LDAPHOST=»127.0.0.1″
BINDDN=»cn=admin,dc=ejemplo,dc=com,dc=ar»
BINDPW=nada
USER_BASEDN=»ou=People,dc=ejemplo,dc=com,dc=ar»
LIBRETA_BASEDN=»ou=Libreta,dc=ejemplo,dc=com,dc=ar»
GREP_BIN=/bin/grep
SED_BIN=/bin/sed

SORT_BIN=/usr/bin/sort
HEAD_BIN=/usr/bin/head
AWK_BIN=/usr/bin/awk
TMPDIF=/tmp/usuario.ldif
MIN_UID=2001
EXPR_BIN=/usr/bin/expr
#­­­­ Fin

CURRENT_UID=`$LDAPSEARCH_BIN ­h $LDAPHOST ­D $BINDDN ­w $BINDPW ­x
­b $USER_BASEDN «(uid=*)» uidNumber | $GREP_BIN uidNumber |
$SED_BIN ­e ‘s/^uidNumber://’ | $SORT_BIN ­nr | $HEAD_BIN ­n 1 |
$AWK_BIN {‘print $1′}`
if [ «$CURRENT_UID» = «#» ]
then
CURRENT_UID=$MIN_UID
else
CURRENT_UID=`$EXPR_BIN $CURRENT_UID + 1`
fi
#— Parametros de entrada
#$1 uid
#$2 Nombre
#$3 Apellido
#$4 Password

if [ «$1» = «» ]
then
echo «Debe especificar un UID, ejemplo mguazzardo»
error=»y»
fi
if [ «$2» = «» ]
then
echo «Debe especificar un Nombre, ejemplo Marcelo»
error=»y»
fi
if [ «$3» = «» ]
then
echo «Debe especificar un Apellido, ejemplo Guazzardo»
error=»y»
fi
if [ «$4» = «» ]
then
echo «Debe especificar un Password»
error=»y»
fi
if [ «$error» = «y» ]
then
echo «Por favor, corrija los errores»
exit 0
fi

#Password
CRYPTPASS=`slappasswd -h {crypt} -s $4`
PROXIMO=`expr $CURRENT_UID + 1`

#empezamos a escribir el file

echo «dn: uid=$1,$USER_BASEDN» > $TMPDIF
echo «uid: $1» >> $TMPDIF
echo «cn: $2 $3» >> $TMPDIF
echo «sn: $3»>>$TMPDIF
echo «objectClass: person»>>$TMPDIF
echo «objectClass: organizationalPerson»>>$TMPDIF
echo «objectClass: inetOrgPerson»>>$TMPDIF
echo «objectClass: posixAccount»>>$TMPDIF
echo «objectClass: top»>>$TMPDIF
echo «objectClass: shadowAccount»>>$TMPDIF
echo «shadowLastChange: 11627»>>$TMPDIF
echo «shadowMax: 99999»>>$TMPDIF
echo «shadowWarning: 7»>>$TMPDIF
echo «loginShell: /bin/false»>>$TMPDIF
echo «uidNumber: $PROXIMO»>>$TMPDIF
echo «gidNumber: 2001»>>$TMPDIF
echo «homeDirectory: /home/$1»>>$TMPDIF
echo «userPassword: $CRYPTPASS»>>$TMPDIF

ldapadd ­x ­v ­D «cn=admin,dc=ejemplo,dc=com,dc=ar» ­w $BINDPW ­f
$TMPDIF
rm ­fr $TMPDIF

echo «dn: cn=$2 $3,$LIBRETA_BASEDN»>>$TMPDIF
echo «givenName: $2»>>$TMPDIF
echo «sn: $3»>>$TMPDIF
echo «cn: $2 $3»>>$TMPDIF
echo «mail: [email protected]»>>$TMPDIF
echo «objectClass: inetOrgPerson»>>$TMPDIF
echo «objectClass: top»>>$TMPDIF

ldapadd ­x ­v ­D «cn=admin,dc=ejemplo,dc=com,dc=ar» ­w $BINDPW ­f
$TMPDIF
rm ­fr $TMPDIF

#Fin

#Genero el Maildir del Usuario
mkdir /home/$1
maildirmake /home/$1/Maildir
chown ­R $1 /home/$1
Veamos, la última parte… dará un error, que por ahora no nos importará, que nos dirá,
que mguazzardo no es un usuario válido. Aún no le hemos dicho que valide a los usuarios
de ldap, como usuarios de sistema, ya llegará esa parte, lo importante, que si todo ha
salido bien, ahora llega la parte más importante, que es integrar todo.
Validando PAM con OPENLDAP.

Para validar pam con openldap, no es algo trivial, es algo, que me costó muchísimo!.
Más, porque en Debian, como en Ubuntu existe un flor de bug con una librería, ¡ahora
discutiremos eso!.root@marcelo:~# apt­get install libpam­ldap

a la configuración, contestaremos cualquier cosa, total, tenemos nuestro archivo de
configuración propio.

root@marcelo:~# wget
http://www.porcheron.info/libnss­ldap_251­7_i386.deb
root@marcelo

y luego, copiamos los archivos de configuración, que crean estos dos archivos.

el primero, el /etc/pam_ldap.conf

host 127.0.0.1
base dc=ejemplo,dc=com,dc=ar
ldap_version 3
rootbinddn cn=admin,dc=ejemplo,dc=com,dc=ar
pam_password crypt

el segundo, el /etc/libnss-ldap.conf

host 127.0.0.1
base dc=ejemplo,dc=com,dc=ar
ldap_version 3
rootbinddn cn=admin,dc=ejemplo,dc=com,dc=ar
pam_password crypt

Y también, hay que tocar un archivo más, que no es generado por estos dos que hemos
bajado, sino, por otro, el archivo es el /etc/nsswitch.conf
# /etc/nsswitch.conf
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc­doc’ and `info’ packages installed, try:
# `info libc «Name Service Switch»‘ for information about this
file.

passwd:         files ldap
group:          files ldap
shadow:         files ldap
hosts:          files dns
networks:       files
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
netgroup:       nis
Con esto, le decimos al sistema, que cuando se trate de usuarios, primero se fije en los
archivos de sistema, y luego, valide mediante ldap.
Probando que todo esté configurado correctamente.
Para probar que todo hasta acá, está funcionando correctamente, haremos lo siguiente.
getent passwd, y me debería traer los usuarios de sistema, más los usuarios creados
recientemente por LDAP.

Ahora vamos por la integración con courier-imap!.
Lo primero que debemos hacer, es instalar el soporte de courier para ldap.
root@marcelo:~#apt­get install courier­ldap
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes extras:
courier­authlib­ldap
Paquetes sugeridos:
courier­doc
Se instalarán los siguientes paquetes NUEVOS:
courier­authlib­ldap courier­ldap
Luego, configuraremos , en /etc/pam.d/imap, para que el imap use validación ldap.
auth            required       pam_ldap.so
account         required       pam_ldap.so
password        required       pam_ldap.so
session         required       pam_ldap.so
Luego de esto, ya estamos en condiciones de hacer la primer prueba, básica, de
validación del usuario que hemos generado!.
Para eso, hacemos lo siguiente.

root@marcelo:~# telnet localhost 143
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE
THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL
ACL2=UNION] Courier­IMAP ready. Copyright 1998­2005 Double
Precision, Inc.  See COPYING for distribution information.
1 login mguazzardo ejemplo
* BYE [ALERT] Fatal error: Maildir: Permission denied
Connection closed by foreign host.

Como vemos acá, ¡nos da un error!. ¿Qué es eso de Maildir?… es como les comenté
antes, para que courier funcione, necesita tener un maildir. Al generar un usuario, se debe
generar su maildir, es la parte del script de generación de usuarios que dio la falla, por
que no estaba establecido el pam y el ldap, ahora ese script no daría la falla, y es lo que
necesitaríamos para que esto funcione!. veamos la última línea del script, uid.sh.
chown ­R $1 /home/$1
Esto hace que se le ceda la autoría del home, al usuario que se pasa por parámetro, en
este caso, mguazzardo.
Si yo ejecuto…
chown ­R mguazzardo /home/mguazzardo

¡Solucionamos el problema que nos daba anteriormente!.

veamos…

root@marcelo:~# telnet localhost 143
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE
THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL
ACL2=UNION] Courier­IMAP ready. Copyright 1998­2005 Double
Precision, Inc.  See COPYING for distribution information.
1 login mguazzardo ejemplo
1 OK LOGIN Ok.
Bueno, ya vimos que hemos solucionado un problema, que ya nuestros usuarios se
loguean via imap a nuestro servidor, ahora nos falta, lo más divertido. Integración con
Webmail, con antivirus, y antispam… y ahí terminaríamos la primera etapa!.

Llegó la hora de instalar apache2, php5, php5-ldap, phpldapadmin!

root@marcelo:~# apt-get install apache2 php5 php5-ldap
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes extras:
apache2-common apache2-mpm-prefork apache2-utils libapache2-mod-php5 libapr0
php5-common
Paquetes sugeridos:
apache2-doc php-pear
Se instalarán los siguientes paquetes NUEVOS:
apache2 apache2-common apache2-mpm-prefork apache2-utils libapache2-mod-php5
libapr0 php5 php5-common php5-ldap

Nos falta instalar el squirrelmail, junto a su paquete de idiomas.

root@marcelo:~# apt-get install squirrelmail squirrelmail-locales
NOTA:
Para configurar que el squirrelmail esté en castellano, y esto es un truco que encontré por
la internet, en Ubuntu, hay que generar las locales.

locale-gen es_ES

Luego,
squirrelmail-configure
Vamos al punto 10, donde dice lenguaje, cambiamos lenguaje y charset.
NOTA: Abajo dejo mi config.php, del squirrelmail.
LDAP!!!!!!!!!!!!
SquirrelMail Configuration : Read: config.php (1.4.0)
Main Menu ­­
1.  Organization Preferences
2.  Server Settings
3.  Folder Defaults
4.  General Options
47
5.  Themes
6.  Address Books
7.  Message of the Day (MOTD)
8.  Plugins
9.  Database
10. Languages
D.  Set pre­defined settings for specific IMAP servers
C   Turn color on
S   Save data
Q   Quit
Command >>
Ponemos 6
SquirrelMail Configuration : Read: config.php (1.4.0)
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
Address Books
1.  Change LDAP Servers
2.  Use Javascript Address Book Search          : false
3.  Global file address book                    :
4.  Allow writing into global file address book : false
R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit
Command >> 1
You can now define different LDAP servers.
Please ensure proper permissions for config.php when including
sensitive passwords.

[ldap] command (?=help) > +
First, we need to have the hostname or the IP address where
this LDAP server resides.  Example: ldap.bigfoot.com
hostname: 127.0.0.1

Next, we need the server root (base dn).  For this, an empty
string is allowed.
Example: ou=member_directory,o=netcenter.com
base: ou=Libreta,dc=ejemplo,dc=com,dc=ar
This is the TCP/IP port number for the LDAP server.  Default
port is 389.  This is optional.  Press ENTER for default.
port:
<desde acá, a todo le ponemos enter, y al final d, de done>
<?php
/**
* SquirrelMail Configuration File
* Created using the configure script, conf.pl
*/
global $version;
$config_version = ‘1.4.0’;
$config_use_color = 2;
$org_name      = «Ejemplo»;
$org_logo      = ‘/images/ejemplo.png’;
$org_logo_width  = ‘308’;

48
$org_logo_height = ‘111’;
$org_title     = «Mail Server de EJEMPLO»;
$signout_page  = »;
$frame_top     = ‘_top’;
$provider_uri     = ‘http://www.misol.org.ar’;
$provider_name     = ‘EJEMPLO’;
$motd = «»;
$squirrelmail_default_language = ‘es_ES’;
$default_charset       = ‘iso­8859­15’;
$lossy_encoding        = false;

$domain                 = ‘ejemplo.com.ar’;
$imapServerAddress      = ‘localhost’;
$imapPort               = 143;
$useSendmail            = true;
$smtpServerAddress      = ‘localhost’;
$smtpPort               = 25;
$sendmail_path          = ‘/usr/sbin/sendmail’;
$sendmail_args          = ‘­i ­t’;
$pop_before_smtp        = false;
$imap_server_type       = ‘other’;
$invert_time            = false;
$optional_delimiter     = ‘detect’;
$encode_header_key      = »;
$default_folder_prefix          = »;
$trash_folder                   = ‘INBOX.Trash’;
$sent_folder                    = ‘INBOX.Sent’;
$draft_folder                   = ‘INBOX.Drafts’;
$default_move_to_trash          = true;
$default_move_to_sent           = true;
$default_save_as_draft          = true;
$show_prefix_option             = false;
$list_special_folders_first     = true;
$use_special_folder_color       = true;
$auto_expunge                   = true;
$default_sub_of_inbox           = true;
$show_contain_subfolders_option = false;
$default_unseen_notify          = 2;
$default_unseen_type            = 1;
$auto_create_special            = true;
$delete_folder                  = false;
$noselect_fix_enable            = false;

$data_dir                 = SM_PATH . ‘data/’;
$attachment_dir           = $data_dir;
$dir_hash_level           = 0;
$default_left_size        = ‘150’;
$force_username_lowercase = false;
$default_use_priority     = true;
$hide_sm_attributions     = false;
$default_use_mdn          = true;
$edit_identity            = true;
$edit_name                = true;
$hide_auth_header         = false;
49
$plugins[0] = ‘calendar’;
$plugins[1] = ‘message_details’;
$plugins[2] = ‘compatibility’;
$plugins[3] = ‘html_mail’;
$plugins[4] = ‘newmail’;
$plugins[5] = ‘mail_fetch’;
$plugins[6] = ‘preview_pane’;
$plugins[7] = ‘translate’;

$theme_css = SM_PATH . ‘config/themes/css/outlook­08.css’;
$theme_default = 0;
$theme[0][‘PATH’] = SM_PATH . ‘themes/outlook.php’;
$theme[0][‘NAME’] = ‘Default’;
$theme[1][‘PATH’] = SM_PATH . ‘themes/plain_blue_theme.php’;
$theme[1][‘NAME’] = ‘Plain Blue’;
$theme[2][‘PATH’] = SM_PATH . ‘themes/sandstorm_theme.php’;
$theme[2][‘NAME’] = ‘Sand Storm’;
$theme[3][‘PATH’] = SM_PATH . ‘themes/deepocean_theme.php’;
$theme[3][‘NAME’] = ‘Deep Ocean’;
$theme[4][‘PATH’] = SM_PATH . ‘themes/slashdot_theme.php’;
$theme[4][‘NAME’] = ‘Slashdot’;
$theme[5][‘PATH’] = SM_PATH . ‘themes/purple_theme.php’;
$theme[5][‘NAME’] = ‘Purple’;
$theme[6][‘PATH’] = SM_PATH . ‘themes/forest_theme.php’;
$theme[6][‘NAME’] = ‘Forest’;
$theme[7][‘PATH’] = SM_PATH . ‘themes/ice_theme.php’;
$theme[7][‘NAME’] = ‘Ice’;
$default_use_javascript_addr_book = false;
$ldap_server[0] = array(
‘host’ => ‘127.0.0.1’,
‘base’ => ‘ou=Libreta,dc=ejemplo,dc=com,dc=ar’
);
$abook_global_file = »;
$abook_global_file_writeable = false;

$addrbook_dsn = »;
$addrbook_table = ‘address’;

$prefs_dsn = »;
$prefs_table = ‘userprefs’;
$prefs_user_field = ‘user’;
$prefs_key_field = ‘prefkey’;
$prefs_val_field = ‘prefval’;
$addrbook_global_dsn = »;
$addrbook_global_table = ‘global_abook’;
$addrbook_global_writeable = false;
$addrbook_global_listing = false;

$no_list_for_subscribe = false;
$smtp_auth_mech = ‘none’;
$imap_auth_mech = ‘login’;
$use_imap_tls = false;
$use_smtp_tls = false;
$session_name = ‘SQMSESSID’;

50
@include SM_PATH . ‘config/config_local.php’;
/**
* Make sure there are no characters after the PHP closing
* tag below (including newline characters and whitespace).
* Otherwise, that character will cause the headers to be
* sent and regular output to begin, which will majorly screw
* things up when we try to send more headers later.
*/
PHPLDAPADMIN:
Podríamos administrar correctamente todo lo que sigue, mediante el phpldapadmin.

Controlando el spam.
Si bien, no es un antispam, por definición, para el control de spam, yo estoy utilizando un
sistema de control, basado en listas grises. Y un producto, que funciona para postfix, que
se llama, Postgrey. Este producto, se basa en el rfc, de envío de correo, que cuando un
correo ingresa, la primera vez, dará un error temporal, y se informará de este al SMTP de
origen. Este SMTP de origen, si es un SMTP verdadero, y no un SMTP Zombie, lo que
hará, es devolvernos el EMAIL. Cuando se devuelve este email, se detectará que es un
mail verdadero, y se creará en memoria una tabla que validará este Mail, y se dará paso
a este mail.
Para la instalación, lo que haremos es lo siguiente

apt-get install postgrey.

Y pondremos, en el archivo /etc/postfix/main.cf

Que el content-filter sea el port 60000

Le agregamos las siguientes líneas

smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:60000

Y con esto, ya estaría todo andando joya!1

Cualquier duda sobre la configuración de este servicio, de cómo instalarlo, de cómo
personalizarlo, o de cómo generar un Cd personalizado, no duden en escribir a

Marcelo Guazzardo
Consultor Senior en tecnologías de la información
http://mguazzardo.wordpress.com

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *