ÍNDICE
La documentación abarcará lo siguiente:
1.Implementación de un servidor de correo con buzones.
1.3. Implementación y configuración de ESMTP Postfix.
1.3.1. Selección de cifrados.
1.3.2. Configurando Postfix.
1.3.3. Creando los archivos de controles para Postfix-LDAP.
1.3.4. Comprobando la integración con LDAP y mapeos de aliases.
1.4.Implementación y configuración de Dovecot.
1.4.1.Configurando Dovecot
1.4.2.Creando archivo de control para Dovecot-LDAP
1.4.3.Script “quota-warnings.sh”
2. Implementación del cliente de correo web
2.2. Fortaleciendo la seguridad del cliente de correo web
2.3. Configuraciones desde la WebGUI de RainLoop
3.1. Outlook 2016
3.2. Outlook 2019
3.3. Thunderbird 78.8.0
4.1. Filtrado de correos por categorías
4.2. Filtrado para el remitente y destinatario
4.3. Filtrado para encabezado, adjuntos y cuerpo del correo
6. Listas de distribución con Mailman 2
6.1. Configuración de Nginx para Mailman 2
6.2. Instalación y configuración de Mailman 2
6.3. Integración de Mailman 2 a Postfix
6.4. Creando otras listas en Mailman 2
7. Rotación de logs y envío de reportes
8. Comprobando la encriptación TLS
9. Iptables
1.2. Sincronización de tiempo
La mayoría de las veces los servidores desplegados usan la zona horaria UTC (Coordinated Universal Time) o lo que es lo mismo, el tiempo en los cero grados de longitud. Consistentemente al usar el UTC como zona horaria se reduce la confusión cuando nuestra infraestructura sufre cambios de horarios por las múltiples zonas horarias que pueda atravesar (horario de verano y horario normal de cada región).
Para la sincronización del tiempo se analizará la variante por “timesyncd”, el cual es un cliente para sincronizar el tiempo más ligero que ntpd y que es usado en los sistemas actuales. Primero desinstalamos otras soluciones para sincronización de tiempo, que no serán requeridas:
apt remove --purge ntp ntpdate
En este caso se usará como zona horaria la de America/Havana:
timedatectl set-timezone America/Havana
Habilitamos la sincronización por ntp:
timedatectl set-ntp true
Editar el fichero de configuración, no sin antes hacerle una salva:
cp /etc/systemd/timesyncd.conf{,.orig} echo "NTP=ntp.empresa.midominio.cu" >> /etc/systemd/timesyncd.conf
Reiniciamos el servicio:
systemctl restart systemd-timesyncd
Verificamos que este sincronizado:
timedatectl
Debe devolver, algo como lo siguiente:
Local time: vie 2021-03-05 18:47:22 CST Universal time: vie 2021-03-05 23:47:22 UTC RTC time: vie 2021-03-05 23:47:23 Time zone: America/Havana (CST, -0500) System clock synchronized: yes NTP service: active RTC in local TZ: no
Vemos los logs del servicio:
journalctl --since -1h -u systemd-timesyncd
Debe devolver, algo como lo siguiente:
-- Logs begin at Fri 2021-03-05 17:45:26 CST, end at Fri 2021-03-05 18:49:12 CST. -- mar 05 18:49:12 mail systemd[1]: Stopped Network Time Synchronization. mar 05 18:49:12 mail systemd[1]: Starting Network Time Synchronization... mar 05 18:49:12 mail systemd[1]: Started Network Time Synchronization. mar 05 18:49:12 mail systemd-timesyncd[18889]: Synchronized to time server for the first time 192.168.130.97:123 (ntp.empresa.midominio.cu).
Para obtener mas informacion de la sincronización con el servidor NTP, corremos el siguiente comando:
timedatectl show-timesync
Debe devolver lo siguiente:
SystemNTPServers=ntp.empresa.midominio.cu FallbackNTPServers=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org ServerName=ntp.empresa.midominio.cu ServerAddress=192.168.130.97 RootDistanceMaxUSec=5s PollIntervalMinUSec=32s PollIntervalMaxUSec=34min 8s PollIntervalUSec=34min 8s NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=3, Precision=-20, RootDelay=31.982ms, RootDispersion=105.743ms, Reference=C0A8686D, OriginateTimestamp=Wed 2021-03-10 15:34:56 CST, ReceiveTimestamp=Wed 2021-03-10 15:34:56 CST, TransmitTimestamp=Wed 2021-03-10 15:34:56 CST, DestinationTimestamp=Wed 2021-03-10 15:34:56 CST, Ignored=yes PacketCount=45, Jitter=12.842ms } Frequency=741315
NOTA: Debe contarse con un servidor NTP funcional o al menos la dirección de uno que este disponible.
1.3. Implementación y configuración de ESMTP Postfix
Crear el archivo “/etc/mailname”, agregándole el dominio de correo:
echo "empresa.midominio.cu" > /etc/mailname
Eliminando “sendmail”, “exim” y demás variantes de MTA:
apt remove --purge exim4 exim4-base exim4-config exim4-daemon-light mailx mutt
Instalando Postfix, Dovecot, Sasl y paquetes asociados adicionales:
apt -y install postfix postfix-pcre postfix-ldap dovecot-common dovecot-core dovecot-pop3d dovecot-imapd dovecot-ldap sasl2-bin libsasl2-modules libsasl2-modules-ldap libnet-ldap-perl ldap-utils arj arc bzip2 cabextract cpio file lzma xz-utils lhasa lzop rpm2cpio gzip nomarch pax lzop rar unrar unzip unace razor pyzor tnef zip p7zip-full
El proceso de instalación de Postfix, realiza una pregunta, a la cual debe seleccionar según el roll que tendrá su servidor:
• Sin configuración (Mantiene la configuración actual intacta).
• Sitio de internet (su servidor gestiona el correo entrante y saliente directamente desde internet).
• Internet con <> (Su servidor gestiona el correo entrante directamente desde internet o mediante fetchmail, el correo saliente mediante otro servidor de correo que actúa como smarthost).
• Local (Su servidor de correos solamente gestiona correos relacionados con su dominio, es decir a modo local).
Usted por el momento puede seleccionar la opción “Sitio de internet”, puesto que más adelante va a cambiar todo lo relacionado con el comportamiento de su servidor de correos mediante el archivo de configuración.
Posteriormente debe aparecer el nombre del dominio al que va a responder su servidor de correo, por ejemplo “empresa.midominio.cu”, el que usted debe confirmar.
Editando “/etc/default/saslauthd”:
nano /etc/default/saslauthd
Busque las coincidencias que aparecen a continuación y cámbielas como se representa en el fragmento siguiente:
# [...] START=yes # [...]
Creando los archivos de control para “saslauthd”:
mkdir -p /var/spool/postfix/var/run/saslauthd rm -rf /var/run/saslauthd ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
Agregando el usuario “postfix” al grupo “sasl”:
adduser postfix sasl
Reiniciando saslauthd:
systemctl restart saslauthd
Crear grupos y usuarios asociados a la integración con el AD DC:
groupadd -g 5000 vmail useradd -d /home/vmail -s /bin/false -m -u 5000 -g 5000 -c "Directorio virtual para buzones" vmail
Creando los certificados SSL:
Los certificados SSL que se generan a continuación se encuentran en función del FQDN del servidor en cuestión, donde al ejecutar los siguientes comandos relacionados con el certificado SSL usted debe cambiar el valor “empresa.midominio.cu” por el nombre de su dominio.
cd /etc/ssl
Al ejecutar el siguiente comando debe solicitar una clave, queda a su criterio cual usar, al escribir la contraseña y presionar la tecla “ENTER” le solicita que escriba nuevamente la contraseña a modo de verificación de la misma.
openssl genrsa -des3 -out smtp.key 2048
-Pide una contraseña: 123456
-Confirmamos la contraseña: 123456
Al ejecutar el siguiente comando le va a solicitar una contraseña la cual debe coincidir con la contraseña que utilizo en el comando anterior, además de una serie de datos los cuales van a estar contenidos en su certificado (SSL), como ejemplo se toma el FQDN perteneciente a los datos que se siguen en esta guía, “smtp”, y a continuación se representan las respuestas, las cuales usted debe adecuar según su red, si su servicio de correo cuenta con acceso desde una red WAN y una red LAN usted debe crear los certificados pertenecientes a cada una, en este ejemplo solo se lleva a cabo el certificado perteneciente a la red LAN, por las características de la red de este tutorial:
openssl req -new -key smtp.key -out smtp.csr
Debe devolver lo siguiente:
Enter pass phrase for smtp 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) [AU]:CU State or Province Name (full name) [Some-State]:HABANA Locality Name (eg, city) []:LaHabana Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA Organizational Unit Name (eg, section) []:REDES Common Name (e.g. server FQDN or YOUR name) []:smtp.empresa.midominio.cu Email Address []:[email protected]
Al finalizar el proceso vuelve a solicitar una contraseña la cual debe coincidir con la contraseña que ha utilizado anteriormente en el proceso de generación del certificado, dicha contraseña al ser escrita se va a visualizar en texto plano en su consola, al presionar la tecla “ENTER” solicita el nombre de la compañía.
Posteriormente debe generar el certificado con la llave emisora, por 2 años en este ejemplo, donde al ejecutar el siguiente comando vuelve a solicitar la misma contraseña:
openssl x509 -req -days 730 -in smtp.csr -signkey smtp.key -out smtp.crt
Cada vez que un servicio con un certificado SSL valla a ser iniciado, debería pedir una contraseña, para asegurar que el legítimo operador de servicio ha sido quien le ordenó la arrancada. Pero poner una contraseña cada vez que inicia Postfix, sería algo tedioso. Por tanto, la solución a esta problemática pudiera ser quitar la clave. Al ejecutar el siguiente comando debe solicitar nuevamente la clave, usted debe utilizar la misma contraseña que ha utilizado en todo el proceso de generación del certificado SSL:
openssl rsa -in smtp.key -out smtp.key.sinpassword
Cambiamos el nombre de la llave recién generada:
mv smtp.key.sinpassword smtp.key
Emitiendo una autoridad de raíz, donde nuevamente debe solicitar una contraseña y los mismos datos que anteriormente usted aportó:
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 730
Como podrá observar le solicita los mismos datos que usted aporto anteriormente, los cuales deben coincidir:
Generating a 2048 bit RSA private key ..............................................................................................................+++++ .............................................................................+++++ writing new private key to 'cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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) [AU]:CU State or Province Name (full name) [Some-State]:HABANA Locality Name (eg, city) []:LaHabana Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA Organizational Unit Name (eg, section) []:REDES Common Name (e.g. server FQDN or YOUR name) []:smtp.empresa.midominio.cu Email Address []:[email protected]
Asignando permisos y posicionando los certificados correctamente:
chmod 600 /etc/ssl/smtp.key chmod 600 /etc/ssl/cakey.pem mv /etc/ssl/smtp.key /etc/ssl/private/ mv /etc/ssl/smtp.crt /etc/ssl/certs/ mv /etc/ssl/cakey.pem /etc/ssl/private/ mv /etc/ssl/cacert.pem /etc/ssl/certs/ mkdir /etc/postfix/certs cd /etc/postfix/certs openssl dhparam -2 2048 > /etc/postfix/certs/dh_2048.pem openssl dhparam -2 1024 > /etc/postfix/certs/dh_1024.pem
NOTA: Debe contarse con un servidor NTP funcional o al menos la dirección de uno que este disponible.
1.3.1. Selección de cifrados
Seleccionar una suite de cifrados puede ser todo un desafío en Postfix. Muchas consideraciones se han de tener en cuenta a la hora de tomar la decisión correcta. Algunas de ellas pudieran citarse, como son: las capacidades del servidor y el cliente, certificado de autoridad con requerida compatibilidad. La suite de cifrados debe ser lo suficientemente flexible con otros servidores, de lo contrario problemas de compatibilidad pudieran ocurrir. Si no se soporta en alguno de los extremos (cliente o servidor) ocurrirán errores durante el intercambio de llaves.
Para cumplir con los requerimientos establecidos al inicio del ejemplo, los autores de este tutorial tienen como requisito el uso de cifrados que sean AEAD o PFS (Perfect Frorward Secrecy). Se entiende por PFS, como la propiedad de los sistemas criptográficos que garantiza que el descubrimiento de las claves utilizadas actualmente no compromete la seguridad de las claves usadas con anterioridad (no las revela), por tanto, la seguridad de lo que se hizo usando claves antiguas persiste. Cuando un sistema tiene cifrados PFS se dice que el sistema es seguro hacia adelante.
Los cifrados que serán autorizados a usarse en “submission”, serán los siguientes:
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_GCM_SHA256
- ECDHE-RSA-AES256-GCM-SHA384
- ECDHE-RSA-AES128-GCM-SHA256
Los cifrados de TLSv1.3 siempre serán utilizados, mientras se soporte el protocolo y no se excluya su uso en la configuración. Lo que hay que lograr ahora, es que solamente se puedan usar para TLSv1.2 los especificados en la lista anterior. Esto lo podremos lograr redefiniendo la lista de cifrados “high” para TLS en Postfix, siempre y cuando especifiquemos el patrón que los diferencia. Con un poco de observación, podemos crear un filtro que nos de los cifrados ECDHE requeridos (los de TLSv1.3 no es necesario filtrarlos): ECDHE+AESGCM:-ECDSA:@STRENGTH
Para el caso de los cifrados aNULL, estos son usados para autenticación anónima en un canal encriptado. Al inicio del tutorial no había ningun requisito para usar los cifrados de autenticación anónima, pero haremos el procedimiento para obtener los mas seguros de TLSv1.2, ya que en TLSv1.3, todos son seguros.
Este tipo de cifrados es muy útil en conexiones “servidor-servidor”, donde no se quiera autenticar a un host definido como confiable, pero que tampoco se quiere que la comunicación entre ambos vaya a través de un canal inseguro. Es normal que la comunicación entre servidores MTA viaje a través de una red de transporte, que puede no pertenecer a la propia empresa, sino al proveedor de servicios o Internet. Por tanto, mejor usar un canal encriptado sin autenticación, que uno sin encriptar.
Los cifrados para auntenticacion anónima a utilizar, los obtendremos del siguiente comando:
openssl ciphers -V 'aNULL'
La línea anterior indica a OpenSSL que se listen todos los cifrados que usan autenticación anónima (aNULL).
El comando nos devuelve una lista de cifrados, de los cuales nos quedamos con los mas fuertes de TLSv1.3 y los dos más seguros de TLSv1.2:
0x13,0x02 - TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD 0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD 0x13,0x01 - TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD 0x00,0xA7 - ADH-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=None Enc=AESGCM(256) Mac=AEAD 0x00,0xA6 - ADH-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=None Enc=AESGCM(128) Mac=AEAD # [...]
Si hubiésemos listado por la expresión ‘aNULL:@STRENGTH’ nos hubieses listado los cifrados mas fuertes sin tener en cuenta la versión del protoclo como una prioridad y no se cumplirían con algunas restricciones de nuestro servidor. O sea, aun cuando los siguientes cifrados son mas fuertes que uno de nuestros candidatos finales, quedan excluidos:
- ADH-AES256-SHA256 (usa cifrado CBC, vulnerable).
- AECDH-AES256-SHA (usa un protocolo TLSv1, no autorizado).
- ADH-AES256-SHA (usa un protocolo SSLv3, no autorizado).
- ADH-CAMELLIA256-SHA (usa un protocolo SSLv3, no autorizado).
Por tanto, para autenticación la anónima, estarán disponibles los siguientes cifrados:
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_GCM_SHA256
- ADH-AES256-GCM-SHA384
- ADH-AES128-GCM-SHA256
La combinanción que buscamos para ser usada en Postfix, que sea la equivalente a los cifrados de arriba, sería: ADH+AESGCM:@STRENGTH
1.3.2. Configurando Postfix
Haciendo una copia del archivo de configuración de Postfix:
cp /etc/postfix/main.cf{,.orig}
Creamos el fichero de configuración de mayor prioridad en Postfix:
nano /etc/postfix/master.cf
Procuramos que las siguientes opciones se encuentren como se muestran, a continuación:
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (no) (never) (100) # ========================================================================== # # [smtp] smtp inet n - y - - smtpd #### Deshabilitar opciones especificas, segun el CIDR del cliente SMTP remoto -o smtpd_discard_ehlo_keyword_address_maps=cidr:${config_directory}/reglas/esmtp_access.cidr #### #### Habilitar encriptacioon TLS oportunista (no es obligado usar TLS) -o smtpd_tls_security_level=may #### #### Redefinir la lista de OpenSSL para el grado "high" de los cifrados -o tls_high_cipherlist=ADH+AESGCM:@STRENGTH # # [submission] submission inet n - y - - smtpd #### Deshabilitar opciones especificas -o smtpd_discard_ehlo_keywords=silent-discard,etrn,dsn #### #### Habilitar TLS mandatorio -o smtpd_tls_security_level=encrypt #### #### Redefinir la lista de OpenSSL para el grado "high" de los cifrados -o tls_high_cipherlist=ECDHE+AESGCM:-ECDSA:@STRENGTH #### #### Habilitar auth SASL -o smtpd_sasl_auth_enable=yes # [...]
Agregue al final del archivo lo siguiente:
dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
Haciendo una copia del archivo de configuración de Postfix:
mv /etc/postfix/main.cf{,.orig}
Creando un nuevo archivo de configuración principal para Postfix:
nano /etc/postfix/main.cf
Agregue el siguiente contenido adaptando, según sus datos de red:
#========= # NETWORK #========= # Especificar el texto que le sigue al coodigo de respuesta "220" (OK, continuar con el siguiente comando) del servidor SMTP smtpd_banner = $myhostname ESMTP # Interfaces de red por las que escucha el servidor SMTP inet_interfaces = all inet_protocols = ipv4 # Redes confiables (normalmente el localhost y el relayhost), que tienen permitido hacer relay o retransmitir correo al servidor SMTP mynetworks = 127.0.0.0/8, 192.168.130.87/32 # Servidor relay de correo relayhost = [192.168.130.87]:26 # Especificar variables a usar en la configuracioon mydomain = empresa.midominio.cu myhostname = mail.$mydomain myorigin = $mydomain mydestination = localhost, localhost.localdomain, localhost.$mydomain, #listas.$mydomain, $myhostname #========= # VIRTUAL #========= virtual_minimum_uid = 5000 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 # Mapeo del login de usuarios vs cuenta de correo (para evitar suplantacioon de identidad) smtpd_sender_login_maps = proxy:ldap:${config_directory}/ldap/email_vs_user.cf virtual_alias_maps = hash:${config_directory}/aliases/mailman_alias, hash:${config_directory}/aliases/user_alias, proxy:ldap:${config_directory}/aliases/group_alias.cf virtual_mailbox_maps = ldap:${config_directory}/ldap/mailbox_maps.cf virtual_mailbox_domains = $mydomain virtual_mailbox_limit = 0 virtual_mailbox_base = /home/vmail/ virtual_transport = dovecot #======= # ALIAS #======= alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases #=========== # TRANSPORT #=========== # Enrutamiento de correos #transport_maps = hash:${config_directory}/transport #========= # MAILBOX #========= home_mailbox = Maildir/ mailbox_size_limit = 0 message_size_limit = 10485760 #owner_request_special = no #dovecot_destination_recipient_limit = 1 #========== # SECURITY #========== postscreen_greet_action = drop disable_vrfy_command = yes # Lista de comandos que el servidor prohiibe para el cliente STMP remoto, de lo contrario terminaraa la sesioon smtpd_forbidden_commands = VRFY, EXPN, CONNECT, ETRN, GET, PASS, POST, USER #===== # TLS #===== #===== Opciones TLS para el servidor # CA, llave y certificado del servidor SMTP smtpd_tls_cert_file = /etc/ssl/certs/smtp.crt smtpd_tls_key_file = /etc/ssl/private/smtp.key smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem # Habilitar que no se anuncie o acepte autenticacioon SASL sobre conexiones no encriptadas, cuando la encriptacioon TLS es opcional en el servidor SMTP smtpd_tls_auth_only = yes # Protocolos TLS aceptados por el servidor SMTP para TLS oportunista smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 # Protocolos TLS aceptados por el servidor SMTP para TLS mandatorio smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 # Grado miinimo de los cifrados que usara el servidor SMTP para la encriptacioon por TLS oportunista smtpd_tls_ciphers = high # [submission] Grado miinimo de los cifrados que usara el servidor SMTP para la encriptacioon por TLS mandatorio smtpd_tls_mandatory_ciphers = high # Establecer la preferencia del orden de cifrado por el servidor SMTP tls_preempt_cipherlist = yes # Archivo con paraametros DH que el servidor Postfix SMTP deberaa utilizar con cifrados EDH no exportables smtpd_tls_dh1024_param_file = ${config_directory}/certs/dh_2048.pem # Archivo con paraametros DH que el servidor Postfix SMTP deberaa utilizar con cifrados EDH exportables smtpd_tls_dh512_param_file = ${config_directory}/certs/dh_1024.pem # Grado de seguridad del servidor para el intercambio de llaves EECDH smtpd_tls_eecdh_grade = strong # Opciones del servidor para la cachee de la sesioon TLS smtpd_tls_session_cache_timeout = 3600s smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache # Proteccioon contra ataques de estresamiento al CPU el servidor SMTP tls_ssl_options = NO_RENEGOTIATION # Nivel de detalles de los registros de la actividad TLS en el servidor SMTP smtpd_tls_loglevel = 2 #===== Opciones TLS para el cliente # Habilitar uso de encriptacioon no obligatoria en el cliente (TLS oportunista) smtp_tls_security_level = may # Grado miinimo de los cifrados que usara el cliente SMTP para la encriptacioon por TLS oportunista smtp_tls_ciphers = high # Protocolos TLS aceptados por el cliente SMTP para TLS oportunista smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 # Proteccioon contra vulnerabilidad (CVE-2009-3555) smtp_tls_block_early_mail_reply = yes # Nivel de detalles de los registros de la actividad TLS en el cliente SMTP smtp_tls_loglevel = 1 #====== # SASL #====== # Nombre del dominio de autenticacioon SASL local del servidor SMTP smtpd_sasl_local_domain = $mydomain # Tipo de plugin SASL que el servidor debe usar para autenticacioon smtpd_sasl_type = dovecot # Fichero para el plugin de SASL especificado por el servidor smtpd_sasl_path = private/auth # Deshabilitar autenticacioon anoonima y en texto plano con el servidor smtpd_sasl_security_options = noanonymous, noplaintext # Deshabilitar autenticacioon anoonima en el servidor para las sesiones encriptadas por TLS smtpd_sasl_tls_security_options = noanonymous #=============== # RESTRICCIONES #=============== # Habilitar que el servidor requiera el comando "HELO" o "EHLO" antes de enviar un correo smtpd_helo_required = yes # Demorar el rechazo de los clientes no autenticados hasta el "RCPT TO" smtpd_delay_reject = yes # Restricciones para el encabezado del mensaje #header_checks = #regexp:${config_directory}/reglas/header_checks.regexp, #pcre:${config_directory}/reglas/header_checks.pcre # Restricciones para los adjuntos #mime_header_checks = regexp:${config_directory}/reglas/adjuntos.regexp # Restricciones para el cuerpo del mensaje #body_checks = regexp:${config_directory}/reglas/body_checks.regexp # Alias para las restricciones de los grupos de acceso de correo #smtpd_restriction_classes = #mail_nacional_in, #mail_nacional_out, #mail_local_in, #mail_local_out # Correo Nacional en entrada # Si el remitente es de ".cu" --> RELAY # Si no, entonces es una direccion de correo internacional --> REJECT #mail_nacional_in = check_sender_access regexp:${config_directory}/reglas/filtro_nacional # Correo Nacional en salida # Si el destinatario es de ".cu" --> RELAY # Si no, entonces es una direccion de correo internacional --> REJECT #mail_nacional_out = check_recipient_access regexp:${config_directory}/reglas/filtro_nacional # Correo Local en entrada # Si el remitente es del dominio local --> RELAY # Si no, entonces es una direccion de correo nacional o internacional --> REJECT #mail_local_in = check_sender_access regexp:${config_directory}/reglas/filtro_local # Correo Local en salida # Si el destinatario es del dominio local --> RELAY # Si no, entonces es una direccioon de correo nacional o internacional --> REJECT #mail_local_out = check_recipient_access regexp:${config_directory}/reglas/filtro_local # Restricciones opcionales para los clientes SMTP remotos smtpd_client_restrictions = # # Permitir los CIDR confiables permit_mynetworks, # # Permitir solo si el cliente es satisfactoriamente autenticado por el protocolo RFC 4954 (AUTH) permit_sasl_authenticated, # # Lista negra para remitentes y hostnames #check_sender_access pcre:${config_directory}/reglas/sender_checks.pcre, #check_helo_access pcre:${config_directory}/reglas/helo_checks.pcre, # # Rechazar cuando la direccioon IP inversa del cliente coincida con el registro "A" de los siguientes dominios reject_rbl_client bl.spamcop.net, reject_rbl_client cbl.abuseat.org, reject_rbl_client zen.spamhaus.org, reject_unknown_client_hostname, # # Poliitica por defecto permit # Restricciones opcionales en el contexto del cliente SMTP ejecutando el comando "HELO" o "EHLO" smtpd_helo_restrictions = # # Permitir los CIDR confiables permit_mynetworks, # # Permitir solo si se ha autenticado permit_sasl_authenticated, # # Rechazar si al usar el comando "HELO" o "EHLO" se especifica un hostname malformado reject_invalid_helo_hostname, # # Rechazar si al usar el comando "HELO" o "EHLO" se especifica un hostname que no tiene la forma de FQDN reject_non_fqdn_helo_hostname, # # Rechazar si al usar el comando "HELO" o "EHLO" se especifica un hostname que no tiene un registro DNS "A" o "MX" valido reject_unknown_helo_hostname, # # Poliitica por defecto permit # Restricciones opcionales para el remitente, en el contexto del cliente SMTP ejecutando el comando "MAIL FROM" smtpd_sender_restrictions = # # Rechazar si la direccioon del remitente especifica un dominio que no tiene la forma de FQDN reject_non_fqdn_sender, # # Rechazar si la direccion del remitente no esta en la lista de usuarios vaalidos reject_unlisted_sender, # # Permitir los CIDR confiables permit_mynetworks, # # Mapeo de las direcciones de correo entrante y saliente del servidor SMTP #check_recipient_access ldap:${config_directory}/ldap/nacional_in.cf, #check_sender_access ldap:${config_directory}/ldap/nacional_out.cf, #check_recipient_access ldap:${config_directory}/ldap/local_in.cf, #check_sender_access ldap:${config_directory}/ldap/local_out.cf, reject_sender_login_mismatch, # # Permitir solo si el cliente es satisfactoriamente autenticado por el protocolo RFC 4954 (AUTH) permit_sasl_authenticated, # # Rechazar remitente con dominio que no tiene un registro DNS "A" o "MX", o que se deba a un DNS mal configurado reject_unknown_sender_domain, # # Poliitica por defecto permit # Restricciones opcionales para relay smtpd_relay_restrictions = # # Permitir los CIDR confiables permit_mynetworks, # # Permitir solo si el cliente es satisfactoriamente autenticado por el protocolo RFC 4954 (AUTH) permit_sasl_authenticated, # # Rechazar a menos que Postfix sea un open relay o es el destino final reject_unauth_destination, # # Postfix verificaraa siempre el estado de la cuota del usuario ante la llegada de un nuevo correo #check_policy_service inet:127.0.0.1:12340, # # Poliitica por defecto permit # Restricciones opcionales para el destinatario, en el contexto del cliente SMTP ejecutando el comando "RCPT TO" smtpd_recipient_restrictions = # # Rechazar si la direccioon del destinatario especifica un dominio que no tiene la forma de FQDN reject_non_fqdn_recipient, # # Rechazar destinatario con dominio que no tiene un registro DNS "A" o "MX", o que se deba a un DNS mal configurado reject_unknown_recipient_domain, # # Rechazar si la direccioon del destinatario no estaa en la lista de usuarios vaalidos reject_unlisted_recipient, # # Permitir los CIDR confiables permit_mynetworks, # # Lista negra para destinatarios #check_recipient_access pcre:${config_directory}/reglas/recipient_checks.pcre # # Permitir solo si el cliente es satisfactoriamente autenticado por el protocolo RFC 4954 (AUTH) permit_sasl_authenticated, # # Poliitica por defecto permit # Restricciones opcionales en el contexto del cliente SMTP ejecutando el comando "RCPT TO" smtpd_data_restrictions = # # Rechazar cuando el cliente enviia comandos SMPT antes de tiempo cuando no esta permitido, o sin saber # que Postfix soporta comandos ESMTP # (Proteccioon contra SPAM de correos que usa inapropiadamente los comandos ESMTP) reject_unauth_pipelining, reject_multi_recipient_bounce, # # Poliitica por defecto permit #===== # BCC #===== # Copias ocultas de todos los correos especificados y salientes del servidor SMPT #recipient_bcc_maps = hash:/etc/postfix/bcc/recipient_maps # Copias ocultas de todos los correos especificados y entrantes del servidor SMPT #sender_bcc_maps = hash:/etc/postfix/bcc/sender_maps #========= # LIMITES #========= bounce_template_file = /etc/postfix/bounce.cf bounce_queue_lifetime = 3d default_destination_concurrency_limit = 10 delay_warning_time = 4h dovecot_destination_recipient_limit = 1 local_destination_concurrency_limit = 5 maximal_backoff_time = 8000s maximal_queue_lifetime = 3d minimal_backoff_time = 1000s smtp_connect_timeout = 30 smtp_helo_timeout = 60s smtp_mx_address_limit = 5 smtp_quit_timeout = 240s smtp_rcpt_timeout = 240s smtp_rset_timeout = 20s smtpd_client_connection_count_limit = 3 smtpd_error_sleep_time = 1s smtpd_hard_error_limit = 5 smtpd_junk_command_limit = 2 smtpd_recipient_limit = 20 smtpd_soft_error_limit = 1 #=============== # MISCELLANEOUS #=============== compatibility_level = 2 biff = no enable_long_queue_ids = yes recipient_delimiter = + notify_classes = bounce, 2bounce, delay, policy, protocol, resource, software # Debug para diagnosticos sobre determinada IP # Descomentar para su uso y revisar "/var/log/mail.log" #debug_peer_list = 192.168.130.87 #debug_peer_level = 16
Creamos el fichero “/etc/postfix/reglas/esmtp_access.cidr” para decidir a qué CIDR anunciar STARTTLS y otras opciones. Esto puede ser útil en caso de que el relayhost no esté en nuestras manos poder configurarlo y se trate de un servidor no actualizado a nuestros tiempos, que no soporta el protocolo mínimo de TLSv1.2, indicado por nuestro servidor y que al serle anunciado STARTTLS, intentará escalar a la conexión cifrada terminando en un error por imcomatabilidad de protocolos o cifrados.
nano /etc/postfix/reglas/esmtp_access.cidr
Agregamos lo siguiente:
# localhost: 127.0.0.0/8 silent-discard, auth, etrn, dsn # relayhost dentro de la propia red empresarial (no hay red de transporte publica por medio): 192.168.130.87/32 silent-discard, starttls, auth, etrn, dsn # resto de la red: 0.0.0.0/0 silent-discard, auth, etrn, dsn
1.3.3. Creando los archivos de controles para Postfix-LDAP
Se crea el directorio que contendrá las configuraciones para los mapeos de usuarios virtuales de LDAP:
mkdir /etc/postfix/ldap
- Mapeo de usuarios virtuales de correo:
nano /etc/postfix/ldap/email_vs_user.cf
Agregue el siguiente contenido adaptando a su red:
server_host = dc1.empresa.midominio.cu server_port = 389 version = 3 bind = yes start_tls = no bind_dn = EMPRESA\administrator bind_pw = Admin*123 search_base = OU=Usuarios,DC=empresa,DC=midominio,DC=cu scope = sub query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) result_attribute = mail debuglevel = 0
NOTA: Las consultas LDAP entre el servidor de correo y el AD DC no serán encriptadas, pues el servidor MTA se encuentra en la misma subred del AD DC y el tráfico broadcast de dicha red está separado del segmento de los usuarios. No existe posibilidad de un ataque MITM.
- Mapeo de buzones virtuales de correo:
nano /etc/postfix/ldap/mailbox_maps.cf
Agregue el siguiente contenido modificando lo que se encuentra resaltado en blanco, según sus datos de red:
server_host = dc1.empresa.midominio.cu server_port = 389 version = 3 bind = yes start_tls = no bind_dn = EMPRESA\administrator bind_pw = Admin*123 search_base = OU=Usuarios,DC=empresa,DC=midominio,DC=cu scope = sub query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) result_attribute = mail result_format = %d/%u/Maildir/ debuglevel = 0
- Mapeo de alias para grupos del AD:
Se crea el directorio que contendrá las configuraciones para los mapeos de los aliases:
mkdir /etc/postfix/aliases
Editamos el siguiente fichero:
nano /etc/postfix/aliases/group_alias.cf
Agregue el siguiente contenido adaptando a su red:
server_host = dc1.empresa.midominio.cu server_port = 389 version = 3 bind = yes start_tls = no bind_dn = EMPRESA\administrator bind_pw = Admin*123 search_base = OU=Grupos,DC=empresa,DC=midominio,DC=cu scope = sub query_filter = (&(objectClass=group)(mail=%s)) leaf_result_attribute = mail special_result_attribute = member debuglevel = 0
- Mapeo de alias personales o de correción de errores:
Ahora es necesario declarar el fichero que contendrá los alias de los usuarios virtuales, ya que “/etc/aliases” sólo funciona para usuarios locales:
nano /etc/postfix/users_alias
En este caso, agregamos los siguientes ejemplos:
# NOTA!!!: Este fichero requiere un "postmap" # Aliases para cuentas de correo que no coinciden con las del dominio usuario2.apellido usuario2 usuario3.apellido u3apellido # Aliases para cuentas de correo que no pertenecen al dominio especialista [email protected] # Aliases de grupo con usuarios que no pertenecen al dominio proyectowifi usuario1.apellido,[email protected]
NOTA: Especificamos el dominio solo si se trata de una cuenta de correo de otro dominio.
Generamos el mapa del fichero:
postmap /etc/postfix/aliases/user_alias
Recargamos Postfix:
systemctl reload postfix.service
Chequear si Postfix tiene algún error en la configuración
postfix check
NOTA: Omitir el siguiente WARNING:
postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out
1.3.4. Comprobando la integración con LDAP y mapeos de aliases
Verificamos los usuarios por defecto del DC:
ldapsearch -x -h dc1.empresa.midominio.cu -D 'EMPRESA\administrator' -W -b 'CN=Users,DC=empresa,DC=midominio,DC=cu' | perl -p00e 's/\r?\n //g'
Luego de especificar correctamente la contraseña, debe devolver los usuarios del contenedor “Users”.
Verificamos los usuarios del DC, que se encuentran en el OU=»Usuarios»:
ldapsearch -x -h dc1.empresa.midominio.cu -D 'EMPRESA\administrator' -W -b 'OU=Usuarios,DC=empresa,DC=midominio,DC=cu' | perl -p00e 's/\r?\n //g'
Luego de especificar correctamente la contraseña, debe devolver los usuarios de la empresa, los de la unidad organizativa “Usuarios”.
Digamos que se tiene el siguiente caso:
- Usuario de correo “[email protected]” con nombre usuario igual a la cuenta del dominio, que pertenece al grupo de “Redes” con dirección de correo propia “[email protected]” y forma parte de un alias de especifico para usuarios “[email protected]”.
- Usuario de correo “[email protected]” con nombre de usuario distinto a la cuenta del dominio (usuario2.apellido), que pertenece al grupo de “Redes” y forma parte de un especifico para usuarios, que corrige el destino de los correos que se escriban a la dirección de correo, teniendo en cuenta su nombre de la cuenta del dominio y no del correo.
- Usuario de correo “[email protected]” con nombre de usuario distinto a la cuenta del dominio (usuario3.apellido) y que también tiene un alias especifico para corregir errores.
Probando usuarios válidos para autenticación:
postmap -q [email protected] ldap:/etc/postfix/ldap/email_vs_user.cf
Debe devolver algo, como lo siguiente:
[email protected]
Probando el buzón de usuario:
postmap -q [email protected] ldap:/etc/postfix/ldap/mailbox_maps.cf
Debe devolver algo, como lo siguiente:
empresa.midominio.cu/usuario1.apellido/Maildir/
La dirección física del buzon se encuentra en la siguiente ruta:
/home/vmail/empresa.midominio.cu/usuario2/Maildir/
Probando alias para grupos del AD:
postmap -q [email protected] ldap:/etc/postfix/aliases/group_alias.cf
Debe devolver algo, como lo siguiente:
[email protected],[email protected]
Probando alias personales:
postmap -q usuario2.apellido hash:/etc/postfix/aliases/user_alias
Debe devolver algo, como lo siguiente:
[email protected]
Probando alias personales para grupos de usuarios que no son del dominio:
postmap -q proyectowifi hash:/etc/postfix/aliases/user_alias
Debe devolver algo, como lo siguiente:
usuario1.apellido,[email protected]
Si algún cliente SMTP remoto intenta iniciar una conexión con el servidor por el puerto 25, no podrá autenticarse en el mismo:
telnet mail.empresa.midominio.cu 25 Trying 192.168.120.37... Connected to mail.empresa.midominio.cu. Escape character is '^]'. 220 mail.empresa.midominio.cu ESMTP ehlo mail.empresa.midominio.cu 250-mail.empresa.midominio.cu 250-PIPELINING 250-SIZE 10485760 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-SMTPUTF8 250 CHUNKING auth 503 5.5.1 Error: authentication not enabled
Hasta este punto se tiene implementado un servidor con soporte para SMTP y submission.
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0
Que pudiera se el error que me da al chequiar el ejecutar el comando postfix check
/usr/sbin/postconf: fatal: file /etc/postfix/master.cf: line 22: bad field count
postfix/postfix-script: fatal: cannot execute /usr/sbin/postconf!
Hice de todo en esas lineas, el error empiesa en la linea
-o smtpd_discard_ehlo_keyword_address_maps=cidr:${config_directory}/reglas/esmtp_access.cidr
si la comento me da error la que sigue…
Saludos
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:89.0) Gecko/20100101 Firefox/89.0
Te felicito Franco, muy buen artículo y muy necesario, para nosotros los aprendices. Agradecido, una pequeña errata:
Al inicio de 1.3.2. Configurando Postfix
Dice cp /etc/postfix/main.cf{,.orig}
Y en ese caso creo debe decir: cp /etc/postfix/master.cf{,.orig}
Ya que es el archivo que a continuación editas.
Al final de ese archivo (master.cf) dices debe añadirse la línea «flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}» pero a esa línea le fantan dos espacios delante, debe ser » flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}»
En la viñeta · Mapeo de alias personales o de correción de errores:
Dice: nano /etc/postfix/users_alias
Debe decir: nano /etc/postfix/aliases/user_alias
Si es posible arreglar y borrar este comentario.
Y de nuevo, ¡¡¡¡MUY AGRADECIDO, MUY BUEN TUTO!!!!
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0
postmap -q [email protected] ldap:/etc/postfix/aliases/group_alias.cf
Me devuelve:
postmap: warning: dict_ldap_lookup: /etc/postfix/aliases/group_alias.cf: Search base ‘OU=Grupos,DC=empresa,DC=midominio,DC=cu’ not found: 32: No such object
postmap: fatal: table ldap:/etc/postfix/aliases/group_alias.cf: query error: Success
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0
Adapta a tu estructura LDAP, la que pones es la de mi ejemplo, mi dominio, mi estructura del arbol LDAP
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0
Sï, lo adapté a mi estructura LDAP, lo que en el comentario lo reflejé con tu estructura, de todas formas seguiré probando. Saludos