A mis visitantes

Bueno deciros que este blog lo puse por que me hacia falta a mi ya que tengo un modulo de memoria parciamente estropeado y olvido muchas cosas, si crees que algo de aqui te ayudara en alguna configuracion pues usalo sin problemas, tambien deciros que si dejais comentarios os respondere lo mas prontito que pueda.

Un saludo y gracias por su visita ;)

domingo, 15 de noviembre de 2009

SERVIDOR POSTFIX + COURIER + MYSQL + SASL + RELAYHOST

Pues aquí estamos de nuevo, ahora me ha dado por montar un servidor de correo que soporte varios dominios. En este nuevo proyecto, los usuarios seran configurados a traves de tablas de Mysql.

Lo primero que hacemos es instalar el paquete mysql

#apt-get install mysql-server mysql-client

Si sois usuarios habituales de Linux, Os dareis cuenta que uso Ubuntu para la teoria, pero en la practica todos las Distribuciones de Linux valen, la variaciones entre una distro y otra en minimo auque por falta de ganas no las indicaré aquí.

Una vez instalado el servidor MYSQL proseguimos,

Ejecutamos el cliente de mysql:

# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.53-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database correo;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on correo.* to correo@localhost identified by 'reparti2';
Query OK, 0 rows affected (0.00 sec)

y seleccionamos la base de datos:

mysql> use correo;
Database changed

Bien para los no muy ilustrados, lo que he hecho aquí es crear una base de datos llamada “correo” con un usuario llamado “correo”, que original ¿no? Y con la contraseña “reparti2”
Y ahora que ya tenemos la base de datos creamos las tablas para almacenar a los usuarios y sus respectivas cuentas de correo, contraseñas y redirecciones.

En modo consola...

Tabla virtual
create table virtual (
address varchar(255) not null primary key unique,
goto varchar(255) not null
);

Aunque no es dificil yo soy de los que les encanta poner ejemplos, digamos que tenemos la cuenta admin@dominio.com y que queremos tener soporte@dominio.com y info@dominio.com pero que queremos que todas las cuenta vayan a admin@dominio.com pues cojemos y metemos soporte y info en la tabla virtual asi cuando lleguen correos para esas cuentas los guardara en admin@dominio.com.

Tabla users
create table users (
address varchar(255) not null primary key unique,
id varchar(128) not null,
clear varchar(128) not null,
uid smallint(5) unsigned not null default 10000,
gid smallint(5) unsigned not null default 8,
name varchar(128) not null,
home varchar(128) not null default '/var/mail',
domain varchar(128) not null,
maildir varchar(255) not null,
active tinyint(3) unsigned not null default 1
);

En esta tabla almacenamos los datos de conexión del cliente :

Address → Direccion de correo completa ej.: aceror@midomino.com
id → Usuario a secas (lo de la izquierda de la arroba) ej.: aceror
clear → Password en claro, ej.: fuerteventura
uid → UID que tendrán sus ficheros en el sistema, ej.: 1000
gid → GID que tendrán sus ficheros en el sistema, ej.: 8
name → Nombre del fulano en cuestion, ej.: Jose Angel
home → Directorio 'base' para almacenar el mail, obligatorio: /var/mail
domain → Dominio (la derecha de la arroba), ej.: midominio.com
maildir → Mailbox (o maildir en nuestro caso) a usar, path relativo a home, ej.: midominio.com/aceror
active → Con esta flag controlamos si el usuario puede o no bajarse el correo, ej.: 1

Anotad que en el campo maildir he acabado de indicar donde guardar el mail con una /. Esto es así porque queremos que use maildir y no mailbox, ya que courier no soporta mailbox.

Ahora llega el momento de instalar POSTFIX y su soporte a mysql, si lo estas compilando tu mismo añade soporte sas.

#apt-get install postfix-tls postfix-mysql


y ahora, vamos a /etc/postfix/ y editamos el fichero main.cf:

añadimos esto antes de mydestination:

