Servidor de Correo :: Postfix

Improvisa :: Informática :: Postfix   Sasl   PostfixAdmin   Clamav   Spamassassin   SquirrelmailEste manual pretende orientar a todos los que necesiteis crear un servidor de correo basado en Debian y Postfix.

Implementa las principales funciones de seguridad de cualquier servidor de correo, antivirus (clamav), antispam (SpamAssassin), usuarios virtuales (MySql), servicios pop3 e imap (Courier), etc.

El manual enseña tambien como instalar Squirrelmail para que nuestros clientes acedan a su correo.

Su administracion sera muy facil con la magnifica herramienta creada en php llamada PostfixAdmin, la cual facilitara enormente la creacion de buzones, alta de dominios, asi como el borrado de los mismos

Del mismo autor que "Squid Clamav" (Juanmi).


­INSTALACION
SERVIDOR DE CORREO BASADO EN DEBIAN WOODY POSTFIX MYSQL MAILDROP SASL
POSTFIXADMIN AMAVIS SPAMASSASSIN SQUIRRELMAIL.


 

Bueno, la
instalación de este servidor surge a mediados del mes de febrero del 2005,
básicamente para enredar con el magnifico DEBIAN y empezar a ver sus
posibilidades. Comienzo diciendo que es lo primero que he empezado a hacer con
linux, y ha resultado algo difícil llegar al punto en el que ahora me encuentro,
lo tengo todo montadito y funcionando.

 

Comencé a
recabar información del tío google, encontré varios documentos y me decidí por
el de un brasileño (
<http://www.linuxdicas.com.br/tutoriais1/tutorial_courier_mysql_postfix.txt>).
Este manual esta muy bien pero tenia un gran problema para mi, que lo instalaba
sobre mandrake y yo quería instalarlo sobre debian woody.

 

Por
descontado que quería hacer el servidor basado en MySQL, no quería tener a
tropecientos usuarios en el servidor y comprometer así su seguridad, así que me
puse manos a la obra y me costo 35 días dejarlo aceptable. 

 

 


SISTEMA
OPERATIVO UTILIZADO:

 

 

Debian Woody
3.0 r4

 

 


HARDWARE
UTILIZADO:

 

 

Para todas
las instalaciones que tuve que hacer para dejarlo bien utilice a VmWare, una
aplicación de windows para meter otros sistemas mientras estas utilizando
windows, bastante bueno ya que me dejaba ir leyendo manuales mientras instalaba
el servidor.

 

La maquina
final no merece la pena ni comentarla.

 

 


APLICACIONES
UTILIZADAS:


 


 

SSH 
3.4p1-1.woody

MYSQL
3.23.49-8.9

COURIER-IMAP
1.4.3-2.5

COURIER-POP
1.4.3-2.5

MAILDROP
1.6.3

POSTFIX
2.1.5-0.backports.org.1

SASL
1.5.27-3.1woody5

APACHE
1.3.26-0woody6


SQUIRRELMAIL 1.4.4


AMAVIS-NEW 2.0030616p10-4.backports.org.1

SPAMASSASSIN
3.0.2-0.backports.org.1

POSTFIXADMIN
modificado por mi desde el fuente de Maximo de Linuxdicas



 

Existen otro
montón mas de paquetes utilizados que no merece la pena nombrar para describir
este servidor, los iréis viendo según avancéis.


 


 


INSTALACION
DE DEBIAN WOODY:


 

 

No hay mucho
que comentar en este apartado, he instalado el kernel 2.4 para que me soporte
sistema de ficheros ext 3 si no queréis este tipo de ficheros utilizad el kernel
por defecto,  después del particionado y mientras vamos iniciando cada una de
las particiones nos preguntara sobre el sistema de ficheros que queremos
utilizar le diremos que ext 3.

 

Al intentar
localizar vuestra tarjeta de red si la reconoce de primeras, no debéis decirle
que instale ningún paquete de dispositivos, si  no la localiza os tocara buscar
en internet información de que paquete de dispositivos debéis utilizar. Yo para
mi SMC 1255 TX he tenido que meter el paquete de dispositivos TULIP en el
apartado NET, una vez metido este paquete te dirá que ha tenido éxito y te
preguntara si quieres utilizar DHCP.

 

después de
ponerle el nombre a la maquina lo único que he hecho y no crear disquete de
arranque la maquina reiniciara. Nos preguntara por el meridiano en el que nos
encontramos, y si queremos habilitar MD5 y shadow passwords le decimos que si a
los dos tipos de  contraseñas y le daremos la contraseña al root y meteremos un
usuario normal.

 

Cuando nos
pregunta si queremos utilizar la conexión PPP para instalar el sistema le
diremos que no, ya que utilizaremos el CD para este propósito. Utilizaremos
nonus-software nonfree-software pero no utilizaremos contrib-software, ya que al
final de la instalación teníamos que meter un par de librerías para que amavis
pudiese descomprimir unos archivos para la búsqueda de virus y estas librerías
solo están en non-free software, la opción nonus es porque estamos fuera de EEUU
y podemos utilizar paquetes cifrados. Cuando nos pregunte si queremos añadir
alguna fuente apt  le diremos que si y añadiremos la que nos convenga, yo
utilizo http de debian.org en España.

 

Al
preguntarnos la instalación si queremos añadir la parte security updates a
nuEstro sources list, le diremos que si, esto nos actualizará al sistema mas
estable que haya en el momento. Cuando nos pregunte si queremos ejecutar TASKSEL
y DSELECT le diremos que no, esto nos dejara el sistema base, sin nada de nada,
ya utilizaremos apt-get para instalar lo que nos va haciendo falta.

 

Ahora se
tirara un rato descargando paquetes de internet para dejarnos el sistema básico.
Luego nos hace 3 preguntas sobre como queremos tratar los mensajes que genera el
sistema operativo yo he utilizado las opciones 4, none, y, esto hará que todos
los mensajes que genera woody los deje en el directorio local del root.

 

Ya podemos
validarnos para entrar en el sistema.

 

 


ANTES DE
COMENZAR

 

 

Si ya tenéis
conexión a internet utilicémosla y quitemos de /etc/apt/sources.list
la línea del cd para dejarla algo así:

 


deb
http://ftp.es.debian.org/debian/ stable main non-free


deb-src
http://ftp.es.debian.org/debian/ stable main non-free


 


deb
http://security.debian.org/ stable/updates main contrib non-free

 

Estas han
sido mis opciones vosotros podéis tener otras cosas o directamente dejar el cd,
yo lo quito porque sino me lo pide y a veces me lo dejaba olvidado y cuando se
iba la luz en casa al reiniciar el sistema arrancaba desde el cd y se quedaba
esperando a que le diese una opción de instalación.

 

Crearemos el
grupo y el usuario MAILDROP.

 



cartero:~#groupadd -g 108 maildrop



cartero:~#useradd -d /var/spool/mail -g 108 -u 108 -s /bin/false -M maildrop

 

Crearemos un
directorio donde compilaremos la fuentes y meteremos lo que bajemos de internet,
yo lo he llamado cosas.

 



cartero:~#mkdir /cosas

 

A partir de
ahora iremos paso a paso instalando cada servicio que debe correr en la maquina,
os pongo las versiones de cada aplicación que he ido instalando, para saber que
versión habéis instalado vosotros podéis poner en cualquier momento el comando
siguiente: dpkg -l nombre_paquete, pero aun así os digo que casi
todo es de WOODY, algo de BACKPORTS y un par de paquetes compilados
directamente.

 

En el resto
del documento todas las acciones que realizo las hago como ROOT.


 


 


INSTALACION
DE SSH  3.4p1-1.woody:

 

 

Una vez
acabada la instalación de Debian,  de lo primero que he hecho ha sido instalar
el servicio SSH, para mi muy útil ya que con putty puedo copiar y pegar cosas y
además puedo ir utilizando internet mientras voy realizando la instalación del
servidor.

 

Saltaos esta
instalación si no queréis manejar el servidor remotamente.

 



cartero:~#apt-get install ssh


 

Nos instalara
un total de 3 paquetes y ya podremos entrar mediante SSH al servidor para su
manejo remoto. El archivo de configuración de SSH se encuentra en  
/etc/ssh/sshd_config
  donde podremos retocar el puerto sobre el que
escucha, podremos denegar el acceso al root (en la practica muy aconsejable) y
un largo etcétera de opciones.

 

 


INSTALACION
DE MYSQL 3.23.49-8.9

 

Bueno como el
sistema de correo que queremos utilizar esta basado en acceso a bases de datos
para la autenticación de usuarios, y no crear a los usuarios en el sistema,
utilizaremos MYSQL, muy facilita de manejar y encima casi todos las aplicaciones
que podamos utilizar tendrán alguna opción para guardar datos en MYSQL
(squirrelmail para guardar perfiles de usuarios, ….)

 

Bueno la
instalación de MYSQL es muy facilita de realizar si sabemos que paquetes debemos
decir que instale, estos son:

 



cartero:~#apt-get install gawk libc6-dev libdbd-mysql-perl libdbi-perl
libmysqlclient10  libmysqlclient10-dev mysql-client mysql-common mysql-server
perl perl-modules zlib1g-dev


 

Un total de
12 paquetes, no todos son para la instalación de MYSQL, pero si se utilizaran a
lo largo de la configuración del servidor, casi todos los paquetes que aquí veis
los tuve que utilizar para la posterior compilación de MAILDROP.

 

Un ratito en
internet descargando paquetes y nos preguntara un par de cositas, la primera si
queremos que purgue las bases de datos, dile que no. La otra pregunta es que si
queremos que el demonio de MYSQL arranque al iniciar, le diremos que si.

 

Muy bien ya
tenemos la versión 3.23.49-8.9 de MYSQL (la estable en este momento, Abril
2005).

 

Ahora vamos a
configurar todo lo que necesitamos.

 

Yo me he
creado un archivo (vi /cosas/crea_bbdd.dat)  en el directorio
/cosas
en el cual he metido todo lo que necesito para crear la bases
de datos, sus usuarios, etc. El archivo en cuestión queda así:

 


#


# Creo los
usuarios postfix y maildrop para que puedan entrar a la bbdd


#


USE mysql


INSERT
INTO user (Host, User, Password) VALUES
(‘localhost’,’postfix’,password(‘postfix’));


INSERT
INTO user (Host, User, Password) VALUES
(‘localhost’,’maildrop’,password(‘postfix’));


 


INSERT
INTO db (Host, Db, User, Select_priv) VALUES
(‘localhost’,’postfix’,’postfix’,’Y’);


INSERT
INTO db (Host, Db, User, Select_priv) VALUES
(‘localhost’,’postfix’,’maildrop’,’Y’);


 


FLUSH
PRIVILEGES;


 


#


# Creamos la
bbdd postfix


#


CREATE
DATABASE postfix;


 


 


 


#


# Creamos la
estructura de la tabla alias


#


USE
postfix;


CREATE
TABLE alias (


address
varchar(255) NOT NULL default »,


goto text
NOT NULL,


domain
varchar(255) NOT NULL default »,



create_date datetime NOT NULL default ‘0000-00-00 00:00:00’,



change_date datetime NOT NULL default ‘0000-00-00 00:00:00’,


active
tinyint(4) NOT NULL default ‘1’,


PRIMARY
KEY (address)


)
TYPE=MyISAM COMMENT=’Virtual Aliases – mysql_virtual_alias_maps’;



                                  
                                                


#


# Creamos la
estructura de la tabla domain


#


USE
postfix;


CREATE
TABLE domain (


domain
varchar(255) NOT NULL default »,



description varchar(255) NOT NULL default »,


transport
varchar(255) NOT NULL default ‘maildrop’,



create_date datetime NOT NULL default ‘0000-00-00 00:00:00’,



change_date datetime NOT NULL default ‘0000-00-00 00:00:00’,


active
tinyint(4) NOT NULL default ‘1’,


PRIMARY
KEY (domain)


)
TYPE=MyISAM COMMENT=’Virtual Domains – mysql_virtual_domains_maps’;



                                              


 


#


# Creamos la
estructura de la tabla mailbox


#


USE
postfix;


CREATE
TABLE mailbox (


username
varchar(255) NOT NULL default »,


password
varchar(255) NOT NULL default »,


name
varchar(255) NOT NULL default »,


home
char(255) default ‘/cartas/’,


maildir
varchar(255) NOT NULL default »,


quota
varchar(255) NOT NULL default ‘10000000S’,


domain
varchar(255) NOT NULL default »,



create_date datetime NOT NULL default ‘0000-00-00 00:00:00’,



change_date datetime NOT NULL default ‘0000-00-00 00:00:00’,


active
tinyint(4) NOT NULL default ‘1’,



passwd_expire enum(‘N’,’Y’) default ‘Y’,


uid
int(10) unsigned default ‘108’,


gid
int(10) unsigned default ‘108’,


PRIMARY
KEY (username)


)
TYPE=MyISAM COMMENT=’Virtual Mailboxes – mysql_virtual_mailbox_maps’;


 


 


#


# Creo al
usuario postfixadmin con otro privilegios diferentes a los otros dos usuarios,
nos servirá para administrar sin problemas esta base de datos


#


USE mysql


INSERT
INTO user (Host, User, Password) VALUES
(‘localhost’,’postfixadmin’,password(‘postfixadmin’));


 


INSERT
INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv)
VALUES (‘localhost’, ‘postfix’, ‘postfixadmin’, ‘Y’, ‘Y’, ‘Y’, ‘Y’);


FLUSH
PRIVILEGES;  



                              



                                                                       


#


#  Creamos la
estructura de la tabla admin


#


USE
postfix;


CREATE
TABLE admin (


username
varchar(255) NOT NULL default »,


password
varchar(255) NOT NULL default »,


domain
varchar(255) NOT NULL default »,



create_date datetime NOT NULL default ‘0000-00-00 00:00:00’,



change_date datetime NOT NULL default ‘0000-00-00 00:00:00’,


active
tinyint(4) NOT NULL default ‘1’,


PRIMARY
KEY (username)


)
TYPE=MyISAM COMMENT=’Virtual Admins – Store Virtual Domain Admins’;

 

Cuando paséis
esto al archivo /etc/crea_bbdd.dat tened cuidado no dejéis intros
entre las líneas que crean tablas o usuarios, es decir el documento que estáis
leyendo me esta ajustando la línea para que podáis leerla pero en realidad no
hay intros entre las comas, solo entre los puntos y coma, tened en cuenta esta
regla durante todo el documento, vi es una pizca difícil de
manejar pero una vez que te haces todo sale….

 

Una vez
creado el archivo podemos darle las instrucciones a mysql para que haga todo lo
que queremos, esto se hace con este comando, suponiendo que estemos como root:

 



cartero:~#mysql -u root < /cosas/crea_bbdd.dat

 

Podemos
verificar que todo lo ha hecho bien:

 



cartero:~# mysql


Welcome
to the MySQL monitor.  Commands end with ; or g.


Your
MySQL connection id is 4 to server version: 3.23.49-log


 


Type
‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.


 


mysql>
show databases


    -> ;



———-


|
Database |



———-


|
mysql    |


|
postfix  |


|
test     |



———-


3 rows in
set (0.01 sec)


 


mysql>
use postfix;


Reading
table information for completion of table and column names


You can
turn off this feature to get a quicker startup with -A


 


Database
changed


