====== Implementación de Postfix con Soporte de Servicio de Directorios LDAP ======
**NOTA:** Pedirme los ficheros de configuración a mi correo (mely@minbas.cu) hasta nuevo aviso.
El siguiente documento recoge los pasos a seguir para instalar y configurar postfix utilizando de backend a OpenLDAP como servicio de directorio para los usuarios del dominio **foobar.cu** y subdominios de este. El escenario ideal para el desarrollo del documento es, el MTA actuando como pasarela entre redes (Ej: una LAN, WAN e Internet).
Entre las principales funcionalidades del MTA que pretendo poner a disposición y que son usadas frecuentemente (por lo menos así lo he visto en linux-l) son:
* Chequeo de envío/recepción de mensajes por dominios hacia Internet, Cuba ó subdominios de **foobar.cu**.
* Chequeo de envío/recepción de mensajes por usuarios/aliases hacia Internet, Cuba ó subdominios de **foobar.cu**.
* Restricción de tamaño en el envío/recepción por usuarios.
La administración de los dominios/usuarios la hago con las siguientes herramientas:
* Phamm
* PhpLdapAdmin
Dado que todavía no he podido modificar el código de phamm para poder agregar atributos personalizados de LDAP que uso en los chequeos, tengo que agregarlos a mano con PhpLdapAdmin.
===== Pasos a seguir: =====
* Instalar OpenLDAP y copiar los ficheros schema necesarios
sudo aptitude install slapd ldap-utils
sudo cp phamm.schema ISPEnv2.schema amavis.schema /etc/ldap/schema/
sudo cp phamm.acl /etc/ldap/
sudo cp slapd.conf /etc/ldap/
sudo slappasswd -h {MD5}
New password:
Re-enter new password:
{MD5}1jSkLch16TT6emkp+NPjXQ==
* Editar los ficheros slapd.conf y ldap.conf y modificar
sudo vim /etc/ldap/slapd.conf
...
# Password Format
password-hash {MD5}
rootdn "cn=admin,dc=foobar,dc=cu"
rootpw {MD5}1jSkLch16TT6emkp+NPjXQ==
...
sudo slaptest -v
sudo vim /etc/ldap.conf
BASE
dc=foobar, dc=cu
URI
ldap://localhost
sudo /etc/init.d/slapd restart
* Ahora vamos a popular el directorio LDAP a partir de foobar.ldif que adjunto a este documento.
''sudo ldapadd -v -x -D "cn=admin,dc=foobar,dc=cu" -W -h localhost -f foobar.ldif''
* Instalamos apache2 y Phamm
sudo aptitude install apache2 libapache2-mod-php5 php5-ldap
cd /srv/www/
wget -c -b http://ftp.softwarelibre.cu/utils/phamm-0.5.15.tar.gz
tar xvfz phamm-0.5.15.tar.gz
mv phamm-0.5.12 phamm
rm -fr phamm-0.5.15.tar.gz
sudo chown www-data.www-data phamm/www-data -R
sudo vim /etc/apache2/sites-availables/default
...
Alias /phamm "/srv/www/phamm/www-data/"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
...
sudo aptitude install phpldapadmin
sudo /etc/init.d/apache2 restart
* Ahora vamos a configurar a PHAMM, el fichero config.inc.foobar.php lo adjunto a este documento. **NOTA:** Tiene que cambiar los datos de conexión al LDAP en este fichero.
cd /srv/www/phamm
sudo cp config.inc.foobar.php config.inc.php
sudo vim config.inc.php
"Cambiar los datos de conexión al LDAP"
Ahora podemos entrar a: http://hostname.foobar.cu/phamm/
* login: admin
* passw: adminldap
**Con este login entramos como administrador global, aquí podremos hacer de todo (crear
dominios, usuarios, etc)**
Para entrar **como administrador de un dominio**:
* login: postmaster@adm.foobar.cu
* pass: pass
Con este login entramos como **administrador del dominio adm.foobar.cu** y solo podremos hacer de
todo para ese dominio. Al entrar tendremos solo el dominio adm.foobar.cu en la lista con 3
buzones y 3 alias. Utilizando PHAMM todavía no es posible dar permisos de envío/recepción
Nacional/Internacional, por lo que tampoco no veremos los permisos que tiene este dominio ó sus
usuarios. Tampoco veremos otros parámetros del dominio como el ESTADO.
En cambio si entramos por: [[http://hostname.foobar.cu/phpldapadmin]]
* login: cn=admin,dc=foobar,dc=cu
* passw: adminldap
Se puede modificar los siguientes atributos para los dominios:
^ ID ^ Atributos ^ Valores posibles ^ Uso ^
| 1 | permitFrom | inet,fromcuba,frommydomains | Para filtrar recepción por dominio |
| 2 | permitTo | inet,tocuba,tomydomains | Para filtrar envío por dominio |
| 3 | domStatusRecv | string con codigo smtp | Estado de recepción del servidor MX que atiende ese dominio |
| 4 | domStatusSend | string con codigo smtp | Estado de envío del servidor MX que atiende ese dominio |
| 5 | defaultRecv | True,False | En TRUE, todos los buzones de este dominio reciben (se rigen) del valor que tenga permitFrom. En False los todo los buzones de este dominio reciben (se rigen) del valor que tenga permitFrom de dicho buzón |
| 6 | defaultSend | True,False | En TRUE, todos los buzones de este dominio envían (se rigen) del valor que tenga permitTo. En False los todo los buzones de este dominio envían (se rigen) del valor que tenga permitTo de dicho buzón |
**NOTA:** 3 y 4 por default no se agrega a mano. Solo se agrega para cuando exista un problema ó cuando el script de chequeo de disponibilidad de los servidores MX de los dominios lo agrega. Cuando 5 y 6 están el FALSE, esto implica que el administrador del dominio tiene que configurar a mano permiso por permiso cada buzón.
Se puede modificar los siguientes atributos para los buzones:
^ ID ^ Atributos ^ Valores posibles ^ Uso ^
| 1 | permitFrom | inet,fromcuba,frommydomains | Para filtrar recepción por usuario |
| 2 | permitTo | inet,tocuba,tomydomains | Para filtrar envío por usuario |
| 3 | userStatusRecv | string con alguna información | Estado de recepción del buzón |
| 4 | userStatusSend | string con alguna información | Estado de envío del buzón |
| 5 | userRecvSize | int en bytes | Tamaño de mensaje en la recepción |
| 6 | userSendSize | int en bytes | Tamaño de mensaje en el envío |
**NOTA:** 3 y 4 por default no se agrega a mano. Solo se agrega cuando exista un problema ó cuando el script de chequeo de cuotas encuentra algún buzón lleno. En resumen, una vez que creamos un dominio de correo con PHAMM, por ahora tenemos que entrar con phpLdapAdmin para terminar de configurar el dominio y sus usuarios con los atributos mencionados anteriormente.
Ahora seguiremos con la instalación y configuración de postfix, en la introducción del documento hablabamos sobre el escenario ideal donde estaría el MTA, es decir que postfix actuando de pasarela para varios dominios entre redes.
Un escenario ideal sería algo como esto (disculpen el reguero de flechas):
{{:tutoriales:nginx.png|}}
Aquí **mx1.foobar.cu** (mx1) es el postfix que estamos montando y sirve de pasarela entre Internet y la propia WAN para varios subdominios de **foobar.cu**. Lo mensajes entre subdominios también pasan por **mx1.foobar.cu**.
En esta instalación suponemos que mx1 tiene una IP pública atendiendo SMTP por fuera y una IP privada atendiendo SMTP dentro de la WAN.
A partir de esta suposición, instalaremos postfix y crearemos 2 servicios de postfix escuchando por las 2 IP.
sudo aptitude install postfix postfix-ldap libnet-ldap-perl
sudo groupadd -g 1002 vmail
sudo useradd -r -u 1002 -g vmail -d /srv/vmail -s /sbin/nologin -c "Virtual
Mail System" vmail
sudo mkdir -p /srv/vmail/dominios
sudo chown vmail.vmail /srv/vmail -R
sudo vim /etc/postfix/master.cf
...
172.42.1.2:25 inet n - - - 60 smtpd
-o smtpd_banner=$esmtpd_banner
-o smtpd_client_connection_count_limit=10
-o smtpd_client_connection_rate_limit=60
-o smtpd_client_message_rate_limit=180
-o smtpd_discard_ehlo_keywords=PIPELINING,ETRN
-o smtpd_client_restrictions=esmtpd_client_restrictions
-o smtpd_helo_restrictions=esmtpd_helo_restrictions
-o smtpd_sender_restrictions=esmtpd_sender_restrictions
-o smtpd_recipient_restrictions=esmtpd_recipient_restrictions
192.168.1.2:25 inet n - - - 60 smtpd
-o smtpd_banner=$ismtpd_banner
-o smtpd_client_restrictions=ismtpd_client_restrictions
-o smtpd_helo_restrictions=ismtpd_helo_restrictions
-o smtpd_sender_restrictions=ismtpd_sender_restrictions
-o smtpd_recipient_restrictions=ismtpd_recipient_restrictions
...
**NOTA:** Suponemos para el desarrollo del documento, que **la 172.42.1.2 es la IP por fuera de la WAN**, bien puede ser una IP pública en internet. También suponemos que la **192.168.1.2 es la IP que atiende por dentro de la WAN**. Con la configuración hecha anteriormente, logramos crear reglas UCE personalizadas atendiendo a la IP por donde nos llega el mensaje. Osea podemos lograr hacer un set de reglas que chequeen restricciones del tipo client, helo, sender, recipient cuando el mensaje llegue por la IP pública y tener otro set de reglas diferente que analizen los mismos tipos de restricciones para cuando el mensaje llegue por la IP privada.
Para reducir tráfico innecesario de mensajes en mx1 y tener un server que no sea posible openrelay, tomaremos las siguientes medidas en el set de reglas UCE:
**//Por la IP Pública://**
* No recibe el mensaje cuando se deniega IP/Redes/Hostnames que me entreguen mensajería.
* No recibe el mensaje cuando el hostname del HELO o EHLO, MAIL FROM, RCPT TO tienen una sintaxis invalida ó no es un FQDN
* No recibe el mensaje cuando exista un regexp para denegar por HELO, MAIL FROM.
* Chequea que no me entreguen mensajes de mi dominio por fuera.
* Chequea que no me entreguen mensajes clasificados como spam, sirve para bloquear recepción a mano también.
* Chequea que no se haga routing ( usuario@dom1.foobar.cu @mx1.foobar.cu)
* Chequea que el servidor MX que atiende al dominio de destino no tenga problemas, para esto tengo que terminar un script que me chequea la disponibilidad de dicho servidor.
* En caso de los dominios virtuales, que residen en mx1, chequea que el buzón de destino no tenga problemas (ej: Buzón lleno)
**//Por la IP Privada://**
* Chequea que las redes internas tengan permisos para conectarse.
* No recibe el mensaje cuando el hostname del HELO o EHLO, MAIL FROM, RCPT TO tienen una sintaxis invalida ó no es un FQDN.
* Chequea que no me entreguen mensajes clasificados como spam, sirve para bloquear envíos a mano.
* Chequea que no se haga routing
* Chequea que el servidor MX que atiende el dominio de origen/destino no tenga problemas.
* En caso de los dominios virtuales, que residen en mx1, chequea que el buzón de destino/envío no tenga problemas (ej: Buzón lleno)
**NOTA:** El fichero main.cf de configuración de postfix es bastante extenso, por lo que voy a adjuntarlo a este documento, y dentro del fichero están los comentarios lo que hace cada parámetro que utilizo.
sudo cp main.cf _* /etc/postfix/
sudo mkdir /etc/postfix/virtual
cp v* /etc/postfix/virtual
cp postam-* /usr/lib/postfix
sudo vim /usr/lib/postfix/postam-recv.pl
sudo vim /usr/lib/postfix/postam-send.pl
Buscar en ambos scripts la línea:
**$ldap>bind("cn=admin,dc=home,dc=cu", password=>"adminldap");**
y cambiar los datos del bind a LDAP.
''sudo /etc/init.d/postfix restart''
**Para probar que postfix levantó bien por las 2 IP:**
sudo netstat -tpln
tcp 0 0 192.168.1.2:25 0.0.0.0:* LISTEN 2376/master
tcp 0 0 172.42.1.2:25 0.0.0.0:* LISTEN 2376/master
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2376/master
telnet 172.16.1.2 25
Trying 172.16.1.2...
Connected to 172.16.1.2.
Escape character is '^]'.
220 mx1.home.cu NO UCE ESMTP Welcome to HomeNET
$ telnet 192.168.1.2 25
Trying 192.168.1.2...
Connected to 192.168.1.2.
Escape character is '^]'.
220 mx1.foobar.cu NO UCE ESMTP Bienvenido a HomeNET
* Instalamos Dovecot
**NOTA:** Adjunto los ficheros de configuración y dentro explico los parámetros necesarios a modificar.
sudo aptitude install dovecot-imapd dovecot-pop3d
sudo mkdir /var/log/dovecot
sudo cp dovecot.conf dovecot-ldap.conf /etc/dovecot/
sudo chown root.adm /var/log/dovecot -R
sudo chmod a+rwx /var/log/dovecot/ -R
sudo /etc/init.d/dovecot restart
sudo /etc/init.d/postfix restart
telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready on xray.foobar.cu.
user mely@foobar.home.cu
+OK
pass mely
+OK Logged in.
list
+OK 1 messages:
1 401