====== 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 open­relay, 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