mysql>
show tables;



——————-


|
Tables_in_postfix |



——————-


|
admin             |


|
alias             |


|
domain            |


|
mailbox           |



——————-


4 rows in
set (0.00 sec)


 


mysql> desc
admin;



————- ————– —— —– ——————— ——-


|
Field       | Type         | Null | Key | Default             | Extra |



————- ————– —— —– ——————— ——-


|
username    | varchar(255) |      | PRI |                     |       |


|
password    | varchar(255) |      |     |                     |       |


|
domain      | varchar(255) |      |     |                     |       |


|
create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |


|
change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |


|
active      | tinyint(4)   |      |     | 1                   |       |



————- ————– —— —– ——————— ——-


6 rows in
set (0.00 sec)


 


 


mysql> desc
alias;



————- ————– —— —– ——————— ——-


| Field      
| Type         | Null | Key | Default             | Extra |



————- ————– —— —– ——————— ——-


| address    
| varchar(255) |      | PRI |                     |       |


| goto       
| text         |      |     |                     |       |


| domain     
| varchar(255) |      |     |                     |       |


|
create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |


|
change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |


|
active      | tinyint(4)   |      |     | 1                   |       |



————- ————– —— —– ——————— ——-


6 rows in
set (0.00 sec)


 


mysql> desc
domain;



————- ————– —— —– ——————— ——-


|
Field       | Type         | Null | Key | Default             | Extra |



————- ————– —— —– ——————— ——-


|
domain      | varchar(255) |      | PRI |                     |       |


|
description | varchar(255) |      |     |                     |       |


|
transport   | varchar(255) |      |     | maildrop            |       |


|
create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |


|
change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |


|
active      | tinyint(4)   |      |     | 1                   |       |



————- ————– —— —– ——————— ——-


6 rows in
set (0.00 sec)


 


mysql> desc
mailbox;



————— —————— —— —– ——————— ——-


|
Field         | Type             | Null | Key | Default             | Extra |



————— —————— —— —– ——————— ——-


|
username      | varchar(255)     |      | PRI |                     |       |


|
password      | varchar(255)     |      |     |                     |       |


|
name          | varchar(255)     |      |     |                     |       |


|
home          | varchar(255)     | YES  |     | /postfix/           |       |


|
maildir       | varchar(255)     |      |     |                     |       |


|
quota         | varchar(255)     |      |     | 10000000S           |       |


|
domain        | varchar(255)     |      |     |                     |       |


|
create_date   | datetime         |      |     | 0000-00-00 00:00:00 |       |


|
change_date   | datetime         |      |     | 0000-00-00 00:00:00 |       |


| active  
     | tinyint(4)       |      |     | 1                   |       |


|
passwd_expire | enum(‘N’,’Y’)    | YES  |     | Y                   |       |


|
uid           | int(10) unsigned | YES  |     | 108                 |       |


|
gid           | int(10) unsigned | YES  |     | 108                 |       |



————— —————— —— —– ——————— ——-


13 rows
in set (0.00 sec)


 


mysql>
select * from mysql.user;



———– —————— —————— ————- ————- ————- ————- ————- ———– ————- ————— ————– ———– ———— —————– ———— ————


| Host 
    | User             | Password         | Select_priv | Insert_priv |
Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv |
Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv |
Index_priv | Alter_priv |



———– —————— —————— ————- ————- ————- ————- ————- ———– ————- ————— ————– ———– ———— —————– ———— ————


| localhost |
root             |                  | Y           | Y           | Y           |
Y           | Y           | Y         | Y           | Y             |
Y            | Y         | Y          | Y               | Y          |
Y          |


| cartero   |
root             |                  | Y           | Y           | Y           |
Y           | Y           | Y         | Y           | Y             |
Y            | Y         | Y          | Y               | Y          |
Y          |


| localhost
|                  |                  | N           | N           | N          
| N           | N           | N         | N           | N             |
N            | N         | N          | N               | N          |
N          |


| cartero  
|                  |                  | N           | N           | N          
| N           | N           | N         | N           | N             |
N            | N         | N          | N               | N          |
N          |


| localhost |
debian-sys-maint | 24644518650727ed | N           | N           | N           |
N           | N           | N         | Y           | Y             |
N            | N         | N          | N               | N          |
N          |


| localhost |
postfix          | 3ecf3e4f55dd846f | N           | N           | N           |
N           | N           | N         | N           | N             |
N            | N         | N          | N               | N          |
N          |


| localhost |
maildrop         | 7e986dfe1718fb08 | N           | N           | N           |
N           | N           | N         | N           | N             |
N            | N         | N          | N               | N          |
N          |


| localhost |
postfixadmin     | 0b553b00631b84ae | N           | N           | N           |
N           | N           | N         | N           | N             |
N            | N         | N          | N               | N          |
N          |



———– —————— —————— ————- ————- ————- ————- ————- ———– ————- ————— ————– ———– ———— —————– ———— ————


8 rows in
set (0.00 sec)

 

 


INSTALACION
DE COURIER-IMAP 1.4.3-2.5



 



 

Como vamos a
utilizar Postfix para con soporte Maildir

 necesitamos
Courier IMAP que permite el acceso a este tipo de bases de datos, será tambien
el encargado de dar servicio POP3 e IMAP en nuestro servidor.

 

La
instalación constara de un total de 5 paquetes, son estos:

 



cartero:~#apt-get install courier-authdaemon courier-authmysql courier-base
courier-imap courier-pop


 

La
instalación nos pedirá un OK, se lo damos, solo tenemos esa opción.

 

Vamos a
configurar todo lo que hemos instalado:

 

Lo primero,
editaremos el archivo /etc/courier/authdaemonrc


 

Buscaremos la
línea:


 



authmodulelist="authpam"


 

y la
cambiaremos por:


 



authmodulelist="authmysql"


 

después de
esto editaremos el archivo /etc/courier/authmysqlrc


 

Yo borro por
completo lo que viene por defecto y pongo lo que aquí os dejo:


 



MYSQL_SERVER            localhost



MYSQL_USERNAME          postfix



MYSQL_PASSWORD          postfix



MYSQL_SOCKET            /var/run/mysqld/mysqld.sock



MYSQL_PORT              3306



MYSQL_OPT               0



MYSQL_DATABASE          postfix



MYSQL_USER_TABLE        mailbox



MYSQL_CRYPT_PWFIELD     password



MYSQL_UID_FIELD         uid



MYSQL_GID_FIELD         gid



MYSQL_LOGIN_FIELD       username



MYSQL_HOME_FIELD        home



MYSQL_NAME_FIELD        name



MYSQL_MAILDIR_FIELD     maildir



MYSQL_QUOTA_FIELD       quota



MYSQL_WHERE_CLAUSE      active=1

Aseguraos que
el la línea MYSQL_SOCKET esta bien puesta podemos cerciorarnos editando el
archivo /etc/mysql/my.cnf y fijarnos donde pone socket, debe ser
la misma ruta.

 

Reiniciaremos
los servicios para que recoja la nueva configuración:

 


cartero:~#
/etc/init.d/courier-authdaemon restart


 


cartero:~#
/etc/init.d/courier-imap restart


 


cartero:~#
/etc/init.d/courier-pop restart


 

Comprobaremos
que todo funciona:

 


cartero:~#
netstat -an |grep LISTEN


tcp       
0      0 0.0.0.0:37              0.0.0.0:*               LISTEN


tcp       
0      0 0.0.0.0:9               0.0.0.0:*               LISTEN


tcp       
0      0 0.0.0.0:13              0.0.0.0:*               LISTEN


tcp       
0      0 0.0.0.0:110             0.0.0.0:*               LISTEN


tcp       
0      0 0.0.0.0:143             0.0.0.0:*               LISTEN


tcp       
0      0 0.0.0.0:22              0.0.0.0:*               LISTEN


tcp       
0      0 0.0.0.0:25              0.0.0.0:*               LISTEN


 

Perfecto el
puerto 110 y el puerto 143 están a la escucha, probemos mas, esto lo podemos
hacer desde la misma maquina que estamos configurando o desde otra que tenga
acceso por red al servidor de correo, yo lo he hecho en la misma maquina:

 



cartero:~# telnet 10.19.4.17 110


Trying
10.19.4.17…


Connected
to 10.19.4.17.


Escape
character is ‘^]’.


OK Hello
there.


quit


OK
Better luck next time.



Connection closed by foreign host.


 



cartero:~# telnet 10.19.4.17 143


Trying
10.19.4.17…


Connected
to 10.19.4.17.


Escape
character is ‘^]’.


* OK
Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc.  See COPYING for
distribution information.


0 logout


* BYE
Courier-IMAP server shutting down


0 OK
LOGOUT completed



Connection closed by foreign host.


 

Perfecto por
ahora todo va bien, sigamos.

 



 


INSTALACION
DE MAILDROP 1.6.3



 



 

Este fue uno
de los huesos duros de roer, aquí me quede enganchado un par de días, no había
quien compilase este paquete. Alguien dirá ¿y por que lo compila si existe en la
distribución de woody? Porque el que viene en la distribución de woody no
soportaba el acceso a MYSQL, con lo cual se cargaba todo el chiringuito. Bueno
fue duro para mi pero espero que con este documento os resulte fácil. Deciros
tambien que la compilación que logre fue de la versión 1.6.3, en ese momento ya
estaba la versión 1.8 pero me fue imposible realizarla, y además el manual que
yo seguía hablaba de la 1.6.3 así que mejor que mejor.

 

Lo primero
que vamos a hacer es instalar un gestor de descargas, un descompresor y los
paquetes esenciales para compilar el paquete que descarguemos:

 



cartero:~# apt-get install wget bzip2 build-essential

 

Ésto nos
instalará un total de 15 paquetes (binutils build-essential bzip2 cpp cpp-2.95
dpkg-dev g g -2.95 gcc gcc-2.95 libbz2-1.0 libstdc 2.10-dev make patch wget)

 

Un rato
descargando y un OK y tenemos instalado lo que necesitábamos.

 

Ahora nos
vamos al directorio /cosas y descargaremos el paquete de maildrop.

 


cartero:~# cd
/cosas



cartero:/cosas# wget


<http://puzzle.dl.sourceforge.net/sourceforge/courier/maildrop-1.6.3.tar.bz2>


 


–18:03:20– 
http://puzzle.dl.sourceforge.net/sourceforge/courier/maildrop-1.6.3.tar.bz2


          
=>
`maildrop-1.6.3.tar.bz2′


Resolving
puzzle.dl.sourceforge.net… done.



Connecting to puzzle.dl.sourceforge.net[195.141.101.221]:80… connected.


HTTP
request sent, awaiting response… 200 OK


Length:
658,173 [application/x-redhat-package-manager]


 



100%[==================================================================================>]
658,173       41.06K/s    ETA 00:00


 


18:03:36
(41.06 KB/s) – `maildrop-1.6.3.tar.bz2′ saved [658173/658173]


 

(aquí se ve
perfectamente lo que os contaba arriba del ajuste de línea al crear el
documento, toda la línea va seguida salvo un espacio entre wget y la dirección
url)

 

Muy bien ya
tenemos descargado el archivo maildrop-1.6.3.tar.bz2 en /cosas/

 

A
descomprimirlo:

 

Yo he creado
dentro de cosas para no liarme un directorio llamado source donde meteré lo que
iré descomprimiendo, los puntos suspensivos son los archivos que se van
descomprimiendo:

 



cartero:/cosas# mkdir /cosas/source



cartero:/cosas# tar -jxvf maildrop-1.6.3.tar.bz2 -C /cosas/source/


      …..


      …..


      …..



cartero:/cosas# cd /cosas/source/maildrop-1.6.3/

 

Muy bien ya
estamos donde se ha descomprimido Maildrop. Ahora vamos a compilarlo, no sabéis
lo que me costo sacar esta línea para compilarlo:

 



cartero:/cosas/source/maildrop-1.6.3#./configure –enable-syslog=1
–enable-maildrop-uid=108 –enable-maildrop-gid=108 –enable-maildropmysql
–with-mysqlconfig=/etc/maildropmysql.config –without-db –enable-maildirquota


      …..


      …..


      …..


      …..

Otra vez el
ajuste de línea, los puntos suspensivos son los paquetes que se están
compilando.

 

Hagamos el
make:

 



cartero:/cosas/source/maildrop-1.6.3#make -s


     
…..


      …..


      …..


      …..

Ultimas
comandos para hacerlo funcional:

 



cartero:/cosas/source/maildrop-1.6.3# cd maildrop



cartero:/cosas/source/maildrop-1.6.3/maildrop# strip maildrop



cartero:/cosas/source/maildrop-1.6.3/maildrop# cp maildrop /usr/bin



cartero:/cosas/source/maildrop-1.6.3/maildrop# chmod a rx /usr/bin/maildrop



cartero:/cosas/source/maildrop-1.6.3# mkdir /etc/maildrop



cartero:/cosas/source/maildrop-1.6.3# cd ..



cartero:/cosas/source/maildrop-1.6.3# cp maildropmysql.config /etc/



cartero:/cosas/source/maildrop-1.6.3# cp maildir/quotawarnmsg /etc/maildrop/


 

Para
comprobar que todo funciona pondremos el siguiente comando:

 



cartero:/cosas/source/maildrop-1.6.3/maildrop# maildrop -v


maildrop
1.6.3 Copyright 1998-2003 Double Precision, Inc.


Maildir
quota extension enabled.


Virtual
user database via MySQL extension enabled.


This
program is distributed under the terms of the GNU General Public


License.
See COPYING for additional information.


 

Si nos damos
cuenta debe decirnos que tenemos la versión 1.6.3 y que tenemos habilitado el
uso de quota y el uso de usuarios virtuales a través de MYSQL.

 

No sabéis que
alegría cuando vi el resultado de este ultimo comando.

 

Sigamos con
la configuración de Maildrop, no todo esta hecho:

 

Crearemos un
directorio para los buzones de correo, yo le he llamado cartas y cuelga del
directorio raíz, si ya te creaste la partición del disco duro pues el primer
comando te lo ahorras:

 


cartero:/#
mkdir /cartas


cartero:/#
chown maildrop /cartas/


cartero:/#
chmod 770 /cartas/


 


Configuraremos el archivo /etc/maildropmysql.config, yo borro el
contenido del que copie por defecto  meto lo que escribo mas abajo:


 



hostname                localhost



port                    3306



socket                  /var/run/mysqld/mysqld.sock



database                postfix



dbuser                  maildrop



dbpw                    maildrop



dbtable                 mailbox



default_gidnumber       108



default_uidnumber       108



uid_field               username



uidnumber_field         uid



gidnumber_field         gid



maildir_field           maildir



homedirectory_field     home



quota_field             quota



mailstatus_field        active



where_clause            ""


 

Cuidado con
el socket, acordaos que debe coincidir con el que esta en



/etc/mysql/my.cnf
en
la ligna socket.

 

Maildrop ya
esta instalado, vayamos a por lo siguiente:

 



 


INSTALACION
DE POSTFIX 2.1.5-0.backports.org.1


 


 

Para esta
instalación, como ya os dije, utilizaremos Backpoorts, para instalar una versión
algo mas actual, que nos soporte quotas. Lo primero que haremos será añadir a
nuestro sources.list las líneas de backports para el paquete postfix, lo haremos
editando el archivo /etc/apt/sources.list para dejarlo algo así:

 


