Nuevo post de Óscar Mas, de la empresa Cadinor. A partir de la versión 7.1 de Zimbra, se añadió un nuevo servicio dentro del MTA, el cual nos permite tener un control exhaustivo del correo que entrada y salida de nuestro servidor, aparte de darle nuevas funcionalidades al sistema de antispam ( cosa que no veremos ). Estas nuevas funcionalidades nos las otorga el sistema de Policyd, para poder ver todas las funcionalidades que nos ofrece este sistema, os aconsejo que os deis una vuelta por su web oficial: http://www.policyd.org/
El sistema de Policyd por defecto viene deshabilitado en el sistema cuando instalamos Zimbra y como podremos observar, no lo podemos habilitar mediante la administración web de manera standard:
Hemos de saber que el sistema de Policyd que viene por defecto, no está optimizado para sistemas que tienen un alto tráfico de correo, para optimizarlo tendremos que modificar el fichero: /opt/zimbra/conf/cbpolicyd.conf, que veremos posteriormente y ajustar los valores a nuestro entorno.
Que nos ofrece el sistema de Policyd:
- Access Control: Simple access control on all the incoming/outgoing
- Accounting: Message count and cumulative size policies
- Amavis: Amavisd-new integration
- CheckHelo: Helo/Ehlo checks and blacklisting
- CheckSPF: Sender Policy Framework support
- Greylist: Anti-spam Greylisting support
- Quotas: Message count and cumulative size policies
Nosotros simplemente nos centraremos en la parte de Quotas. Lo primero que observamos, es que Policid no es un servicio que está habilitado por defecto. A consecuencia de esto, no podemos habilitarlo por la administración web, tal como he comentado anteriormente, se ha de habilitar desde la consola:
[zimbra@zimbra ~]$ zmprov gs `zmhostname` | grep zimbraServiceInstalled
Para habilitarlo, simplemente hay que indicárselo:
[zimbra@zimbra ~]$ zmprov ms `zmhostname` +zimbraServiceInstalled cbpolicyd && zmprov ms `zmhostname` +zimbraServiceEnabled cbpolicyd [zimbra@zimbra ~]$ zmprov gs `zmhostname` | grep zimbraServiceInstalled
Si lo activamos por la administración web, podremos ver el siguiente Warning. Pero como todo lo vamos a hacer por consola, no vale la pena usar la administración para habilitarlo, siempre es mejor hacerlo por consola, ya que podremos chequear que realmente se ha habilitado:
Después de un par de minutos, zmconfigd detecta que tenemos el servicio habilitado y automáticamente instala la base de datos y nos inicia el servicio de Policyd. Esperamos un par de segundos y verificamos que el servicio esta funcionando correctamente ( ser pacientes, ya que tarda un poco en darse cuenta ):
[zimbra@zimbra ~]$ zmcbpolicydctl status policyd is running.
Una vez el servicio de Policyd este funcionando, hemos de indicarle al servidor de postfix que cuando llegue un mensaje, lo derive al puerto 10031, que es el puerto por defecto del Policyd:
[zimbra@zimbra ~]$ zmprov mcf +zimbraMtaRestriction "check_policy_service inet:127.0.0.1:10031" [zimbra@zimbra ~]$ zmlocalconfig -e postfix_enable_smtpd_policyd=yes
Podremos observar en los logs del Policyd, que el servicio está funcionando y los modulos que nos ha cargado automáticamente
[zimbra@zimbra ~]$ cat /opt/zimbra/log/cbpolicyd.log [2014/02/25-23:04:51 - 53852] [CORE] NOTICE: Process Backgrounded [2014/02/25-23:04:51 - 53852] [CBPOLICYD] NOTICE: Policyd v2 / Cluebringer - v2.1.x-201205100639 [2014/02/25-23:04:51 - 53852] [CBPOLICYD] NOTICE: Initializing system modules. [2014/02/25-23:04:51 - 53852] [CBPOLICYD] NOTICE: System modules initialized. [2014/02/25-23:04:51 - 53852] [CBPOLICYD] NOTICE: Module load started... [2014/02/25-23:04:51 - 53852] [CORE] NOTICE: => AccessControl: disabled [2014/02/25-23:04:51 - 53852] [CORE] NOTICE: => Accounting: disabled [2014/02/25-23:04:51 - 53852] [CORE] NOTICE: => Amavis: disabled [2014/02/25-23:04:51 - 53852] [CORE] NOTICE: => CheckHelo: disabled [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: => CheckSPF: disabled [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: => Greylisting: disabled [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: => Quotas: enabled [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: => Protocol(Postfix): enabled [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: => Protocol(Bizanga): enabled [2014/02/25-23:04:52 - 53852] [CBPOLICYD] NOTICE: Module load done. [2014/02/25-23:04:52 - 53852] [CBPOLICYD] NOTICE: Session tracking is ENABLED. [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: 2014/02/25-23:04:52 cbp (type Net::Server::PreFork) starting! pid(53852) [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: Resolved [localhost]:10031 to [127.0.0.1]:10031, IPv4 [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: Binding to TCP port 10031 on host 127.0.0.1 with IPv4 [2014/02/25-23:04:52 - 53852] [CORE] NOTICE: Setting gid to "499 499" [2014/02/25-23:04:52 - 53852] [CORE] INFO: Setting up serialization via flock [2014/02/25-23:04:52 - 53852] [CORE] INFO: Beginning prefork (4 processes) [2014/02/25-23:04:52 - 53852] [CORE] INFO: Starting "4" children
Para verificar que se han creado las bases de datos, observado que en el directorio: /opt/zimbra/data/cbpolicyd/db/ nos ha creado los ficheros de las bases de datos, con el cual gestionaremos el sistema de Policyd. Por defecto las quotas y el rate limiting están habilitados, pero no hay ninguna política definida.
Crearemos un directorio, donde ubicaremos los ficheros de configuración y le daremos permisos al usuario Zimbra:
[zimbra@zimbra ~]$ logout [root@zimbra ~]# mkdir /opt/zimbra/scripts && chown zimbra:zimbra /opt/zimbra/scripts/ [root@zimbra ~]# su – zimbra
Creamos el fichero con las restricciones personalizadas. En nuestro caso crearemos las siguientes restricciones:
Rate limit: cualquier usuario de nuestro servidor no pueda enviar más de 2 mensajes cada 60 segundos.
Rate limit: que cualquier dominio cuando reciba más de 3 mails en un periodo de 60 segundos, el mensaje sea rechazado y el servidor que lo envía, lo guarde en su cola.
El código a insertar en la base de datos del Policyd, quedaría de la siguiente manera:
[zimbra@zimbra ~]$ vim /opt/zimbra/scripts/rate-limit.sql
BEGIN TRANSACTION;
INSERT INTO "policies" (Name,Priority,Description) VALUES('Zimbra CBPolicyd Policies', 0, 'Zimbra CBPolicyd Policies');
INSERT INTO "policy_members" (PolicyID,Source,Destination) VALUES(6, 'any', 'any');
INSERT INTO "quotas" (PolicyID,Name,Track,Period,Verdict,Data) VALUES (6, 'Sender:user@domain','Sender:user@domain', 60, 'DEFER', 'Estas enviando demasiados mensajes en 60 segundos,');
INSERT INTO "quotas" (PolicyID,Name,Track,Period,Verdict) VALUES (6, 'Recipient:@domain', 'Recipient:@domain', 60, 'REJECT');
INSERT INTO "quotas_limits" (QuotasID,Type,CounterLimit) VALUES(3, 'MessageCount', 2);
INSERT INTO "quotas_limits" (QuotasID,Type,CounterLimit) VALUES(4, 'MessageCount', 3);
COMMIT;
Si necesitásemos que algún equipo se salte las restricciones, simplemente con añadir la siguiente línea haríamos que el servidor con la IP: 192.168.100.1, no sufriese estas restricciones:
INSERT INTO policy_group_members (PolicyGroupId,Member,Disabled,Comment) VALUES(3,'192.168.100.1',0,'Saltarse restricciones');
Como es normal, antes de empezar a realizar modificaciones en la base de datos, haremos un backup:
[zimbra@zimbra ~]$ cp -ra /opt/zimbra/data/cbpolicyd/db/cbpolicyd.sqlitedb /opt/zimbra/scripts/cbpolicyd.sqlitedb
Y posteriormente volcaremos nuestro fichero de configuración dentro de la base de datos del Policyd:
[zimbra@zimbra ~]$ sqlite3 /opt/zimbra/data/cbpolicyd/db/cbpolicyd.sqlitedb < /opt/zimbra/scripts/rate-limit.sql
Habilitaremos los modulos que necesitamos:
[zimbra@zimbra ~]$ zmlocalconfig -e cbpolicyd_log_detail=modules,tracking,policies; zmlocalconfig -e cbpolicyd_module_accesscontrol=1 cbpolicyd_module_checkhelo=0 cbpolicyd_module_checkspf=0 cbpolicyd_module_greylisting=0 cbpolicyd_module_quotas=1
Y habilitaremos el debug del Policyd. Los niveles de debug son:
- 0 – Errors only
- 1 – Warnings and errors
- 2 – Notices, warnings, errors
- 3 – Info, notices, warnings, errors
- 4 – Debugging
[zimbra@zimbra ~]$ zmlocalconfig -e cbpolicyd_log_level=4
Si queremos ver en detalle el fichero de configuración o customizarla para poder ajustar el sistema a nuestro tráfico de correo, modificaremos el fichero de configuración:
[root@zimbra ~]# vim /opt/zimbra/conf/cbpolicyd.conf
Reiniciamos los servicios de Policyd y de postfix, para que se apliquen los cambios que hemos realizado:
[zimbra@zimbra ~]$ zmcbpolicydctl restart && zmmtactl restart
Verificamos que los cambios que hemos hecho anteriormente se han aplciado. Podremos ver que el puerto por defecto es el 10031, el debug está a tope y que el modulo de quotas está habilitado.
[zimbra@zimbra ~]$ zmlocalconfig | grep -i cbpolicy
Ahora lo que nos queda es realizar las dos pruebas. Una, de envío externo de varios mensaje de correo electrónico contra nuestro servidor de Zimbra y otra de envío de correo desde web, para verificar que todo funciona correctamente y las políticas que hemos aplicado se están cumpliendo
Envío desde otro servidor de correo varios mensajes a nuestro servidor de Zimbra para verificar que el Policyd funciona correctamente y ver que sucede con los mensajes que no se han podido entregar:
Como podemos observar, los mensajes que no se han podido entregar al servidor de Zimbra, son guardados por el servidor que nos ha intentado entregar los mensajes y posteriormente, pasados 60 segundos, se irán entregando paulatinamente a nuestro servidor de Zimbra.
La segunda prueba, sería probar de enviar varios mensajes a una cuenta externa desde el webmail y podremos ver que nos muestra el siguiente error, ya que hemos superado el umbral predefinido anteriormente:
Si observamos el log del postfix, veremos que nos ha rechazado el mensaje por superar el umbral de mensajes permitidos:
[root@zimbra ~]# tail -f /var/log/maillog
Una vez acabadas las pruebas y verificado que el sistema que hemos montado funciona tal y como queremos, simplemente nos faltará deshabilitar el debugging del Policyd:
[zimbra@zimbra ~]$ zmlocalconfig -e cbpolicyd_log_level=0
Yo he realizado el procedimiento de implementación de quotas del sistema de Zimbra vía consola. Pero existe un entorno amigable que se accede por web, para poder gestionar la base de datos del Policyd, cosa que explicaremos en otro post….. pero os dejo una captura para que veáis como es:
Un saludo












Muy buen post!
Excelente la explicacion! Muchas Gracias.
Donde puedo ver comose usa la administracion web?
Saludos
Hola, existe algún requerimiento antes de instalar Cluebringer Policyd pues tengo Zimbra 8.6 en CentOS 6.5 funcionando perfectamente, instalo Policyd y al parecer no esta corriendo en el puerto 10031, no he logrado que me funcione.
tu post esta muy bueno y me ayudado a mejorar mucho de los servicios que implantado pero necesito tu ayuda el servicio el servicio zmcbpolicydctl no se me inicializa y como derive al puerto 10031 no tengo correo
saludos
Hola Jorge.
Una consulta con respecto a este tema, como puedo hacer para que la política no se aplique a una lista de distribución, puesto que si restrinjo por ejemplo el envío a 100 correos por hora, si una lista tiene mas de 1000 usuarios, el pocyed me restringe.
Hay manera de hacer que las listas de distribución se salten la política?
Gracias de antemano
Hola, que raro yo lo activé en Zimbra 8.5.1 y las políticas no me afectan la as listas de distribución.
gracias por compartir estos temas.
tengo un pequeño problema al acceder a http://ip:7780/webui/index.php me carga el siguiente mensaje
Error connecting to Policyd v2 DB: could not find driver
realice lo que recomienda wiki.zimbra
Edit the WebUI configuration for adding the Sqlite DB connector
cd /opt/zimbra/httpd/htdocs/webui/includes
Edit config.php
Comment the “$DB_DSN=mysql” line and add a line for Sqlite
Add this – $DB_DSN=”sqlite://///opt/zimbra/data/cbpolicyd/db/cbpolicyd.sqlitedb”;
y al realizar esto la pagina ya no carga no tengo ningún mensaje de error solo una pagina blanca.
Por favor tu gentil ayuda.
Les aviso a todos que en el ejemplo que se da aquí se restringe la cantidad de mensajes enviados por minuto a 2, pero hay que considerar que cuando los usuarios crean un mensaje con 2 destinatarios ese mensaje se contabiliza como 2, si se lo copia a 3, se cuenta como 3, etc. Por lo tanto, si hacen lo que está en el ejemplo , ya no podrán enviar mensajes a más de dos destinatarios. Se los cuento, porqué a mi ya me pasó y tuve que subirlo a 100 XD.
Estoy tratando de aprender bien como crear las reglas, pero es bastante enredado ingresar sentencias directo a la base de datos.
Mi idea principalmente es que se restrinja el envío a una cierta cantidad de mensajes por minuto pero a un host en específico, en mi caso Gmail, que no acepta más de 100 mensajes por minuto.
Si alguien ha creado una regla para Gmail y la comparte sería genial.
Saludos.!
Estimados estoy recibiendo notificaciones de error, si primero configuro de una forma y despues otra en el script solo cambio el contenido y ya? o tengo que reiniciar algo? y como desactivo el servicio de policyd????
Vuelvo para hacer otro alcance, cuando activé Policed el servidor demora mucho en enviar los mensajes, la interfaz Web se queda detenida largo rato. Puede que el servidor haya quedado corto de Hardware pero no lo creo ya que desactivándolo todo fluye con total normalidad. Personalmente creo que esta característica está aún muy verde como para ponerla en producción, le falta ser pulida.
Hola, primero agradecerte por el excelente post.
Mi duda se genera con respeto a los logs, he replicado tu ejemplo 2 correos en 1 minuto, pero solo me permite 1 en 1 minuto y al revisalo los logs me llama la atención que al enviar un mail en la sección quota, para el mismo mail me sale quota=1.00/2 (50.0%) y acto seguido quota=2.00/2 (100.0%), por lo cual al enviar el 2do mail ya no me permite quota=2.53/2 (126.7%) quota=3.53/2 (176.7%).
Me podrías explicar como hace esa cuenta, por que de esa manera entedería por que no puedo enviar el segundo mail
De ante mano muchas gracias por tu respuesta.
Buenas Darwin.
También me pasa lo mismo pero solo cuando utilizo el webmail.
Con la misma cuenta configurada en un gestor de correo (Outlook) el sistema de cbpolicyd solo me cuenta un mensaje, y asi lo contabiliza en la cuota.
¿Has averiguado porque sucede esto?
Un saludo.
cordial saludo desde Cali – Colombia , desde el jueves no tengo acceso mi correo electrónico que esta con el servidor de ZIMBRA, ud sabe que ocurre ? mi asesor de tecnología dice que es un daño en el servidor ,pero no se arregla . . . . me puede informar ?
Buenas!
Gracias por el post, he podido configurar las cuotas de policyd y funcionan a la perfección, pero tengo una duda en cuanto a las exclusiones.
Es un servidor en producción y querria que a los correos enviados desde ciertas IPs no se les aplicasen las politicas de cuota.
La entrada “INSERT INTO policy_group_members (PolicyGroupId,Member,Disabled,Comment)” se aplica en la BD de sqlite pero no se refleja en el tail del cbpolicy.log que voy monitorizando al enviar un correo.
En este log, la unica IP que aparece es la del host, una IP interna 192.168.1.X, no la IP publica del servicio de correo (que es la que aparece incrustada en los correos salientes).
Mis dudas son las siguientes:
¿Que IP debo añadir al policy_group_members?¿La privada, la publica?
¿Y como queda vinculada la politica de cuota con este miembro del grupo?
Puedo seguir el hilo de los ID de limite, cuota, politica, etc… pero no acabo de entender como sabe la politica que a esa IP no debe aplicarse.
Espero que me podais resolver las dudas y echar un cable (pero no al cuello)
Un saludo y gracias por el blog.
Jordi tengo la misma duda en este momento, talvez lograste solucionar este problema?
Muchas gracias Jorge por tus tutoriales, te hago una consulta, en caso que el policyd me de algún problema, como regreso al puerto por default?
[zimbra@zimbra ~]$ zmprov mcf +zimbraMtaRestriction “check_policy_service inet:127.0.0.1:10031”
[zimbra@zimbra ~]$ zmlocalconfig -e postfix_enable_smtpd_policyd=yes