virtual_mailbox_base=/var/mail
virtual_mailbox_maps=mysql:/etc/postfix/mysql_virt.cf
virtual_uid_maps=mysql:/etc/postfix/uids.cf
virtual_gid_maps=mysql:/etc/postfix/gids.cf
transport_maps=mysql:/etc/postfix/transport.cf
virtual_maps =mysql:/etc/postfix/virtual.cf
y mydestination lo dejamos parecido a esto:
mydestination = nombredetuservidor, localhost.localdomain, , localhost, $transport_maps


DETALLE:
No metas el nombre de tu dominio en mydestination ya que si lo haces buscara al usuario en una cuenta local del sistema y lo que deseamos es que la busque en virtual (MYSQL).

¿Todo bien hasta ahora?, bien asi me gusta..

Abrimos una consola y con el VI creamos los siguientes ficheros y sus contenidos

#vi /etc/postfix/mysql_virt.cf

user=correo
password=reparti2
dbname=correo
table=users
hosts=localhost
where_field=address
select_field=maildir

#vi /etc/postfix/uids.cf

user=correo
password=reparti2
dbname=correo
table=users
hosts=localhost
where_field=address
select_field=uid

#vi /etc/postfix/gids.cf

user=correo
password=reparti2
dbname=correo
table=users
hosts=localhost
where_field=address
select_field=gid

#vi /etc/postfix/transport.cf

user=correo
password=reparti2
dbname=correo
table=transport
hosts=localhost
select_field=transport
where_field=domain

#vi /etc/postfix/virtual.cf

user=correo
password=reparti2
dbname=correo
table=virtual
hosts=localhost
where_field=address
select_field=goto

Como estais viendo hasta aquí todo sencillo
Como todo hay que protegerlo hacemos:

#for i in mysql_virt.cf uids.cf gids.cf virtual.cf ; do chgrp postfix $i; chmod 640 $i; done

dentro del directorio de postfix claro.
Ahora se nos plantea un problema ya que postfix corre como chroot en /var/spool/postfix. Para acceder a la BBDD lo hace a traves de un socket ( por defecto /var/run/mysqld/mysqld.sock) y al estar este fuera del entorno chroot en el cual se ejecuta postfix ( por defecto /var/spool/postfix ), no tenemos acceso a dicho socket. Por el momento...;)
En consola:

#mkdir -p /var/spool/postfix/var/run/mysqld
#chown mysql /var/spool/postfix/var/run/mysqld


y crear un link al socket actual:

#ln -s /var/run/mysqld/mysqld.sock /var/spool/postfix/var/run/mysqld/mysqld.sock

Ahora comenzamos con el servidor POP y IMAP, como sabeis hay que instalar

#apt-get install courier-imap courier-pop courier-authlib-mysql

Una vez finalizada la instalacion vamos a /etc/courier y a configurar
primero en authdaemonrc hay que decirle:

authmodulelist="authmysql"
y luego hay que tocar /etc/courier/authmysqlrc:
MYSQL_SERVER localhost
MYSQL_USERNAME correo
MYSQL_PASSWORD reparti2
MYSQL_SOCKET /var/run/mysqld/mysqld.sock
MYSQL_OPT 0
MYSQL_DATABASE correo
MYSQL_USER_TABLE users
MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD address
MYSQL_HOME_FIELD home
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir


usemos cyrus-sasl para añadir a nuestro postfix un mecanismo de autentificación, y asi evitarnos dolores de cabeza y spammers.

#apt-get install libsasl2-modules

Creamos el fichero /etc/postfix/sasl/smtpd.conf:
Añadimos

mysql_user: correo
mysql_passwd: reparti2
mysql_hostnames: localhost
mysql_database: correo
mysql_statement: select clear from users where id='%u' and domain='%r'
pwcheck_method: auxprop
Editamos /etc/postfix/main.cf:
Esto envia correos a travez de GMAIL ya que las IP dinamicas no pueden enviar correos por politicas de seguridad.
relayhost = [smtp.gmail.com]:587

smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated
permit_mynetworks
reject_unauth_destination
smtp_tls_CAfile = /etc/postfix/cacert.pem
smtp_tls_cert_file = /etc/postfix/FOO-cert.pem
smtp_tls_key_file = /etc/postfix/FOO-key.pem
smtp_tls_session_cache_database = btree:/var/run/smtp_tls_session_cache
smtpd_tls_CAfile = /etc/postfix/cacert.pem
smtpd_tls_cert_file = /etc/postfix/FOO-cert.pem
smtpd_tls_key_file = /etc/postfix/FOO-key.pem
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:/var/run/smtpd_tls_session_cache
tls_random_source = dev:/dev/urandom
smtpd_sasl_auth_enable = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl/passwd
smtp_sasl_tls_security_options = noanonymous
smtpd_sasl_application_name = smtpd


Bien ahora llega en momento de configurar nuestro relayhost que es el que se encargara de enviar nuestros correos ya que desde ips dinamicas no nos dejan, primero no vamos a GMAIL y creamos una cuenta de correo normal y que nos servira para logearnos y enviar nuestros correos correos, despues entramos en consola y creamos los certificados para que GMAIL nos deje entrar.

#cd
#/usr/lib/ssl/misc/CA.pl -newca

CA certificate filename (or enter to create) <-Damos al introMaking CA certificate … Generating a 1024 bit RSA private key …….++++++ ……………….++++++ writing new private key to ‘./demoCA/private/cakey.pem’ Enter PEM pass phrase: password ← NO LO CAMBIES
Verifying – Enter PEM pass phrase: password ← NO LO CAMBIES
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [US]:US ← NO LO CAMBIES
State or Province Name (full name) [New York]:New York ← NO LO CAMBIES
Locality Name (eg, city) []:New York ← NO LO CAMBIES
Organization Name (eg, company) []:Sanborn_Widgets ← NO LO CAMBIES
Al resto solo dale al intro
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:aceror
Email Address []:tuusuario@gmail.com
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Ojo con esta pregunta
Enter pass phrase for ./demoCA/private/cakey.pem: password ← NO LO CAMBIES
Check that the request matches the signature
Signature ok

#openssl req -new -nodes -subj '/CN=tudominio.com/O=Sanborn_Widgets/C=US/ST=New York/L=New York/emailAddress=tuusuario@gmail.com' -keyout FOO-key.pem -out FOO-req.pem -days 3650
# openssl ca -out FOO-cert.pem -infiles FOO-req.pem


Using configuration from
/usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:password ← NO LO CAMBIES
Check that the request matches the signature
Signature ok
Then press y for anything else it asks.
Lo siguiente es copiar los certificados al directorio de Postfix asi que:
# cp demoCA/cacert.pem FOO-key.pem FOO-cert.pem /etc/postfix
# chmod 644 /etc/postfix/FOO-cert.pem /etc/postfix/cacert.pem
# chmod 400 /etc/postfix/FOO-key.pem
Una vez movidos y protegidos necesitamos añadir una certidicado a nuestro sistema, pega esta al final del fichero cacert.pem
#vi /etc/postfix/cacert.pem
-----BEGIN CERTIFICATE-----
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
-----END CERTIFICATE-----

Y por fin creamos el fichero que contendra el usuario y contraseña de nuestra cuenta en gmail.

#vi /etc/postfix/sasl/password
Añadimos:

[smtp.gmail.com]:587 username@gmail.com:password
Sustituye username:password por los datos correctos de tu cuenta

Creo que es hora de limpiar un poco.

#cd
#rm FOO-req.pem FOO-cert.pem FOO-key.pem && rm -r demoCA/

Reinicia postfix para que coja todo el tinglado

#/etc/init.d/postfix restart

Con esto ya tendriamos un servidor de correo decente de correo. Bueno son la 3:30 de la madrugada, me voy a la cama. Chao!!