cartero:/#
vi /etc/apt/sources.list

 


deb
http://ftp.es.debian.org/debian/ stable main non-free


deb-src
http://ftp.es.debian.org/debian/ stable main non-free


 


deb
http://www.backports.org/debian stable postfix


deb-src
http://www.backports.org/debian stable postfix


 


deb
http://security.debian.org/ stable/updates main contrib non-free


 

después
haremos un update de los paquetes de apt y luego instalaremos:


 



cartero:/# apt-get update


 

Esto
actualizara los paquetes

 



cartero:/# apt-get install postfix-tls postfix-mysql postfix


 

Y esto nos
instalara la versión 2.1.5-0.backports.org.1 de POSTFIX. Si os salen mas de tres
paquetes a instalar volved a mirar el /etc/apt/sources.list para
ver si quedo bien lo que añadisteis y comprobad que hizo bien el apt-get
update
. Puede ser que ponga mas paquetes, a mes de abril de 2005 solo
son esos 3, todo esto lo digo porque me ha pasado y al ir a editar el archivo


/etc/postfix/master.cf (lo veremos mas adelante) me encontré cosas que no
quería.

 

Para seguir
configurando Postfix necesitamos crearnos 4 archivos, éstos archivos  tendrán
las configuraciones de acceso a la bbdd.

 

Estos
archivos deben estar en /etc/postfix


 



/etc/postfix/mysql_virtual_alias_maps.cf


 


user =
postfix


password=
postfix


dbname =
postfix


table =
alias



select_field = goto



where_field = address


hosts =
localhost


 


 



/etc/postfix/mysql_virtual_mailbox_maps.cf


 


user =
postfix


password=
postfix


dbname =
postfix


table =
mailbox



select_field = maildir



where_field = username


hosts =
localhost


 


 



/etc/postfix/mysql_transport_maps.cf


 


user =
postfix


password
= postfix


hosts =
localhost


dbname =
postfix


table =
domain



select_field = transport



where_field = domain


 


 



/etc/postfix/mysql_virtual_mailbox_limit_maps.cf


 


user =
postfix


password
= postfix


dbname =
postfix


table =
mailbox



select_field = quota



where_field = username


hosts =
localhost

 

Seguimos con
la configuración de Postfix y ahora nos tendremos que editar el archivo
/etc/postfix/master.cf
, aquí tengo que hacer una reseña, yo NO he
enjaulado a Postfix. Es algo que me queda por hacer. Para el siguiente manual,
lo tendré hecho. A lo que estábamos, editamos el archivo 



/etc/postfix/master.cf
.

 

El archivo
/etc/postfix/master.cf tiene una aspecto de tabla, si nos fijamos en la columna
chroot (enjaulado) nos viene un , yo he puesto
todos a n.


 

El otro
cambio que hay que hacer ahora en este archivo es el siguiente:

 

Buscamos la
línea que pone:


 


maildrop 
unix  –       n       n       –       –       pipe


  flags=DRhu
user=vmail argv=/usr/local/bin/maildrop -d ${recipient}


 

y la
cambiamos por esta:


 


maildrop 
unix  –       n       n       –       –       pipe


  flags=DRhu
user=maildrop argv=/usr/bin/maildrop -w 90 -d ${recipient}

Comprobad que
tenemos el archivo maildrop en el directorio /usr/bin, si no es así volved a la
configuración de maildrop y allí teníamos una línea que nos copiaba el archivo a
la carpeta.

 

Tenemos que
tener especial cuidado al editar el archivo master.cf, respetad
las columnas, es decir dejarlas igual que estaban lo único cambiando el guión
por la n, otra cosa a tener en cuenta es que en el segundo retoque del archivo
master.cf debemos dejar al menos dos espacios antes de la palabra
flags.

 

Ahora
editaremos el archivo /etc/postfix/main.cf, el archivo que deja
por defecto es muy simple, borrad todo lo que tiene y cambiadlo por este:

 


#========
CONFIGURACIONES ===============



queue_directory = /var/spool/postfix/



program_directory=/usr/sbin



command_directory = /usr/sbin



daemon_directory = /usr/lib/postfix



mail_owner = postfix



default_privs=nobody



default_transport=smtp



alias_maps=hash:/etc/postfix/aliases



alias_database=hash:/etc/postfix/aliases



readme_directory = no



sample_directory = /etc/postfix



sendmail_path = /usr/sbin/sendmail



setgid_group = postdrop



manpage_directory = /usr/local/man



newaliases_path = /usr/bin/newaliases



mailq_path = /usr/bin/mailq



smtpd_banner=$myhostname ESMTP MI DOMINIO



disable_vrfy_command=yes



home_mailbox=Maildir/



                                                                               



                                                                               



                                                                                


# ==========
NOMBRE DE LOS DOMINIOS ===========



myhostname=cartero.dominio.com



mydomain=cartero.local


myorigin=
$mydomain



mydestination= $mydomain, $transport_maps



                                                                               


 
                                                                              


#=====REDES
======


# Solo pongo
la 127.0.0.1


#



mynetworks=127.0.0.0/8 


 



                                                                               


#========
MYSQL ==============



virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf



virtual_mailbox_base = /cartas



virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf



virtual_uid_maps = static:108



virtual_gid_maps = static:108



transport_maps = mysql:/etc/postfix/mysql_transport_maps.cf



local_recipient_maps=


 


 


#=======
CUOTA ============



virtual_mailbox_limit_inbox = no



virtual_mailbox_limit_maps=
mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf



virtual_mailbox_limit_override = yes



virtual_maildir_extended = yes



virtual_create_maildirsize = yes



virtual_mailbox_limit = 100000000



virtual_maildir_limit_message = Lo siento, el usuario se ha quedado sin espacio
en el buzon.



virtual_overquota_bounce = yes



                                                                                


#
=======MAILDROP ==========



fallback_transport = /usr/bin/maildrop



maildrop_destination_recipient_limit = 1



unknown_local_recipient_reject_code = 450

 

Si os fijáis
hay en la línea local_recipient_maps= no hay nada escrito, esto
arregla un error que me daba, para ser mas exactos error 450 al hacer telnet al
puerto 25, lo que hacemos es deshabilitar a los usuarios locales.

Bueno, ahora
nos queda arreglar otro error que me daba a mi, un error en el log de
/var/log/mail.log,
un error de aliases.

 


cartero:/# cp
/etc/aliases /etc/postfix/


cartero:/#
newaliases



postalias: warning: /etc/postfix/aliases.db: duplicate entry: "news"


 

Nos da un
warning, una entrada duplicada en news, no ocurre nada.

 

Seguimos.

 

Es momento de
empezar a llenar las tablas con datos, para ello yo intente hacerlo con webmin,
pero no me cogia los datos por defecto que debía rellenar, aun así no pasa nada
porque mas adelante lo haremos con postfixadmin, para los usuarios de ahora nos
creamos un pequeño script y metemos los datos, el script es este:

 

Script para
crear usuario:

 


INSERT INTO
mailbox(username,password,name,home,maildir,quota,domain)VALUES
(‘juanmi@domino.com’ ,encrypt(‘juanmi’) ,’Juan Miguel’ ,’/cartas/’
,’dominio.com/juanmi/Maildir/’ ,’10000000S’ ,’dominio.com’);

 

Script para
crear dominio:

 


INSERT INTO
domain(domain,description,transport,active) VALUES (‘dominio.com’ ,’Dominio de
Prueba’ ,’maildrop’ ,’1′);


 

Para
introducir los datos en la base de datos POSTFIX haremos lo siguiente:


 



cartero:/cosas# mysql -D postfix -u root < /cosas/crea_dominio.dat



cartero:/cosas# mysql -D postfix -u root < /cosas/crea_usuario.dat


 

Muy bien
podemos mirar si lo hemos hecho bien:

 



cartero:/cosas# mysql


Welcome
to the MySQL monitor.  Commands end with ; or g.


Your
MySQL connection id is 5 to server version: 3.23.49-log


 


Type
‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.


 


mysql>
use postfix;


Reading
table information for completion of table and column names


You can
turn off this feature to get a quicker startup with -A


 


Database
changed


mysql>
select * from mailbox;


 


     
…..


     
…..


     
…..

 


mysql>select
* from domain;


 


     
…..


      …..


      …..


 


mysql>
exit;


Bye


 

Ahora tenemos
que crear los directorios donde se almacenaran los correos de la gente, el
sistema es fácil dentro del directorio cartas colgaran tantos directorios como
dominios tengamos en la base de datos, dentro de cada directorio con nombre de
dominio tendremos tantos usuarios como usuarios del dominio. Por ejemplo
/cosas/dominio.com/juanmi.
Para crearlos haremos lo siguiente:

 


cartero:/#
mkdir -p /cartas/dominio.com/juanmi


cartero:/#
maildirmake /cartas/dominio.com/juanmi/Maildir


cartero:/#
chown maildrop /cartas/ -R


cartero:/#
chmod 770 /cartas/ -R


 

Fijaos que la
M de Maildir esta en mayusculas.

 

El comando
maildirmake
nos ha creado dentro de juanmi un directorio llamado
Maildir que contiene las tres carpetas del buzon, cur, new, tmp.

 

Reiniciemos
los servicios de Postfix:

 


cartero:/#
/etc/init.d/postfix restart


Stopping mail
transport agent: Postfix.


Starting mail
transport agent: Postfix.

 

Perfecto,
empezemos a hacer pruebas:

 

Lo primero
testearemos el maildrop, utilizaremos el siguiente comando:

 


cartero:/#
cat /etc/lilo.conf |maildrop -d

juanmi@dominio.com
<mailto:juanmi@dominio.com>


cartero:/# ls
/cartas/dominio.com/juanmi/Maildir/new/



1113302660.M221752P414V0000000000000802I00007DE7_0.cartero,S=4105


 

Perfecto
funciona.

 

Miremos el
log:

 


cartero:/# vi
/var/log/mysql.log

 

Justo al
final nos deben salir unas líneas así:

 


050412
12:45:40       7 Connect     maildrop@localhost on



                      7 Init DB     postfix



                      7 Query       SELECT username, uid, gid, home, maildir, qu


ota FROM
mailbox WHERE username = "juanmi@dominio.com" ""



                     

Quit


 

 

Perfecto,
probemos ahora a postfix. Para ello utilizaremos el telnet:

 



cartero:/# telnet 10.19.4.10 25


Trying
10.19.4.10…


Connected
to 10.19.4.10.


Escape
character is ‘^]’.


220
cartero.dominio.com ESMTP MI DOMINIO


ehlo
localhost



250-cartero.dominio.com



250-PIPELINING


250-SIZE
10240000


250-ETRN


250
8BITMIME


mail
from: juanmi@pruebitas.com


250 Ok


rcpt
to:juanmi@dominio.com


250 Ok


data


354 End
data with <CR><LF>.<CR><LF>


Hola
pepsicola


.


250 Ok:
queued as 44B412AF10


quit


221 Bye



Connection closed by foreign host.

 

Muy bien
comprobemos que esta todo en su directorio:

 


cartero:/# ls
/cartas/dominio.com/juanmi/Maildir/new

 

Este comando
debe sacarnos un nuevo mail.


 

Miremos el
log, buscad las líneas donde pone status sent:


 


cartero:/# vi
/var/log/mail.log


 


Apr 12
12:55:00 cartero postfix/smtpd[606]: 44B412AF10: client=unknown[10.19.4.10]


Apr 12
12:55:07 cartero postfix/cleanup[614]: 44B412AF10:
message-id=<20050412105451.44B412AF10@cartero.dominio.com>


Apr 12
12:55:07 cartero postfix/qmgr[605]: 44B412AF10: from=<juanmi@pruebitas.com>,
size=353, nrcpt=1 (queue active)


Apr 12
12:55:07 cartero postfix/pipe[628]: 44B412AF10: to=<juanmi@dominio.com>,
relay=maildrop, delay=16, status=sent (dominio.com)


 

Perfecto,
funciona todo. No sabéis lo que me costo conseguir todo esto, espero que no os
encontréis con muchos problemas.

 

Sigamos
haciendo comprobaciones, ya hemos enviado, veamos si podemos leer lo que nos
hemos enviado:

 

Empezaremos
con el protocolo IMAP:

 



cartero:/# telnet 10.19.4.10 143


Trying
10.19.4.10…


Connected
to 10.19.4.10.


Escape
character is ‘^]’.


* OK
Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc.  See COPYING for
distribution information.


C:a login
juanmi@dominio.com juanmi


C:a OK
LOGIN Ok.


C:a
select inbox


* FLAGS
(Draft Answered Flagged Deleted Seen Recent)


* OK
[PERMANENTFLAGS (Draft Answered Flagged Deleted Seen)] Limited


* 3
EXISTS


* 3
RECENT


* OK
[UIDVALIDITY 1113303852] Ok


C:a OK
[READ-WRITE] Ok


0 logout


* BYE
Courier-IMAP server shutting down


0 OK
LOGOUT completed



Connection closed by foreign host.


 

Perfecto
tengo 3 mails y los tres sin leer.

 

Probemos
ahora con POP3


 



cartero:/# telnet 10.19.4.10 110


Trying
10.19.4.10…


Connected
to 10.19.4.10.


Escape
character is ‘^]’.


OK Hello
there.


user
juanmi@dominio.com


OK
Password required.


pass
juanmi


OK
logged in.


list


OK POP3
clients that break here, they violate STD53.


1 4235


2 4235


3 422


.


quit


OK
Bye-bye.



Connection closed by foreign host.

 

Perfecto,
sigo teniendo los tres mails. Sigamos adelante, nos va quedando menos.


 


 


CUOTA DE
DISCO



 



 

Lo único que
haremos serán comprobaciones ya que las configuraciones las realizamos mas
atrás. El encargado de llevar a cabo el tema de las cuotas es Maildrop, cuando
enviamos un mensaje al buzon, Maildrop crea un archivo dentro de la carpeta
Maildir correspondiente al buzon llamado maildirsize (/cartas/dominio.com/juanmi/Maildir/maildirsize),
aquí tenemos cual es nuestra cuota máxima y cuanto van sumando nuestros
mensajes. Podemos comprobarlo así:

 


cartero:/#cat
/cartas/dominio.com/juanmi/Maildir/maildirsize


 


10000000S


       0    0


    4105    1


    4105    1


     411    1


 

Tengo 3 mails
con sus tamaños correspondientes y una cuota máxima de 10.000.000, alrededor de
10 Mb.

 

Perfecto
vamos a intentar superar esa cuota, bajémosla primero y luego llenaremos el
buzon.

 



cartero:~# mysql -D postfix -u root -e "UPDATE mailbox SET quota=’1000000S’
WHERE username=’juanmi@dominio.com’;"

 

Comprobemos
que se ha actualizado:

 



cartero:~# mysql -D postfix -u root -e "SELECT username, quota from mailbox
where username=’juanmi@dominio.com’;"



——————– ———-


|
username           | quota    |



——————– ———-


|
juanmi@dominio.com | 1000000S |



——————– ———-


 

Perfecto una
vez actualizada la cuota llenémosla:

 

Para ello yo
he utilizado el outlook express, le he puesto un archivito adjunto de 600 Kb, el
primer mail lo acepta pero el segundo me lo rechaza, este es el mensaje de
Postfix, que me aparece en el outlook express:


 


This is
the Postfix program at host cartero.dominio.com.

I’m sorry to have to inform you that your message could not be
be delivered to one or more recipients. It’s attached below.

For further assistance, please send mail to <postmaster>

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

The Postfix program

<juanmi@dominio.com
<mailto:juanmi@dominio.com>
>:
permission denied. Command output: maildrop: maildir over
quota.

 


 

Veamos que
nos dice el log:

 


cartero:~# vi
/var/log/mail.log

 


Apr 12
13:44:15 cartero postfix/qmgr[351]: A16C82AF10: from=<juanmi@dominio.com>,
size=903014, nrcpt=1 (queue active)


Apr 12
13:44:15 cartero postfix/smtpd[416]: disconnect from unknown[10.19.4.12]


Apr 12
13:44:15 cartero postfix/pipe[427]: A16C82AF10: to=<juanmi@dominio.com>,
relay=maildrop, delay=1, status=bounced (permiss


ion
denied. Command output: maildrop: maildir over quota. )


 


Perfecto,
otra forma de probarlo sin utilizar el outlook express es bajar mas la cuota y
empezar a llenarlo con mensaje de texto, acordaos de la línea de arriba:


 



cartero:~#cat /etc/lilo.conf |maildrop -d

juanmi@dominio.com
<mailto:juanmi@dominio.com>


 

Subamos de
nuevo la cuota, si queremos seguir haciendo pruebas, que podamos ¿no?

 

Volvemos a
poner el comando, pero esta vez con un 0 mas:


 



cartero:~# mysql -D postfix -u root -e "UPDATE mailbox SET quota=’10000000S’
WHERE


username=’juanmi@dominio.com <mailto:username=’juanmi@dominio.com>
‘;"


 


 


INSTALACION
SASL 1.5.27-3.1woody5


 


 

Este ha sido
otro de los huesos, y además algo sin lo que este servidor no puede estar,
necesitamos que para realizar el envío de correos el usuario se valide, sino
nuestro servidor seria un coladero para los que se dedican a enviar SPAM.

 

La otra
opción es utilizar la opción del archivo /etc/postfix/main.cf,
donde pone  mynetworks pusimos 127.0.0.1, debido a que yo quiero que se valide
todo el mundo, nunca sabes si dentro de tus redes quieren hacer envío de SPAM,
otra opción es que tu sepas quien va a enviar y le des permiso en mynetworks y
no utilizaras SASL.

 

Como os he
dicho la instalación de SASL fue muy dura, me obsesiones intentando pones la
versión sasl2, y claro no me acabo de funcionar, así que a por la de la versión
de woody, que funciona a las mil maravillas (Bendito WOODY).

 

Manos a la
obra:

 


** NOTA sobre
actualizacion **
(Junio 2005). Debido al cambio de la version estable
de Debian (paso de woody a sarge) me di de bruces con el sasl, en la version de
sarge no esta disponible la version de SASL 1.* es decir estamos obligados a
pasar a sasl2. Abajo pongo como instalarlo.

 



cartero:~# apt-get install sasl-bin libsasl-modules-plain libpam-mysql


 

Esta
instalación nos habrá dejado un par de directorios nuevos (/etc/postfix/sasl y
/etc/pam.d/) tenderemos que crearnos dos archivos nuevos para que postfix
autentique a los usuarios, debemos decirle a Postfix que utilice SASL y PAM y a
PAM que utilice a MYSQL para validar a los usuarios.

 

Lo dicho
debemos crearnos los dos archivos, el primero:

 


cartero:/# vi
/etc/postfix/sasl/smtpd.conf


 

Debe contener
lo siguiente:


 



pwcheck_method: pam


 

El otro
fichero a crear será /etc/pam.d/smtp y contendra lo siguiente:


 


auth required
pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox
usercolumn=username passwdcolum



n=password crypt=1


 


account
sufficient pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix
table=mailbox usercolumn=username passwd



column=password crypt=1


 

Acordaos del
ajuste de línea

 

Editaremos de
nuevo el archivo /etc/postfix/main.cf y añadiremos las siguientes
líneas:


 


 


#
========== SASL ===========



smtpd_sasl_auth_enable=yes



broken_sasl_auth_clients=yes



smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,check



_relay_domains


 

Cuidado de
nuevo con el ajuste línea

 

Reiniciamos
todos los servicios, hemos hecho demasiados cambios en la configuración, init 6
y reiniciamos la maquina.

 


Cartero:~#
init 6

 

Muy bien
después de hacer esto empezaremos a hacer pruebas, la primero que hago es
intentar mandar un correo, a un dominio de fuera, desde outlook express sin
marcarle la casilla de “Mi servidor requiere autenticación”, da este error:

 


El mensaje no
se pudo enviar, uno de los destinatarios fue rechazado por el servidor. Su
dirección de correo electrónico es "
juanmi@dominio
<mailto:juanmi@dominio>
defuera.com". Asunto ‘Prueba SASL’, Cuenta:
‘10.19.4.10’, Servidor: ‘10.19.4.10’, Protocolo: SMTP, Respuesta del servidor:
‘554 <juanmi@dominiodefuera.com>: Recipient address rejected: Relay access
denied’, Puerto: 25, Seguridad (SSL): No, Error de servidor: 554, Número de
error: 0x800CCC79


 

Perfecto,
marquemos ahora la casilla “Mi servidor requiere autenticación” para que nos
valide, nos debe enviar el correo y el log debe decirnos esto:

 



cartero:~# vi /var/log/mail.log

 


Apr 12
17:32:33 cartero postfix/smtpd[430]: connect from unknown[10.19.4.12]


Apr 12
17:32:33 cartero postfix/smtpd[430]: 485652AF10: client=unknown[10.19.4.12],
sasl_method=LOGIN, sasl_username=juanmi@dominio.com


Apr 12
17:32:33 cartero postfix/cleanup[439]: 485652AF10:
message-id=<009801c53f74$d8a5d4f0$0c04130a@xxxxx.local>


Apr 12
17:32:33 cartero postfix/qmgr[345]: 485652AF10: from=<juanmi@dominio.com>,
size=1377, nrcpt=1 (queue active)


Apr 12
17:32:33 cartero postfix/smtpd[430]: disconnect from unknown[10.19.4.12]


Apr 12
17:32:34 cartero postfix/smtp[442]: 485652AF10: to=<juanmi@dominiodefuera.com>,
relay=mailhost.dominiodefuera.com[195.54.44.123], del


ay=1,
status=sent (250 Ok, message saved)


Apr 12
17:32:34 cartero postfix/qmgr[345]: 485652AF10: removed

 

Perfecto,
validados contra mysql y enviando a un servidor de fuera.

 

Sin tener que
autenticarme, puedo enviar mensajes de correo a cuantas de dentro, es decir:

pedro@palotes.mentira <mailto:pedro@palotes.mentira>
podría enviar a

juanmi@dominio.com <mailto:juanmi@dominio.com>
sin tener que validarse, podemos hacer la
prueba:

 



cartero:~# telnet 10.19.4.10 25


Trying
10.19.4.10…


Connected
to 10.19.4.10.


Escape
character is ‘^]’.


220
cartero.dominio.com ESMTP MI DOMINIO


ehlo
localhost



250-cartero.dominio.com



250-PIPELINING


250-SIZE
10240000


250-ETRN


250-AUTH
LOGIN PLAIN



250-AUTH=LOGIN PLAIN


250
8BITMIME


mail
from:pedro@palotes.mentira


250 Ok


rcpt
to:juanmi@dominio.com


250 Ok


data


354 End
data with <CR><LF>.<CR><LF>


Hola


.


250 Ok:
queued as 4DD902AF10


quit


221 Bye



Connection closed by foreign host.

 

Y podemos ver
que nos ha llegado por ejemplo con este comando:

 



cartero:~#cat
/cartas/dominio.com/juanmi/Maildir/new/….cartero,S=403

 



Return-Path: <pedro@palotes.mentira>



Delivered-To: juanmi@dominio.com


Received:
from localhost (unknown [10.19.4.10])


       
by cartero.dominio.com (Postfix) with ESMTP id 4DD902AF10


       
for
<juanmi@dominio.com>; Tue, 12 Apr 2005 17:37:57 0200 (CEST)


Message-Id:
<20050412153757.4DD902AF10@cartero.dominio.com>


Date: Tue,
12 Apr 2005 17:37:57 0200 (CEST)


From:
pedro@palotes.mentira


To:
undisclosed-recipients:;


 


Hola

 

Si intentamos
hacer lo mismo contra un dominio de fuera, nos dará un error:

 



cartero:~# telnet 10.19.4.10 25

Trying
10.19.4.10…

Connected
to 10.19.4.10.

Escape
character is ‘^]’.

220
cartero.dominio.com ESMTP MI DOMINIO


ehlo
localhost


250-cartero.dominio.com


250-PIPELINING

250-SIZE
10240000

250-ETRN

250-AUTH
LOGIN PLAIN


250-AUTH=LOGIN PLAIN

250
8BITMIME


mail
from:pedro@palotes.mentira

250 Ok


rcpt
to:juanmi@dominiodefuera.es

554
<juanmi@dominiodefuera.es>: Recipient address rejected: Relay access denied


quit

221 Bye


Connection closed by foreign host.

 

Perfecto ya
no pueden utilizar nuestro servidor como una pasarela para enviar SPAM. Seguimos
adelante. Aun queda.

 



 


INSTALACION
DE APACHE 1.3.26-0woody6 Y SQUIRRELMAIL 1.2.6-3 (Luego desinstalaremos
Squirrelmail)

 

 

Bueno esta
instalación no tiene mucho de particular, saber que paquetes debemos instalar y
adelante. Sobre la configuración de apache, no hablare mucho, ya que no tengo
mucha idea.

 



cartero:~# apt-get install apache apache-common aspell libaspell10 libexpat1
libltdl3 libmm11 libpspell4 mime-support php4 php4-mysql squirrelmail
wwwconfig-common


 

En la
instalación de estos 13 paquetes nos preguntara si queremos utilizar Apache SSL,
yo en mi caso no. Nos hará otra pregunta sobre si queremos ver el archivo de
configuración de apache , yo le he dicho que no, y la ultima pregunta que nos
hace es si queremos habilitar en apache la extensión para MYSQL le diremos que
si, si por casualidad le habéis dicho que no, debéis añadir en
/etc/php4/apache/php.ini
la línea extension=mysql.so


 

Sobre la
instalación nada mas

 

Comprobemos
que se ha instalado bien en cualquier explorador con acceso al servidor ponemos:

 



http://10.19.4.10

 

Esta claro
que este es mi caso, en el vuestro poned vuestra dirección IP.

 


Welcome to Your New Home in Cyberspace!

Ahí tenéis la
bienvenida de apache.

 

Ahora tenemos
que dar acceso a apache para que nos enseñe los mails cuando accedamos por el
squirrelmail.

 


cartero:~#
chown maildrop:www-data /cartas/ -R


 

Ahora podemos
intentar utilizar squirrelmail en su versión mas simple, no hemos añadido ningún
plugin ni actualizado el idioma ni nada pero podemos probar, mete en cualquier
explorador web esta dirección e introduce los datos de la cuenta que hemos
creado:


 



<http://10.19.4.10/squirrelmail/index.php>


 


 

Luego
seguiremos hablando de la configuración de squirrelmail y de apache, ahora
instalaremos el antivirius


 



 


INSTALACION
DE AMAVIS-NEW 2.0030616p10-4.backports.org.1 Y


SPAMASSASSIN
3.0.2-0.backports.org.1



 

 

Para esta
instalación utilizaremos el paquete de Backports. Añadiremos las siguientes
líneas a nuestro fichero /etc/apt/sources.list


 


deb
http://www.backports.org/debian stable amavisd-new


deb-src
http://www.backports.org/debian stable postfix amavisd-new


 


deb
http://www.backports.org/debian stable clamav


deb-src
http://www.backports.org/debian stable clamav


 


deb
http://www.backports.org/debian stable spamassassin


deb-src
http://www.backports.org/debian stable spamassassin


 


deb
http://www.backports.org/debian stable unrar-nonfree


deb-src
http://www.backports.org/debian stable unrar-nonfree


 

después de
haber añadido las líneas al archivo haremos el correspondiente:


 



cartero:~# apt-get update


     
….


      ….


      ….


 

Perfecto, ya
tenemos hecho el update, ahora a instalar los paquetes, es aquí donde nos hace
falta la parte nonfree que decía al principio, ya que utilizaremos  el paquete
zoo para que amavis descomprima datos adjuntos y compruebe si
tienen virus:

 



cartero:~#apt-get install amavisd-new clamav clamav-base clamav-daemon
clamav-freshclam file libarchive-tar-perl libarchive-zip-perl libclamav1
libcompress-zlib-perl libconvert-tnef-perl libconvert-uulib-perl
libdigest-md5-perl libdigest-sha1-perl libgmp3 libhtml-parser-perl
libhtml-tagset-perl libio-multiplex-perl libio-stringy-perl libmailtools-perl
libmime-base64-perl libmime-perl libnet-perl libnet-server-perl libstorable-perl
libtime-hires-perl libtimedate-perl libunix-syslog-perl spamassassin spamc ucf
unrar-nonfree lha zoo bzip2 unarj


 

Diréis: que
cantidad de paquetes, pues si, eso digo yo, son descompresores que utilizara
amavis para la búsqueda de virus en archivos comprimidos y un montón mas de
cosas……

 

Ala a
instalar.

 

Nos va a
hacer unas preguntillas, una sobre si queremos que el demonio de actualización
del antivirus este activo, yo en mi caso le he dicho que si, recomendable. Luego
nos pregunta el sitio de donde descargaremos esta actualización y si queremos
que se nos notifique si ha sido actualizada la base de datos de virus, le
decimos que si.

 

La
instalación de estos paquetes me da un error:

 


Errors
were encountered while processing:


 base



 clamav-freshclam


 clamav


 clamav-daemon


E:
Sub-process /usr/bin/dpkg returned an error code (1)


 

Si os sale
volved a decirle:


 



cartero:~#apt-get install amavisd-new clamav clamav-base clamav-daemon
clamav-freshclam file libarchive-tar-perl libarchive-zip-perl libclamav1
libcompress-zlib-perl libconvert-tnef-perl libconvert-uulib-perl
libdigest-md5-perl libdigest-sha1-perl libgmp3 libhtml-parser-perl
libhtml-tagset-perl libio-multiplex-perl libio-stringy-perl libmailtools-perl
libmime-base64-perl libmime-perl libnet-perl libnet-server-perl libstorable-perl
libtime-hires-perl libtimedate-perl libunix-syslog-perl spamassassin spamc ucf
unrar-nonfree lha zoo bzip2 liblzo1 lzop unarj


 

Y ahora si
que funciona. No se porque lo hace pero luego funciona a la perfección.


 


Las
actualizaciones del antivirus las podemos ver editando el archivo en cuestión
con este comando:


 


cartero:/# vi
/var/log/clamav/freshclam.log


 

Ahora
configuraremos a AMAVIS.


 

Tenemos que
retocar un par de archivos, lo primero que haremos será editar el archivo
/etc/amavis/amavisd.conf.


 

Este archivo
de configuración es enorme así que solo os dejare lo que he cambiado, lo demás
lo he dejado tal y como viene por defecto, en algunas líneas a mi me viene por
defecto pero las pongo para que os cercioréis de que están así, aun así
explicare cada cosa:

 


$mydomain
= ‘dominio.com’;      # (no useful default)



$myhostname = ‘cartero.dominio.com’;  # fqdn of this host, default by uname(3)


#
@bypass_virus_checks_acl = qw( . );  # uncomment to DISABLE anti-virus code


#
@bypass_spam_checks_acl  = qw( . );  # uncomment to DISABLE anti-spam code



$final_virus_destiny      = D_REJECT; # (defaults to D_BOUNCE)



$final_banned_destiny     = D_REJECT;  # (defaults to D_BOUNCE)



$final_spam_destiny       = D_PASS;  # (defaults to D_REJECT)



$final_bad_header_destiny = D_PASS;  # (defaults to D_PASS), D_BOUNCE suggested



$warnbannedsender = 1;  # (defaults to false (undef))



$warnbadhsender = 1;    # (defaults to false (undef))



$virus_quarantine_to  = ‘virus-quarantine’;    # traditional local quarantine



$sa_spam_subject_tag = ‘***SPAM*** ‘;   # (defaults to undef, disabled)


$banned_filename_re =
new_RE(


#  qr’^UNDECIPHERABLE$’,  #
is or contains any undecipherable components


  
qr’.[^.]*.(exe|vbs|pif|scr|bat|cmd|com|dll)$’i, # some double extensions


   qr'[{}]’,     # curly
braces in names (serve as Class ID extensions – CLSID)



qr’..(exe|vbs|pif|scr|bat|cmd|com)$’i,           # banned extension – basic



qr’..(ade|adp|bas|bat|chm|cmd|com|cpl|crt|exe|hlp|hta|inf|ins|isp|js|


#       
jse|lnk|mdb|mde|msc|msi|msp|mst|pcd|pif|reg|scr|sct|shs|shb|vb|


#       
vbe|vbs|wsc|wsf|wsh)$’ix,                  # banned extension – long


  
qr’..(mim|b64|bhx|hqx|xxe|uu|uue)$’i, # banned extension – WinZip vulnerab.



qr’^.(zip|lha|tnef|cab)$’i,                      # banned file(1) types



qr’^.exe$’i,                                     # banned file(1) types



qr’^application/x-msdownload$’i,                  # banned MIME types



qr’^application/x-msdos-program$’i,


   qr’^message/partial$’i, 
# rfc2046. this one is deadly for Outcrook



qr’^message/external-body$’i, # block rfc2046


);



$sa_tag_level_deflt  = 4.0; # add spam info headers if at, or above that level



$sa_tag2_level_deflt = 5.0; # add ‘spam detected’ headers at that level

 

No hay que
comentar nada sobre las dos primeras líneas son mas que claras.

 

La tercera y
cuarta línea a mi me vienen por defecto así, pero aseguraos de que así están ya
que si no la detección de virus y spam no funcionara. La función de las líneas 5
6 7 y 8 es decirle a AMAVIS que debe hacer con los mails que localiza como
virus, spam, prohibidos o mal formados, reject significa rechazar y pass que le
dejamos pasar, yo he elegido estas configuraciones, vosotros podéis ponerlas
como queráis. Las líneas que comienzan con $warn son las que
definen si queremos que se avise al remitente del destino de lo que ha pasado
con su mail, yo las he descomentado para que envíe un mensaje al remitente,
cuidado con enviar un mensaje de aviso a los destinatarios de spam, sus dominios
casi nunca existen con lo cual podemos generar una cola de envíos bastante
grande. Sobre la línea $virus_quarantine decir que debe estar así,
los virus los meterá en la carpeta /var/lib/amavis/virusmails así
que si queremos borrarlos de vez en cuando pues ya sabéis rm
/var/lib/amavis/virusmails/*.
En la línea donde aparece ***SPAM***
se define que hará cuando reciba un mensaje que es SPAM, pues si la
descomentamos se escribirá en el asunto del mensaje ***SPAM*** y se dejara pasar
al buzon, para que el usuario repase de vez en cuando su correo y elimine el
spam. Sobre las ultimas líneas (que realmente es una línea pero que tiene muchas
opciones) decir que son importantes que las leáis, marcara como prohibidos los
mensajes con ficheros de tal extensión, ….. Saber que si esta descomentada esa
función entra en juego y si la descomentamos no.

 

Configuremos
ahora el archivo de postfix /etc/postfix/master.cf para que mande
los archivos a amavis al puerto 10024 y si todo va bien que lo mande al puerto
10025 de postfix. Debemos añadir al final del archivo las siguientes líneas:

 


#—AMAVIS—



127.0.0.1:10025 inet    n       –       n       –       –       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_mynetworks,reject


       
-o mynetworks=127.0.0.0/8


      
 -o strict_rfc821_envelopes=yes


       
-o smtpd_error_sleep_time=0


       
o
smtpd_soft_error_limit=1001


       
-o
smtpd_hard_error_limit=1000


 


amavis
unix – – n – 2 lmtp


       
-o lmtp_data_done_timeout=1200


       
-o lmtp_send_xforward_command=yes


 

Y en el
archivo /etc/postfix/main.cf añadir lo siguiente:

 


#========
AMAVIS ===========



content_filter = amavis:[127.0.0.1]:10024


 

En el mismo
archivo repasaremos el apartado SASL añadiendo o modificando las líneas que aquí
dejo, deben quedar como estas:

 


#
========== SASL ===========



smtpd_sasl_auth_enable=yes



broken_sasl_auth_clients=yes


 



smtpd_helo_required = yes



disable_vrfy_command = yes


 



smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,
reject_unauth_destination,reject_rbl_client
relays.ordb.org,permit


 



smtpd_data_restrictions =reject_unauth_pipelining,permit


 

Estos últimos
cambios son para añadir al sistema de correo otro tipo de medidas para rechazar
correo no deseado, este tipo de medidas son por ejemplo asegurarnos que el
proceso HELO que hacen a nuestro servidor se haga correctamente, deshabilitar la
concatenación de comandos (lo suelen usar los spammers en ataques de
diccionario), etc. Decir además que este orden debe quedarse como lo he puesto,
si ponemos al principio que no permita todo, pues pasara todo.

 

Ahora debemos
crearnos el siguiente archivo (No veáis lo que me ha costado hacer funcionar a
SpamAssassin, mas de una semana dando vueltas por listas de correo, google, etc)
Pero bueno ya esta hecho espero que a vosotros no os traiga tan locos. Todo el
problema se solucionaba creando el archivo /etc/maildroprc y
poniendo estas líneas:


 


cartero:/#
vi /etc/maildroprc


if (
$SIZE < 26144 )


{


   
exception {


      
xfilter "/usr/bin/spamassassin"


    }


}


 


if
(/^X-Spam-Flag: *YES/)


{


   
exception {


       
to "$HOME/$DEFAULT"


    }


}


else


{


   
exception {


       
to "$HOME/$DEFAULT"


   
}


}

 

Reiniciaremos
los servicios para que la nueva configuración tenga efecto:

 


cartero:/#
/etc/init.d/amavis restart


cartero:/#
/etc/init.d/postfix restart

 

Podemos
empezar a hacerle pruebas, si lo habéis dejado como yo debe aceptaros por
ejemplo el envío de archivos con extensión exe, probad que os acepta este tipo
de envíos, probad a adjuntar un archivo con doble extensión, es decir por
ejemplo archivo.zip.exe (esto lo hacen muchos virus, ya que en muchos
ordenadores se esconden las extensiones para archivos conocidos, la victima lee
archivo.zip y lo ejecuta y realmente lo que esta ejecutando es un exe) debe
rechazároslo, si lo habéis dejado como yo. Probad a adjuntar algún virus o
troyano (Yo lo he probado con el troyano back orifice, lo he descargado de

<http://heanet.dl.sourceforge.net/sourceforge/bo2k/bo2k_1_0.zip>

cuidado con lo que haceis con el). Si todo funciona como debe no os debe dejar
enviarlo y además os debe mandar una advertencia a vuestro mail. Miremos el log
y veremos como funciona:

 


cartero:/# vi
/var/log/mail.log

 


Apr 13
16:52:43 cartero postfix/smtpd[2346]: connect from unknown[10.19.4.12]


Apr 13
16:52:43 cartero postfix/smtpd[2346]: 779D02AF63: client=unknown[10.19.4.12],
sasl_method=LOGIN, sasl_username=juanmi@dominio.com


Apr 13
16:52:43 cartero postfix/cleanup[2355]: 779D02AF63:
message-id=<013f01c54038$78927ea0$0c04130a@dominio.local>


Apr 13
16:52:43 cartero postfix/qmgr[2171]: 779D02AF63: from=<juanmi@dominio.com>,
size=657520, nrcpt=1 (queue active)


Apr 13
16:52:43 cartero postfix/smtpd[2346]: disconnect from unknown[10.19.4.12]


Apr 13
16:52:44 cartero amavis[2088]: (02088-02) Clam Antivirus-clamd FAILED – unknown
status: /var/lib/amavis/amavis-20050413



T155047-02088/parts: Access denied. ERROR


Apr 13
16:52:44 cartero amavis[2088]: (02088-02) WARN: all primary virus scanners
failed, considering backups


Apr 13
16:52:45 cartero postfix/smtpd[2386]: connect from cartero[127.0.0.1]


Apr 13
16:52:45 cartero postfix/smtpd[2386]: 210772AF66: client=cartero[127.0.0.1]


Apr 13
16:52:45 cartero postfix/cleanup[2355]: 210772AF66:
message-id=<VA02088-02@cartero.dominio.com>


Apr 13
16:52:45 cartero postfix/qmgr[2171]: 210772AF66: from=<>, size=2928, nrcpt=1
(queue active)


Apr 13
16:52:45 cartero postfix/smtpd[2386]: disconnect from cartero[127.0.0.1]


Apr 13
16:52:45 cartero amavis[2088]: (02088-02) INFECTED (Trojan.Orifice2K.PI_#1,
Trojan.Lithium.Capture, BDC.Moses.115.EdS),


 <?@[10.19.4.12]>
-> <juanmi@dominio.com>, quarantine virus-20050413-165245-02088-02, Message-ID:
<013f01c54038$78927ea0$0c04130



a@dominio.local>, Hits: –


Apr 13
16:52:45 cartero postfix/lmtp[2358]: 779D02AF63: to=<juanmi@dominio.com>,
relay=127.0.0.1[127.0.0.1], delay=2, status=bou


nced
(host 127.0.0.1[127.0.0.1] said: 550 5.7.1 Message content rejected, id=02088-02
– VIRUS: Trojan.Orifice2K.PI_#1, Trojan.



Lithium.Capture, BDC.Moses.115.EdS (in reply to end of DATA command))


Apr 13
16:52:45 cartero postfix/cleanup[2355]: E72D62AF67:
message-id=<20050413145245.E72D62AF67@cartero.dominio.com>


Apr 13
16:52:45 cartero postfix/pipe[2389]: 210772AF66: to=<postmaster@dominio.com>,
relay=maildrop, delay=0, status=bounced (us


er
unknown. Command output: Invalid user specified. )


Apr 13
16:52:45 cartero postfix/qmgr[2171]: 210772AF66: removed


Apr 13
16:52:46 cartero postfix/qmgr[2171]: E72D62AF67: from=<>, size=52002, nrcpt=1
(queue active)


Apr 13
16:52:46 cartero postfix/qmgr[2171]: 779D02AF63: removed


Apr 13
16:52:46 cartero postfix/pipe[2389]: E72D62AF67: to=<juanmi@dominio.com>,
relay=maildrop, delay=1, status=sent (dominio.com


)


Apr 13
16:52:46 cartero postfix/qmgr[2171]: E72D62AF67: removed


Apr 13
16:52:48 cartero imaplogin: Connection, ip=[::ffff:10.19.4.12]


Apr 13
16:52:48 cartero imaplogin: LOGIN, user=juanmi@dominio.com,
ip=[::ffff:10.19.4.12]


Apr 13
16:52:48 cartero imaplogin: LOGOUT, user=juanmi@dominio.com,
ip=[::ffff:10.19.4.12], headers=0, body=0


Apr 13
16:52:48 cartero imaplogin: Connection, ip=[::ffff:10.19.4.12]


Apr 13
16:52:48 cartero imaplogin: LOGIN, user=juanmi@dominio.com,
ip=[::ffff:10.19.4.12]


Apr 13
16:52:48 cartero imaplogin: LOGOUT, user=juanmi@dominio.com,
ip=[::ffff:10.19.4.12], headers=0, body=51348

 

Si os fijáis,
el funcionamiento es simple, nos conectamos al puerto 25, SASL nos autentica,
mandamos el mail y postfix se lo pasa a amavis, amavis comprueba si tiene virus
y le da la contestación a postfix, postfix rechaza el mail infectado y manda un
correo al remitente diciéndole que no puede enviarlo porque tiene un virus.

 

Probad muchas
cosas, enviadlo en rar, zip, …… y aseguraos que lo que queréis es la
configuración que hemos hecho.

 

Para hacerle
la prueba a Spamassassin haremos lo siguiente:

 

Buscad el
archivo sample-spam.txt, en mi equipo esta


/usr/share/doc/spamassassin/examples/ y lo que hacemos es pedirle a spamassassin
que analize el archivo que le mandamos. Esto es lo que debe hacernos nuestro
sistema automáticamente, cuando llega un mensaje le pide a spamassassin que
analice el correo y lo puntúe, si supera 5 la etiquetara como spam. El comando
para hacer la prueba es este:

 


cartero:/# cd
/usr/share/doc/spamassassin/examples/



cartero:/usr/doc/spamassassin/examples# spamassassin -t <sample-spam.txt >
spam.out



cartero:/usr/doc/spamassassin/examples# vi spam.out


 

Y debe
enseñarnos esto:


 


Received:
from localhost by cartero


       
with SpamAssassin (version 3.0.2);


       
Tue, 19 Apr 2005 11:20:01 0200


From:
Sender <sender@example.net>


To:
Recipient <recipient@example.net>


Subject:
Test spam mail (GTUBE)


Date:
Wed, 23 Jul 2003 23:30:00 0200



Message-Id: <GTUBE1.1010101@example.net>



X-Spam-Flag: YES



X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on cartero



X-Spam-Status: Yes, score=997.2 required=5.0 tests=ALL_TRUSTED,GTUBE


       
autolearn=unavailable version=3.0.2



X-Spam-Level: **************************************************



MIME-Version: 1.0



Content-Type: multipart/mixed; boundary="———-=_4264CD41.11429616"


 


This is a
multi-part message in MIME format.


 



————=_4264CD41.11429616



Content-Type: text/plain



Content-Disposition: inline



Content-Transfer-Encoding: 8bit


 


Spam
detection software, running on the system "cartero", has



identified this incoming email as possible spam.  The original message


has been
attached to this so you can view it (if it isn’t spam) or label


similar
future email.  If you have any questions, see


the
administrator of that system for details.


 


Content
preview:  This is the GTUBE, the Generic Test for Unsolicited


  Bulk
Email If your spam filter supports it, the GTUBE provides a test


  by
which you can verify that the filter is installed correctly and is


 
detecting incoming spam. You can send yourself a test mail containing


  the
following string of characters (in upper case and with no white


  spaces
and line breaks): […]


 


Content
analysis details:   (997.2 points, 5.0 required)


 


 pts rule
name              description


—-
———————- ————————————————–


-2.8
ALL_TRUSTED            Did not pass through any untrusted hosts


1000
GTUBE                  BODY: Generic Test for Unsolicited Bulk Email


 


 



————=_4264CD41.11429616



Content-Type: message/rfc822; x-spam-type=original



Content-Description: original message before SpamAssassin



Content-Disposition: inline



Content-Transfer-Encoding: 8bit


 


Subject:
Test spam mail (GTUBE)



Message-ID: <GTUBE1.1010101@example.net>


Date:
Wed, 23 Jul 2003 23:30:00 0200


From:
Sender <sender@example.net>


To:
Recipient <recipient@example.net>



Precedence: junk



MIME-Version: 1.0



Content-Type: text/plain; charset=us-ascii



Content-Transfer-Encoding: 7bit


 


This is
the GTUBE, the


       
Generic


       
Test for


       
Unsolicited


       
Bulk


       
Email


 


If your
spam filter supports it, the GTUBE provides a test by which you


can
verify that the filter is installed correctly and is detecting incoming


spam. You
can send yourself a test mail containing the following string of



characters (in upper case and with no white spaces and line breaks):


 



XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X


 


You
should send this test mail from an account outside of your network.


 


 



————=_4264CD41.11429616–


 


Spam
detection software, running on the system "cartero", has



identified this incoming email as possible spam.  The original message


has been
attached to this so you can view it (if it isn’t spam) or label


similar
future email.  If you have any questions, see


the
administrator of that system for details.


 


Content
preview:  This is the GTUBE, the Generic Test for Unsolicited


  Bulk
Email If your spam filter supports it, the GTUBE provides a test


  by
which you can verify that the filter is installed correctly and is


 
detecting incoming spam. You can send yourself a test mail containing


  the
following string of characters (in upper case and with no white


  spaces
and line breaks): […]


 


Content
analysis details:   (997.2 points, 5.0 required)


 


 pts rule
name              description


—-
———————- ————————————————–


-2.8
ALL_TRUSTED            Did not pass through any untrusted hosts


1000
GTUBE                  BODY: Generic Test for Unsolicited Bulk Email


 

La siguiente
prueba la haremos desde outlook express, montaremos un mensaje de correo para el
usuario


juanmi@dominio.com <mailto:juanmi@dominio.com>
, en el asunto pondremos lo que nos de la
gana t en el body del mensaje pondremos esto:

 


This is
the GTUBE, the


      
Generic
       Test for
       Unsolicited
       Bulk
       Email

If your spam filter supports it, the GTUBE provides a test by which you
can verify that the filter is installed correctly and is detecting incoming
spam. You can send yourself a test mail containing the following string of
characters (in upper case and with no white spaces and line breaks):
 
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
 
You should send this test mail from an account outside of your network.

 

Nos debe
contestar con un mensaje parecido al de spam.out y un archivo adjunto.

 

Probemos con
un mensaje bueno, no vaya a ser que nos lo coja todo como spam, mandadle uno
como queráis con un simple hola. ¿Funciona bien verdad?

 

 

Seguimos
adelante ya tenemos configurado el antivirus y el antispam. El antivirus se
actualiza el solito pero al antispam tenemos que enseñarle a diferenciar Spam de
correo bueno.

 

Muy bien para
empezar deciros que para que SpamAssassin funcione como es debido debemos darle
al filtro bayesiano una suma de spam bastante grande, unos mil correos
detectados como spam, luego meterlos en una carpeta del servidor y luego
ejecutar este comando:

 



cartero:/# sa-learn –spam /cartas/dominio.com/juanmi/Maildir/cur


Learned
from 1991 message(s) (1992 message(s) examined).

 

Como veis yo
he metido los mails detectados como spam en ese directorio (Ahora os cuento como
lo he  hecho) y luego simplemente le he dicho que se ponga a aprender.

 

Para meter
los mails yo he hecho lo siguiente, tengo una cuenta de correo que recibe los
spam del dominio de mi trabajo, la he recibido con Outlook express configurando
lo cuenta como es debido, luego he agregado la cuenta del dominio que estamos
creando en nuestro caso dominio.com como IMAP, importante lo de IMAP, He
seleccionado todos los mensajes de la cuenta de mi trabajo y le he dicho Mover a
Carpeta y ahí he marcado la bandeja de entrada de dominio.com. Por cierto
CUIDADO CON LA CUOTA DEL BUZON.

 

Le hemos
metido SPAM, ahora debemos meterle HAM, que es el correo bueno.

 

Vamos allá,
haré el mismo proceso que he utilizado para pasar los mails al servidor pero
ahora los pasare buenos.

 

Previamente y
después de haberle enseñado a SpamAssassin el correo malo, he borrado los
mensajes que tenia para meterle el correo bueno. Lo he borrado mediante el
comando purgar de Outlook express.

 


cartero:/#
sa-learn –ham /cartas/dominio.com/juanmi/Maildir/cur


Learned
from 663 message(s) (670 message(s) examined).


 

Muy bien
intentemos hacer una prueba: para ver si el filtro bayesiano funciona. En mi
caso la prueba no puedo hacerla desde fuera ya que aun no he publicado el
dominio, es decir tengo que hacerla desde dentro del servidor. He cogido un
mensaje que me ha llegado como SPAM a otra cuenta de correo y he guardado el
mensaje, luego he creado el siguiente archivo /cosas/bayesiano.txt
y he metido el mensaje de correo que me llego:


 



cartero:/cosas# vi bayesiano.txt


Received:
from mail pickup service by arcexchange.dominioexterno.es with Microsoft
SMTPSVC;


     
 Tue, 19 Apr 2005 12:43:59 0200



Thread-Topic: peak performance


Received:
from unclebear.com ([218.80.86.242]) by arcexchange.dominioexterno.es with
Microsoft SMTPSVC(5.0.2195.6713); Tue, 19 Apr 2005 12:43:57 0200



Message-ID: <F9BAB10E.7DED040@unclebear.com>



X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478


Date: Tue,
19 Apr 2005 17:18:22 -0700


Reply-To:
"pansy fox" <matildecleland@unclebear.com>


From:
"pansy fox" <matildecleland@unclebear.com>



User-Agent: Pegasus Mail for Win32 (v3.12a)



X-Accept-Language: en-us



MIME-Version: 1.0


To:
"Miranda Elliott" <sales@cove.es>


Subject:
sales@cove.es – Bayesian Filter detected spam – peak performance



Content-Type: text/html;


     
charset="us-ascii"



Content-Transfer-Encoding: 7bit



Return-Path: <matildecleland@unclebear.com>



X-OriginalArrivalTime: 19 Apr 2005 10:43:58.0859 (UTC)
FILETIME=[B14D7DB0:01C544CC]


 


<HTML>


&quot;My
girlfriend loves the results, but she doesn’t know what I do. She


thinks


it’s
natural&quot; -Thomas, CA<br>


<br>



&quot;I’ve been using your product for 4 months now. I’ve increased my


length
from 2&quot;


to nearly
6&quot; . Your product has saved my sex life.&quot; -Matt, FL<br>


<br>


<br>


Pleasure
your partner every time with a bigger, longer, stronger  Unit<br>


Realistic
gains quickly<br>


<br><a
href="http://aiom.4C.ultimatemasterproduct.com/d/">to be a stud


press
here</a>


<br>


<br>


<br>


<br>All
you need do is to toss one into your mouth each day and swallow it


<br><a
href="http://ivf.uDmN.ultimatemasterproduct.com/d/">no, then link


above</a>


<br>At
this they both put their heads over the side of the buggy and looked



down<br>Yes; there was land below them; and not so very far away, either It


will
nourish you, satisfy your hunger and build up your health and strength


The
ordinary food of mankind is more or less injurious; this is entirely



beneficial



</FONT></HTML>


 



cartero:/cosas# spamassassin -t <bayesiano.txt > bayesiano.out



cartero:/cosas# vi bayesiano1.out


Received:
from localhost by cartero


       
with SpamAssassin (version 3.0.2);


    
   Tue, 19 Apr 2005 11:57:45 0200


From:
"pansy fox" <matildecleland@unclebear.com>


To:
"Miranda Elliott" <sales@cove.es>


Subject:
sales@cove.es – Bayesian Filter detected spam – peak performance


Date: Tue,
19 Apr 2005 17:18:22 -0700



Message-Id: <F9BAB10E.7DED040@unclebear.com>



X-Spam-Flag: YES



X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on cartero



X-Spam-Status: Yes, score=7.1 required=5.0 tests=ADDRESS_IN_SUBJECT,BAYES_99,


       
DATE_IN_FUTURE_12_24,HTML_20_30,HTML_MESSAGE,MIME_HTML_ONLY


       
autolearn=no version=3.0.2



X-Spam-Level: *******



MIME-Version: 1.0



Content-Type: multipart/mixed; boundary="———-=_4264D619.0BFB706A"


 


This is a
multi-part message in MIME format.


 



————=_4264D619.0BFB706A



Content-Type: text/plain



Content-Disposition: inline



Content-Transfer-Encoding: 8bit


 


Spam
detection software, running on the system "cartero", has



identified this incoming email as possible spam.  The original message


has been
attached to this so you can view it (if it isn’t spam) or label


similar
future email.  If you have any questions, see


the
administrator of that system for details.


 


Content
preview:  "My girlfriend loves the results, but she doesn’t know


  what I
do. She thinks it’s natural" -Thomas, CA "I’ve been using your


  product
for 4 months now. I’ve increased my length from 2" to nearly 6"


  . Your
product has saved my sex life." -Matt, FL […]


 


Content
analysis details:   (7.1 points, 5.0 required)


 


 pts rule
name              description


—-
———————- ————————————————–


 3.0
DATE_IN_FUTURE_12_24   Date: is 12 to 24 hours after Received: date


 1.8
ADDRESS_IN_SUBJECT     To: address appears in Subject


 0.2
HTML_20_30             BODY: Message is 20% to 30% HTML


 1.9
BAYES_99               BODY: Bayesian spam probability is 99 to 100%



                            [score: 1.0000]


 0.2
MIME_HTML_ONLY         BODY: Message only has text/html MIME parts


 0.0
HTML_MESSAGE           BODY: HTML included in message


 


The
original message was not completely plain text, and may be unsafe to


open with
some email clients; in particular, it may contain a virus,


or
confirm that your address can receive spam.  If you wish to view


it, it
may be safer to save it to a file and open it with an editor.


 


 



————=_4264D619.0BFB706A



Content-Type: message/rfc822; x-spam-type=original



Content-Description: original message before SpamAssassin



Content-Disposition: attachment



Content-Transfer-Encoding: 8bit


 


Received:
from mail pickup service by arcexchange.dominioexterno.es with Microsoft
SMTPSVC;


        
Tue, 19 Apr 2005 12:43:59 0200



Thread-Topic: peak performance


Received:
from unclebear.com ([218.80.86.242]) by arcexchange.dominioexterno.es with
Microsoft SMTPSVC(5.0.2195.6713); Tue, 19 Apr 2


005
12:43:57 0200



Message-ID: <F9BAB10E.7DED040@unclebear.com>



X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478


Date: Tue,
19 Apr 2005 17:18:22 -0700


Reply-To:
"pansy fox" <matildecleland@unclebear.com>


From:
"pansy fox" <matildecleland@unclebear.com>



User-Agent: Pegasus Mail for Win32 (v3.12a)



X-Accept-Language: en-us



MIME-Version: 1.0


To:
"Miranda Elliott" <sales@cove.es>


Subject:
sales@cove.es – Bayesian Filter detected spam – peak performance



Content-Type: text/html;


       
charset="us-ascii"



Content-Transfer-Encoding: 7bit



Return-Path: <matildecleland@unclebear.com>



X-OriginalArrivalTime: 19 Apr 2005 10:43:58.0859 (UTC)
FILETIME=[B14D7DB0:01C544CC]


 


<HTML>


&quot;My
girlfriend loves the results, but she doesn’t know what I do. She


thinks


it’s
natural&quot; -Thomas, CA<br>


<br>



&quot;I’ve been using your product for 4 months now. I’ve increased my


length
from 2&quot;


to nearly
6&quot; . Your product has saved my sex life.&quot; -Matt, FL<br>


<br>


<br>


Pleasure
your partner every time with a bigger, longer, stronger  Unit<br>


Realistic
gains quickly<br>


<br><a
href="http://aiom.4C.ultimatemasterproduct.com/d/">to be a stud


press
here</a>


<br>


<br>


<br>


<br>All
you need do is to toss one into your mouth each day and swallow it


<br><a
href="http://ivf.uDmN.ultimatemasterproduct.com/d/">no, then link


above</a>


<br>At
this they both put their heads over the side of the buggy and looked



down<br>Yes; there was land below them; and not so very far away, either It


will
nourish you, satisfy your hunger and build up your health and strength


The
ordinary food of mankind is more or less injurious; this is entirely



beneficial



</FONT></HTML>


 


 



————=_4264D619.0BFB706A–


 


Spam
detection software, running on the system "cartero", has



identified this incoming email as possible spam.  The original message


has been
attached to this so you can view it (if it isn’t spam) or label


similar
future email.  If you have any questions, see


the
administrator of that system for details.


 


Content
preview:  "My girlfriend loves the results, but she doesn’t know


  what I
do. She thinks it’s natural" -Thomas, CA "I’ve been using your


  product
for 4 months now. I’ve increased my length from 2" to nearly 6"


  . Your
product has saved my sex life." -Matt, FL […]


 


Content
analysis details:   (7.1 points, 5.0 required)


 


 pts rule
name              description


—-
———————- ————————————————–


 3.0
DATE_IN_FUTURE_12_24   Date: is 12 to 24 hours after Received: date


 1.8
ADDRESS_IN_SUBJECT     To: address appears in Subject


 0.2
HTML_20_30             BODY: Message is 20% to 30% HTML


 1.9
BAYES_99               BODY: Bayesian spam probability is 99 to 100%



                            [score: 1.0000]


 0.2
MIME_HTML_ONLY         BODY: Message only has text/html MIME parts


 0.0
HTML_MESSAGE           BODY: HTML included in message


 

Perfecto
funciona a las mil maravillas, si os fijáis el filtro bayesiano ya nos da una
puntuación. El mensaje a superado los 5 puntos y nos lo rechaza.

 

Podemos hacer
casi infalible el sistema AntiSpam, me explico, si sabemos donde va a haber
correo bueno y correo malo podemos decirle a cron que ejecute los comandos
sa-learn –ham /directorio_HAM
y sa-learn –spam
/directorio_SPAM.
De esta forma si diariamente SpamAssassin va
actualizando su base de datos bayesiana, el filtrado de correo lo haremos cada
día mejor.

 

Mas opciones
de filtrado de SpamAssassin son las WhiteList y las BlackList, podemos añadir a
la lista de cualquiera de ellas de la siguiente forma:

 


spamassassin
add-addr-to-whitelist=*@dominioquequiera.dom
<mailto:add-addr-to-whitelist=*@dominioquequiera.dom>


 


spamassassin
add-addr-to-whitelist=pericopalotes@dominioquequiera.dom
<mailto:add-addr-to-whitelist=pericopalotes@dominioquequiera.dom>


 


spamassassin
add-addr-to-blacklist=*@dominioquequiera.dom
<mailto:add-addr-to-blacklist=*@dominioquequiera.dom>


 


spamassassin
add-addr-to-blacklist=pericopalotes@dominioquequiera.dom
<>

 

Estos
comandos forzaran a la lista automática a que recoja los valores que le digamos.
Se puede hacer de forma manual editando el archivo


./spamassassin/users_prefs a mi me lo ha metido en el directorio cartas.

 

Se que
existen muchas mas opciones para configurar SpamAssassin, cambiar las
puntuaciones, idiomas, etc. Pero no se como ni donde cambiarlas, solo he leído
esto:

 


cartero:/#
man Mail::SpamAssassin::Conf

 

Estoy un poco
verde en el uso de SpamAssassin, todo lo que me digáis será bueno.

 

Si os va
lento, mucha gente se queja, podéis mirar en


<http://wiki.apache.org/spamassassin/FasterPerformance>

yo todavía no lo he probado demasiado.

 

Dejar una
cosa clara antes de pasar a otro punto, no se si esta funcionando de manera
optima el SpamAssassin, si alguien ha conseguido montarlo de otra forma o
sacarle mas configuraciones POR FAVOR enviadme un mail a


juanmi@planalfa.es <mailto:juanmi@planalfa.es>


 


 


INSTALACION
DE POSTFIXADMIN

 

 

La
instalación de Postfixadmin, es muy fácil, he utilizado el postfixadmin que
utiliza Marco A. S. Maximo en su manual
(http://www.linuxdicas.com.br/tutoriais1/tutorial_courier_mysql_postfix.txt), lo
he traducido a castellano y he retocado su script para crear a la vez que el
buzon de correo una carpeta llamada Spam. Esta carpeta nos valdrá para que
maildrop al localizar Spam, nos lo envíe a la carpeta Spam.

 

La
instalación de Postfix, no es una instalación como tal, se trata de dejarlo
publicado para poder acceder a el.

 

He dejado
publicado en internet el postfixadmin traducido al castellano por mi en la
dirección


<http://www.dominio.com/postfixadmin>

O os lo envio
por correo.

 



cartero:/cosas/# wget


http://www.dominio.com/postfixadmin_modificado.tar
<http://www.juagu.com/postfixadmin_modificado.tar>



cartero:/cosas/# mkdir /var/www/html



cartero:/cosas/# tar xvf postfixadmin.tar -C /var/www/html/



cartero:/cosas/# mv /var/www/html/postfixadmin/*.sh /var/www/



cartero:/cosas/# chmod 700 /var/www/*.sh



cartero:/cosas/# chown www-data:www-data /var/www/postfixadmin/ -R

 

Ahora
tendremos que editar el archivo /var/www/html/postfixadmin/config.inc.php
para que postfixadmin logre conectarse a la base de datos.

 



cartero:/cosas/# vi /var/www/html/postfixadmin/config.inc.php


 


// Login
information for the database^M


$db_host
= "localhost";^M


$db_name
= "postfix";^M


$db_user =
"postfixadmin";^M


$db_pass =
"postfixadmin";^M


 

Solo
cambiaremos el apartado para la conexión con la base de datos, es decir lo que
he dejado ahí arriba.


 

Seguimos
adelante, para que postfixadmin funcione como es debido debemos instalar SUDO,
utilizaremos esta aplicación para que se ejecuten como WWW-DATA los scripts de
creación de buzones.

 

Vamos a
instalarlo:

 



cartero:/# apt-get install sudo


 

El archivo de
configuración es /etc/sudoers, vamos a añadir las líneas para que haga lo que
queremos. Debe quedar como las que pongo aquí abajo.


 


cartero:/#
vi /etc/sudoers


 


# sudoers
file.


#


# This
file MUST be edited with the ‘visudo’ command as root.


#


# See the
man page for details on how to write a sudoers file.


#


 


# Host
alias specification


 


# User
alias specification


 


# Cmnd
alias specification


 


# User
privilege specification


root   
ALL=(ALL) ALL


www-data
ALL=NOPASSWD:/var/www/adduser.sh


www-data
ALL=NOPASSWD:/var/www/userdel.sh

 

Si editamos
los scripts de creación de buzones podemos ver lo siguiente:

 


cartero:/# vi
/var/www/adduser.sh


 


#!/bin/bash


 


# Script para
creación de diretorios del usuario


#


#


 



home_base=$1


if [ !

"$home_base" ]; then


    echo
"Falta una variable"


       
exit
0


fi


 


 


login=$2


if [ !
"$login" ]; then


    echo
"Falta una variable"


       
exit
0


fi


 


 


domain=$3


 



userdir="$home_base/$domain/$login"


 


 


 


mkdir -p
$userdir



maildirmake $userdir/Maildir



maildirmake -f Spam $userdir/Maildir


cp
/cartas/courierimapsubscribed $userdir/Maildir


chmod -R
770 $userdir


chown -R
maildrop:www-data $userdir

 

 

Si os fijáis
lo que hago después de crear el buzon, creo una carpeta llamada Spam y copio el
archivo /cartas/courierimapsubscribed en el nuevo buzon. Esto
ultimo lo hago para que nada mas entrar el nuevo usuario tenga le aparezca la
carpeta Spam, si damos con algún usuario torpe (que será lo común) este no
añadirá jamás la carpeta Spam y no podrá revisarla. El archivo



/cartas/courierimapsubscribed

contiene lo
siguiente:

 


cartero:/# vi
/cartas/courierimapsubscribed


 



INBOX.Elementos Enviados



INBOX.Papelera



INBOX.Borrador


INBOX.Spam

 

Veréis que
esta en castellano, como aun no nos hemos puesto con Squirrelmail dejad esto
para cuando tengamos terminado el Squirrelamail.

 

Ya tenemos
instalado y funcionando perfectamente Postfixadmin (No sabéis la de trabajo que
ahorra esta web que se ha trabajado el equipo de High5).

 

 



RECONFIGURACION DE SQUIRRELMAIL Y ACTUALIZACION A LA VERSION 1.4.4


 

Os
preguntareis porque he reconfigurado Squirrelmail, bueno la versión que instala
woody es bastante antigua y los plugins que existen para esa versión son muy
pocos. Lo actualice para que me aceptase mas plugins y para poder configurarlo
de la forma mas fácil, en cuanto a estas configuraciones, la versión 1.4.4 esta
muchísimo mejor trabajada que la de woody.

 

Empezaremos
desinstalando el antiguo squirrelmail, nos ha venido muy bien instalarlo porque
nos ha instalado todas sus dependencias, ahora lo único que haremos será
quitarlo y poner el nuevo.


 


cartero:/#
dpkg -r squirrelmail


cartero:/#
dpkg -p squirrelmail


cartero:/#
dpkg –purge squirrelmail


 

Ahora nos
bajamos la versión mas actual y estable de squirrelmail desde su pagina o mi
version retocada:

 



cartero:/cosas/# wget


<http://ovh.dl.sourceforge.net/sourceforge/squirrelmail/squirrelmail-1.4.4.tar.bz2>



cartero:/cosas/# mkdir /var/www/dominio/



cartero:/cosas/# tar xvf correo.tar -C /var/www/dominio.com/

<http://ovh.dl.sourceforge.net/sourceforge/squirrelmail/squirrelmail-1.4.4.tar.bz2>



cartero:/cosas/# mv squirrelmail-1.4.4 correo


 

Ya tenemos la
versión 1.4.4 de squirrelmail publicada en nuestro web.


 

Ahora
configuremoslo, para empezar cambiaremos el idioma, esto es algo complicado
porque debemos instalarnos unos paquetes y reconfigurarlos:

 



cartero:/cosas/# apt-get install locales



cartero:/cosas/# dpkg-reconfigure locales


 

Reiniciemos
el servicio apache para que no coja las nuevas configuraciones.


 



cartero:/cosas/# /etc/init.d/apache restart

 

Una vez
reiniciado el servicio ejecutaremos la pequeña aplicación para configurar
squirrelmail:


 



cartero:/cosas/# cd /var/www/dominio.com/correo/config/



cartero:/var/www/dominio.com/correo/config/# ./conf.pl


 



SquirrelMail Configuration : Read: config.php (1.4.0)



———————————————————


Main Menu


1. 
Organization Preferences


2. 
Server Settings


3. 
Folder Defaults


4. 
General Options


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


 

Como veis es
muy fácil de configurar, solo tenemos que ir entrando en cada uno de los
apartados y decirle lo que vamos necesitando.

 

Las cosas a
tener en cuenta en esta configuración son la forma en la que conectara
squirrelmail al servidor IMAP, donde se encuentra este y el idioma, os dejo mas
abajo las configuraciones:

 



SquirrelMail Configuration : Read: config.php (1.4.0)



———————————————————


Server
Settings


 


General


——-


1. 
Domain                 : dominio.com


2. 
Invert
Time            : false


3. 
Sendmail or SMTP       : SMTP


 


A. 
Update IMAP Settings   : 127.0.0.1:143 (courier)


B. 
Update SMTP Settings   : 127.0.0.1:25


 


R  
Return to Main Menu


C   Turn
color on


S   Save
data


Q   Quit


 


Command
>>


 


 



SquirrelMail Configuration : Read: config.php (1.4.0)



———————————————————


Language
preferences


1. 
Default Language       : es_ES


2. 
Default Charset        : iso-8859-1


3. 
Enable lossy encoding  : false


 


R  
Return to Main Menu


C   Turn
color on


S   Save
data


Q   Quit


 


Command >>


 

Vale, ahora
comprobemos que todo esta en castellano, si vemos que no nos sale aun, volvamos
a hacer cartero:/cosas/# dpkg-reconfigure locales.


 

Es hora de
meterse en la pagina de squirrel y bajarnos todos los plugins que nos parezcan
buenos. Yo tengo instalados los siguientes:

 



SquirrelMail Configuration : Read: config.php (1.4.0)



———————————————————


Plugins


 
Installed Plugins


    1.
translate


    2.
squirrelspell


    3.
calendar


    4.
abook_take


    5.
compatibility


   
6.
change_mysqlpass


    7.
quota_usage


   
8.
abook_import_export


    9.
address_add


    10.
archive_mail


    11.
autocomplete


    12.
msg_flags


    13.
notify


    14.
quicksave


    15.
view_as_html


 


 
Available Plugins:


   


R  
Return to Main Menu


C   Turn
color on


S   Save
data


Q   Quit


 


Command >>


 

Para la
instalación de los plugins tenemos que descargarlos y descomprimirlos en la
carpeta /var/www/dominio.com/correo/plugins. Leer dentro de cada
uno de los plugins las indicaciones de instalación y luego entrar en el archivo
de configuración ./conf.pl y decirle que lo habilite.

 

Sobre todos
los plugin debo deciros que os tocara entrar en cada pagina .php que necesitéis
retocar y cambiarla a castellano, muchos de ellos no acepta la configuración de
locales.

 

Sobre el
plugin quota_usage debo deciros que es muy bueno pero que tendremos que
retocarlo para que nos funcione con debian y la versión de Imap que tenemos, los
cambios que debemos realizar son los siguientes,

 


cartero:/# vi
/var/www/dominio.com/correo/plugins/quota_usage/functions.php

 

Buscaremos la
función  sqimap_get_quota, es la que pongo aquí debajo:

 

 


/**


  * Gets
current quota usage from IMAP server


  *


  *
@param resource $imap_stream An open stream to the IMAP server


  *
@param string $mailbox The mail folder for which to check quota


 
*                        usage


  *


  *
@return array A four-element array, consisting of numbers in kilobytes


  *      
        representing (in this order): 


 
*                  – storage used (size quota)


 
*                  – total storage available (size quota)


 
*                  – messages used (message count quota)


 
*                  – total messages available (message count quota)


 
*               If either size or message count quota is not available,


 
*               the corresponding numbers will instead be returned as


 
*               empty strings.


 
*               If no quota is given or available, the first element


 
*               in the return array is given as "NOQUOTA".


  *


  */


function
sqimap_get_quota ($imap_stream, $mailbox)


{


 


   global
$quota_usage_debug;


 


   if
(check_quota_capability($imap_stream))


   {


 


     
$imap_command = "a001 GETQUOTAROOT "$mailbox"
";


 


     
fputs ($imap_stream, $imap_command);


     
$read_ary = sqimap_read_data ($imap_stream, ‘a001’, true, $result, $message);


 


      if
(check_sm_version(1, 5, 0))


      
  $read_ary = $read_ary[‘a001’];


 


      if
($quota_usage_debug)


      {


        
echo "IMAP command sent: $imap_command<br />";


        
echo ‘IMAP response recieved:’;


        
sm_print_r($read_ary);


      }


 


     
foreach ($read_ary as $response)


      {


        
$storageUsed = »;


        
$storageTotal = »;


        
$messagesUsed = »;


        
$messagesTotal = »;


        
if (is_array($response))



            foreach ($response as $resp)



            {



               if (strpos($resp, ‘STORAGE’) !== FALSE || strpos($resp,
‘MESSAGE’) !== FALSE)



               {



                  preg_match(‘/[(]([STORAGEMESSAGE0-9 ] )[)]/’, $resp,
$matches);



                  $usageArray = explode(‘ ‘, $matches[1]);



                  if ($usageArray[0] == ‘STORAGE’)


  
                  list($storageUsed, $storageTotal) = array($usageArray[1],
$usageArray[2]);



                  if (!empty($usageArray[3]) && $usageArray[3] == ‘STORAGE’)



                     list($storageUsed, $storageTotal) = array($usageArray[4],
$usageArray[5]);



                  if ($usageArray[0] == ‘MESSAGE’)



                     list($messagesUsed, $messagesTotal) = array($usageArray[1],
$usageArray[2]);



                  if (!empty($usageArray[3]) && $usageArray[3] == ‘MESSAGE’)



                     list($messagesUsed, $messagesTotal) = array($usageArray[4],
$usageArray[5]);



                  return array($storageUsed, $storageTotal, $messagesUsed,
$messagesTotal);



               }



            }


        
else if (strpos($response, ‘STORAGE’) !==

FALSE ||
strpos($response, ‘MESSAGE’) !==

FALSE)


        
{



            preg_match(‘/[(]([STORAGEMESSAGE0-9 ] )[)]/’, $response, $matches);



            $usageArray = explode(‘ ‘, $matches[1]);



            if ($usageArray[0] == ‘STORAGE’)



               list($storageUsed, $storageTotal) = array($usageArray[1],
$usageArray[2]);



            if (!empty($usageArray[3]) && $usageArray[3] == ‘STORAGE’)



               list($storageUsed, $storageTotal) = array($usageArray[4],
$usageArray[5]);


    
       if ($usageArray[0] == ‘MESSAGE’)



               list($messagesUsed, $messagesTotal) = array($usageArray[1],
$usageArray[2]);



            if (!empty($usageArray[3]) && $usageArray[3] == ‘MESSAGE’)



               list($messagesUsed, $messagesTotal) = array($usageArray[4],
$usageArray[5]);



            return array($storageUsed, $storageTotal, $messagesUsed,
$messagesTotal);


        
}


     }


 


   }


 


   return
array(‘NOQUOTA’);


 


}


 

Una vez
localizada lo único que tendremos que hacer es comentar tres líneas, os dejo la
función completa con las líneas comentadas:

 


/**


  * Gets
current quota usage from IMAP server


  *


  *
@param resource $imap_stream An open stream to the IMAP server


  *
@param string $mailbox The mail folder for which to check quota


  *  
                     usage


  *


  *
@return array A four-element array, consisting of numbers in kilobytes


 
*               representing (in this order): 


 
*                  – storage used (size quota)


 
*                  – total storage available (size quota)


 
*                  – messages used (message count quota)


 
*                  – total messages available (message count quota)


 
*               If either size or message count quota is not available,


 
*               the corresponding numbers will instead be returned as


 
*               empty strings.


 
*               If no quota is given or available, the first element


 
*               in the return array is given as "NOQUOTA".


  *


  */


function
sqimap_get_quota ($imap_stream, $mailbox)


{


 


   global
$quota_usage_debug;


  /**


  * if
(check_quota_capability($imap_stream))


  * {


  */


     
$imap_command = "a001 GETQUOTAROOT "$mailbox"
";


 


     
fputs ($imap_stream, $imap_command);


     
$read_ary = sqimap_read_data ($imap_stream, ‘a001’, true, $result, $message);


 


      if
(check_sm_version(1, 5, 0))


        
$read_ary = $read_ary[‘a001’];


 


      if
($quota_usage_debug)


      {


        
echo "IMAP command sent: $imap_command<br />";


        
echo ‘IMAP response recieved:’;


        
sm_print_r($read_ary);


      }


 


     
foreach ($read_ary as $response)


      {


        
$storageUsed = »;


        
$storageTotal = »;


        
$messagesUsed = »;


        
$messagesTotal = »;


        
if (is_array($response))



            foreach ($response as $resp)



            {



               if (strpos($resp, ‘STORAGE’) !== FALSE || strpos($resp,
‘MESSAGE’) !== FALSE)



               {



                  preg_match(‘/[(]([STORAGEMESSAGE0-9 ] )[)]/’, $resp,
$matches);



                  $usageArray = explode(‘ ‘, $matches[1]);



                  if ($usageArray[0] == ‘STORAGE’)



                     list($storageUsed, $storageTotal) = array($usageArray[1],
$usageArray[2]);



                  if (!empty($usageArray[3]) && $usageArray[3] == ‘STORAGE’)



                     list($storageUsed, $storageTotal) = array($usageArray[4],
$usageArray[5]);



                  if ($usageArray[0] == ‘MESSAGE’)



                     list($messagesUsed, $messagesTotal) = array($usageArray[1],
$usageArray[2]);



                  if (!empty($usageArray[3]) && $usageArray[3] == ‘MESSAGE’)



                     list($messagesUsed, $messagesTotal) = array($usageArray[4],
$usageArray[5]);



                  return array($storageUsed, $storageTotal, $messagesUsed,
$messagesTotal);



               }



            }


        
else if (strpos($response, ‘STORAGE’) !==

FALSE ||
strpos($response, ‘MESSAGE’) !==

FALSE)


        
{



            preg_match(‘/[(]([STORAGEMESSAGE0-9 ] )[)]/’, $response, $matches);



            $usageArray = explode(‘ ‘, $matches[1]);



            if ($usageArray[0] == ‘STORAGE’)



               list($storageUsed, $storageTotal) = array($usageArray[1],
$usageArray[2]);



            if (!empty($usageArray[3]) && $usageArray[3] == ‘STORAGE’)



               list($storageUsed, $storageTotal) = array($usageArray[4],
$usageArray[5]);



            if ($usageArray[0] == ‘MESSAGE’)



               list($messagesUsed, $messagesTotal) = array($usageArray[1],
$usageArray[2]);



            if (!empty($usageArray[3]) && $usageArray[3] == ‘MESSAGE’)



               list($messagesUsed, $messagesTotal) = array($usageArray[4],
$usageArray[5]);



            return array($storageUsed, $storageTotal, $messagesUsed,
$messagesTotal);


        
}


     }


 


   }


 


   return
array(‘NOQUOTA’);


/**


* }


*/


 

En total,
tres líneas, lo que hacemos al anular estas tres líneas es quitar la
comprobación de nuestra versión IMAP, la que tenemos supuestamente no acepta
quota, pero con maildrop la acepta perfectamente, así que si descomentamos estas
líneas hará lo que debe y no se saltara el IF donde nos calcula la quota.

 

Sobre los
plugins no debo deciros mucho mas.

 

Yo
personalmente he retocado mucho código del squirrelmail, ya que quería cosas un
poco raras, pero muy útiles, por ejemplo que cuando me llegue spam y lo deje en
la carpeta spam (ahora veremos como hacerlo) puede ocurrir que sean falsos
negativos, lo que he hecho es poner un botón, que moverá el spam a su carpeta
correspondiente . Dependiendo en que carpeta este nos deberá enseñar un botón u
otro (Si estoy en la carpeta Spam debe aparecer el botón NO SPAM y si estoy en
alguna de las otras carpetas debe aparecer el botón SPAM). Me falta a la vez que
muevo el mensaje a su sitio enseñar a SpamAssassin lo que es ham y spam, estoy
pensando como hacerlos todavía. Esto tiene un peligro, LOS CLIENTES QUE QUIERAN
PODRAN ENSEÑAR MAL A SPAMASSASSIN, es una buena función si nos fiamos de
nuestros usuarios, por eso estoy pensando la forma de hacerlo.

 

Aun así os
dejo comprimido mi carpeta de correo, al que le valga perfecto, aun así creo que
es mejor trabajársela uno y enterarse de que ocurre por debajo con squirrelmail.

 

El fichero
comprimido de mi squirrelmail se encuentra en


http://www.dominio.com/squirrelmail_modificado.tar
<http://www.juagu.com/squirrelmail_modificado.tar>

 

 



CONFIGURACIONES FINALES


 


 

En este
apartado os pongo configuraciones que he tenido que ir retocando para dejarlo a
mi gusto. Por ejemplo empezaremos con el tamaño de mensajes que pueden enviar
nuestros clientes (Por defecto esta en 2mb):

 


cartero:/# vi
/etc/php4/apache/php.ini


 

Buscaremos
las líneas :


 



max_execution_time = 200



memory_limit = 25M



post_max_size = 20M

 

Y las
dejaremos al gusto, la línea post_max_size es la que nos permitirá subir a la
sesión php archivos de 20 mb, la línea memory_limit y max_execution_time nos
asignaran las megas y tiempos de ejecución de scripts correspondientes a las
sesiones php, debemos subirlas ,las que vienen por defecto son muy bajas para
nuestro servidor de correo, sino el servicio se cae cada dos por tres.


 

Muy por ahora
hemos dejado que la sesión php acepte estos mensajes grandes pero postfix tiene
por defecto un valor menor a estas 20 mb (Por defecto nos deja recibir y enviar
ficheros de un tamaño menor o igual a 10 mb). Arreglaremos el error 552 Error:
message too large. Para hacerlo tendremos que añadir la siguiente línea a
nuestro main.cf antes de la línea  # ========== NOMBRE DE LOS DOMINIOS
===========


 


cartero:/#
vi /etc/postfix/main.cf


 



message_size_limit=100240000


# ==========
NOMBRE DE LOS DOMINIOS ===========


 

La línea que
he dejado acepta el envío y la recepcion de mensaje menores a 100 mb.

Para que
Maildrop nos mande los mensaje localizados como Spam a la carpeta Spam de cada
buzon deberemos cambiar el archivo /etc/maildroprc para dejarlo así:


 


cartero:/#
vi /etc/maildroprc

 


if (
$SIZE < 26144 )


{


   
exception {


      
xfilter "/usr/bin/spamassassin"


    }


}


 


if
(/^X-Spam-Flag: *YES/)


{


   
exception {


       
to "$HOME/$DEFAULT/.Spam"


    }


}


else


{


   
exception {


       
to "$HOME/$DEFAULT"


   
}


}

 

 

Reiniciaremos
apache y postfix para que nos aplique los cambios realizados:

 


cartero:/#
/etc/init.d/apache restart


cartero:/#
/etc/init.d/postfix restart


 


Configuración
de Apache


 

La primera
configuración que debemos hacer en Apache será para restringir el acceso al
sitio postfixadmin/admin, recordad que para realizar cambios en la zona
especifica de cada dominio lo que hace es pedirnos un usuario y un password,
pero para la zona de Admin (la que da de alta administradores de dominios, alta
de dominios, etc) no nos pedía nada, haremos que nos pida un usuario y un
password. Esto se hace de la siguiente forma:

 

Añadiremos al
final del archivo /etc/apache/httpd.conf lo siguiente:


 



<Directory "/var/www/html/postfixadmin/admin">


AuthName
"Area Restringida"


AuthType
Basic



AuthUserFile /usr/.postfixadmin


require
valid-user


</Directory>

 

Muy bien
necesitamos crearnos el archivo /usr/.postfixadmin, lo que
contiene este archivo es un nombre de usuario y su contraseña codificada. Apache
leerá este archivo y comprobara que las credenciales coinciden.

 

Creemos el
archivo:


cartero:/# cd
/usr



cartero:/usr/# htpasswd -c .postfixadmin administrador


New
password:


Re-type
new password:


Adding
password for user administrador



cartero:/usr/# vi .postfixadmin



administrador:Z4r.sJHJif7BE


 


Perfecto
podemos comprobar que nos pide las credenciales entrando al sitio


<http://direccionipdelservidor/html/postfixadmin/admin/index.php>


 


 

Configuremos
ahora los virtual host del apache.

 

La
configuración de apache para publicar nuestro sitio en internet son faciles,
supongo que cambiara según quien lo haga, aun así yo os pongo la mía. La
estructura de directorios que he seguido ha sido simple, dentro del directorio
/var/www/ he ido creando carpetas como dominios tengo. Dentro de cada directorio
de dominio, creo las carpetas que quiero publicar, por ejemplo www o correo.
Luego en el archivo de configuración de apache (/etc/apache/httpd.conf) añadiré
nombres de encabezado como carpetas tenga dentro de cada directorio de dominio.
Lo veréis mas claro en el ejemplo, solo os dejo la configuración de los virtual
host y la configuración de área restringida:


 


cartero:/# vi
/etc/apache/httpd.conf


 



<Directory "/var/www/html/postfixadmin/admin">


AuthName
"Area Restringida"


AuthType
Basic



AuthUserFile /usr/.postfixadmin


require
valid-user



</Directory>


 



NameVirtualHost *:80


 



<VirtualHost *:80>



ServerName www.dominio.com



ServerAlias dominio.com



ServerPath /var/www/dominio.com/www



DocumentRoot /var/www/dominio.com/www


CustomLog
/var/log/apache/www.dominio.com.log combined



</VirtualHost>


 



<VirtualHost *:80>



ServerName correo.dominio.com



ServerPath /var/www/dominio.com/correo



DocumentRoot /var/www/dominio.com/correo


CustomLog
/var/log/apache/correo.dominio.com.log combined



</VirtualHost>


 



<VirtualHost *:80>



ServerName www.postfixadmin.intranet



ServerPath /var/www/html/postfixadmin



DocumentRoot /var/www/html/postfixadmin


CustomLog
/var/log/apache/postfixadmin.log combined



</VirtualHost>


 

¿Que
significa todo esto? fácil, todas las direcciones ip (*) que entren por el
puerto 80 con el encabezado

www.dominio.com
<http://www.dominio.com/>
o su alias dominio.com serán
redireccionadas a su server path y serán registradas sus entradas y errores en
su custom log.

 

Yo dejo el
custom log como combined, me registrara errores y accesos, posteriormente lo
utilizare para crear estadísticas web.

 

Si os dais
cuenta en el virtualhost de postfixadmin he puesto .intranet no podrá entrar
nadie de fuera ( a no ser que sepa que esta ahí y se lo ponga en el host), no me
interesa que eso sea visto desde internet. Si vais a tener muchos usuarios no es
mala idea publicarlo en internet y delegar la creación de usuarios al dueño del
dominio.

 

Otra cosa
mas, en esta configuración si no cumple ninguno de los encabezaos (imaginad que
queréis entrar con la dirección ip) enseñara el primer virtual host.

 

 


ACLARACIONES

 

 

No utilicéis
las contraseñas, nombres de dominios que salen aquí. El documento puede tener
errores. TODOS LOS ERRORES QUE VEAIS, mandádmelos a la dirección de correo

juanmi@planalfa.es <mailto:juanmi@planalfa.es>

y los iré corrigiendo, si conocéis mejor forma de utilizar SpamAssassin,
mandadme vuestros comentarios. Cualquier cosa que mejore lo presente será
aceptada. podéis escribirme si tenéis alguna duda y siempre que pueda y sepa os
contestare. Yo comparto este documento, compartid vosotros, lo que tengáis que
añadir mandádmelo.

 



ACTUALIZACIONES (de Woddy a Sarge)



 

Como
habreis leido mas arriba debido a un cambio de la version estable de Debian, (de
Woody paso a Sarge) me tope con mas de un problema, si lo teneis hecho el
servidor de correo con Woody cuidado con el upgrade (mi servidor de correo se
quedo tirado tres dias, menos mal que estaban Pizco y Alfonso que me ayudaron a
recuperarlo). Mi problema principal fueron SASL y SPAMASSASSIN ademas de un
monton de aplicaciones que se me desinstalaron.

 

Despues
de reescribir LILO (para que arrancase la nueva version instalada, sarge) empeze
a instalar paquetes de nuevo, ya de la nueva version estable. Mi sorpresa fue
cuando le dije que instalase SASL y me decia que no existia el paquete, solo
existia SASL2 (me vi negro intentando instalarla de primera en la version woody,
por eso mas arriba esta la version 1). Manos a la obra y a inteentar recuperar
el SASL.

 



cartero:~#apt-get install sasl2


 

Las
configuraciones en /etc/postfix/main.cf no cambian, si que cambian
en /etc/postfix/sasl/smtp.conf


 


cartero:~#vi
/etc/postfix/sasl/smtp.conf


 


sql_user:
postfix


sql_passwd:
postfix



sql_hostnames: localhost


sql_database:
postfix



sql_statement: SELECT password FROM mailbox WHERE username = ‘%u@%r’



pwcheck_method: auxprop



auxprop_plugin: sql


mech_list:
GSSAPI DIGEST-MD5 CRAM-MD5


 

Para sacar
estas lineas y que me funcionase me tire dos dias desesperantes (pufffffffffff).


 

Sobre el
SpamAssassin el problema fue con la base de datos, habia que actualizarlas:


 



cartero:~#sa-learn -D –import –dbpath /cartas/.spamassassin


 

Se que me dio
un par de errores y luego se puso a funcionar, no os pasara si no realizais
actualizacion, es decir si comenzais a instalarlo desde la sarge como digo mas
arriba, no tendreis problemas con la version qeu sea.

 

 


GRACIAS

 

 

Agustín Calvo
Flores, lo hemos hecho casi todo juntos.

Alfonso de
Microalcarria, me ayudo al comienzo, decisiones iniciales.

Maximo de
Linuxdicas, sino es por su manual no creo que hubiese podido.

A Pizco por
mis multiples problemas con la actualizacion.

A vosotros
que juntos mejoraremos este documento.

 

Saludos y
espero que no tengáis muchos problemas.

 

 

 

 

Juan Miguel
Alcarria Herrera