postfix + dovecot + mysql en FreeBSD

Introduccion


Quería estudiar el servidor de correo durante mucho tiempo, pero mis manos llegaron solo ahora, y no pude encontrar la información correcta mucho, así que decidí escribir una publicación lo más detallada posible. Esta publicación discutirá no solo postfix, dovecot, mysql, postfixadmin, sino también spamassassin, clamav-milter (una versión especial de clamav para servidores de correo), postgrey, así como la posibilidad de transferir spam a la carpeta Spam (dovecot- casillero).

Preparación


En primer lugar, instalaremos los paquetes que necesita para trabajar (postfix, dovecot y dovecot-pigeonhole deben instalarse desde los puertos, dovecot-sieve puede instalarse desde los paquetes, en principio, hay versiones más nuevas en los puertos y por esta razón puede haber incompatibilidad entre dovecot y dovecot- tamiz). Instale los siguientes paquetes:

pkg install apache24 php73 mod_php73 php73-extensions php73-mysqli php73-mbstring php73-openssl clamav-milter postgrey spamassassin mysql57-server openssl wget 

Después de la instalación, pondremos los servicios necesarios en ejecución automática:

 #postfix  dovecot  ,       sysrc postfix_enable="YES" sysrc dovecot_enable="YES" sysrc mysql_enable="YES" sysrc apache24_enable="YES" sysrc spamd_flags="-u spamd -H /var/spool/spamd" sysrc spamd_enable="YES" sysrc postgrey_enable="YES" sysrc clamav_clamd_enable="YES" sysrc clamav_milter_enable="YES" sysrc clamav_freshclam_enable="YES" #freshclam        12  sysrc clamav_freshclam_flags="--daemon --checks=12" 

Ejecute los servicios:

 service apache24 start service mysql-server start #  spamassassin       sa-update sa-compile service sa-spamd start #   clamav   freshclam service clamav-clamd start service clamav-freshclam start service clamav-milter start #  postgrey    (/usr/local/etc/rc.d/postgrey),       ""   4-   ,    : ${postgrey_flags:=--inet=10023}     : : ${postgrey_flags:=--inet=10023 --auto-whitelist-clients=4} service postgrey start 

No olvide agregar en httpd.conf las líneas necesarias para que php funcione en apache y para que postfixadmin funcione correctamente:

 <FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch> <FilesMatch "\.phps$"> SetHandler application/x-httpd-php-source </FilesMatch> <IfModule dir_module> DirectoryIndex index.php </IfModule> #         postfixadmin DocumentRoot "/usr/local/www/apache24/data/postfixadmin-3.2/public" 

A continuación, vaya al directorio y descargue postfixadmin

 cd /usr/local/www/apache24/data 

Descargue postfixadmin (al momento de escribir, la versión actual era 3.2)

 wget --no-check-certificate https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz 

Después de eso, debe descomprimir el archivo en este directorio y cambiar el propietario del directorio:

 gzip -d postfixadmin-3.2.tar.gz tar -xvf postfixadmin-3.2.tar chown -R www:www /usr/local/www/apache24/data service apache24 restart 

Luego, prepare la base de datos para postfixadmin, ejecute el script mysql-secure-installation (la contraseña que cree en este script deberá crearse en mysql con el comando alter user), para la configuración inicial de mysql, luego ingrese mysql, cree la base de datos y los derechos para ella

 mysql -p -r alter user 'root'@'localhost' identified by 'password123'; create database postfix; grant all privileges on postfix.* to 'postfix'@'localhost' identified by 'password123'; exit 

Después de configurar la base de datos, debe editar el archivo config.inc.php, en este ejemplo este archivo está en el directorio /usr/local/www/apache24/data/postfixadmin-3.2/, en este archivo necesita editar varias líneas y llevarlas a Recuerde, después de cambiar la configuración, reinicie apache, también debe crear el directorio templates_c en el directorio /usr/local/www/apache24/data/postfixadmin-3.2 y asignarle el propietario de www:

 mkdir /usr/local/www/apache24/data/postfixadmin-3.2/templates_c chown -R www:www /usr/local/www/apache24/data/postfixadmin-3.2/templates_c $CONF['configured'] = true #       postfixadmin     . $CONF['setup_password'] = 'dd28fb2139a3bca426f02f60e6877fd5:13d2703c477b0ab85858e3ac5e076a0a7a477315'; $CONF['default_language'] = 'ru' $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix'; #           $CONF['database_password'] = 'password123'; $CONF['database_name'] = 'postfix'; service apache24 restart 

SSL


Para generar la clave, usaremos el método propuesto en postfix.org, con la creación de nuestra propia autoridad de certificación, debemos ir al directorio / etc / ssl y ejecutar el script:

 cd /etc/ssl /usr/local/openssl/misc/CA.pl -newca 

Durante la ejecución del script, se le solicitará un nombre para el certificado, no ingrese nada, presione Enter, luego el script le pedirá que cree una contraseña para el certificado, luego habrá preguntas estándar para crear un certificado.

A continuación, debe crear una clave secreta (sin contraseña) y un certificado de clave pública no firmado (el nombre de la unidad organizativa (por ejemplo, la sección) [] debe ser diferente de lo especificado en el certificado creado anteriormente):

 openssl req -new -newkey rsa:4096 -nodes -keyout foo-key.pem -out foo-req.pem 

Firmaremos el certificado de clave pública (especifique la cantidad de días que necesite):

 openssl ca -out foo-cert.pem -days 365 -infiles foo-req.pem 

Deje los certificados creados en este directorio o transfiéralos al directorio que le resulte más conveniente, las configuraciones "postfix" y "dovecote" se configurarán teniendo en cuenta el hecho de que los certificados estarán en este directorio.

Usuario de Vmail


Antes de instalar postfix, dovecot y dovecot-pigeonhole, crearemos un usuario y un grupo (un grupo se creará automáticamente) vmail, así como el directorio donde se ubicará el correo.

 pw useradd -n vmail -s /usr/sbin/nologin -u 1000 -d /var/vmail 

Cree un directorio para el correo y configure el propietario del usuario de vmail:

 mkdir /var/vmail chown -R vmail:vmail /var/vmail chmod -R 744 /var/vmail 

Postfix, palomar, palomar-palomar


Como escribí anteriormente, reuniremos los datos de la aplicación desde los puertos, ejecutaremos el comando para descargar y desempaquetar los puertos:

 portsnap fetch extract 

Después de desempaquetar los puertos, vaya al directorio dovecot, configure el puerto (tenga en cuenta el soporte para mysql) y ejecute la compilación (BATCH = yes le dirá a make que no haga preguntas durante la instalación):

 cd /usr/ports/mail/dovecot make config make BATCH=yes install clean 

Haga lo mismo con postfix y dovecot-pigeonhole

palomar-palomar:

 cd /usr/ports/mail/dovecot-pigeonhole make BATCH=yes install clean 

postfix: también verifique el soporte de mysql en la configuración del puerto

 cd /usr/ports/mail/postfix-sasl make config make BATCH=yes install clean 

Antes de comenzar dovecot, copie las "configuraciones":

  cp -R /usr/local/etc/dovecot/example-config/* /usr/local/etc/dovecot 

Después de instalar postfix y dovecot, inicie los servicios:

 service postfix start service dovecot start 

También es necesario crear un directorio en el que se compilará el módulo para enviar spam a la carpeta de spam, en mi caso este directorio se encuentra en la carpeta /usr/local/etc/dovecot/conf.d, el nombre del directorio es def, crea este directorio y un archivo con código para compilar y establezca el propietario del directorio de usuarios de vmail dado:

 mkdir /usr/local/etc/dovecot/conf.d/def touch /usr/local/etc/dovecot/conf.d/def/default.sieve chown -R vmail:vmail /usr/local/etc/dovecot/conf.d/def chmod -R 744 /usr/local/etc/dovecot/conf.d/def 

Coloque las líneas en este archivo:

 require "fileinto"; if header :contains "X-Spam-Flag" "YES" { fileinto "Junk"; } 

Configuraciones


En esta sección daré ejemplos de "configuraciones" con comentarios en ellas, dudo solo de la "configuración" de spamassassin, ya que no encontré las descripciones correctas en la red (dejé la "configuración" por defecto), por favor agregue en los comentarios la mejor forma de configurar spamassassin.

Postfix


En primer lugar, debe crear archivos para extraer usuarios, dominios, cuotas de la base de datos. Cree un directorio para almacenar los archivos de datos y los archivos necesarios:

 mkdir /usr/local/etc/postfix/mysql touch /usr/local/etc/postfix/mysql/relay_domains.cf touch /usr/local/etc/postfix/mysql/virtual_alias_maps.cf touch /usr/local/etc/postfix/mysql/virtual_alias_domain_maps.cf touch /usr/local/etc/postfix/mysql/virtual_mailbox_maps.cf 

El contenido de estos archivos será:
relay_domains.cf

 hosts = 127.0.0.1 user = postfix password = password123 dbname = postfix query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1' 

virtual_alias_maps.cf

 hosts = 127.0.0.1 user = postfix password = password123 dbname = postfix query = SELECT goto FROM alias WHERE address='%s' AND active ='1' 

virtual_alias_domain_maps.cf

 hosts = 127.0.0.1 user = postfix password = password123 dbname = postfix query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = '1' 

virtual_mailbox_maps.cf

 hosts = 127.0.0.1 user = postfix password = password123 dbname = postfix query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1' 

master.cf

 # postfix  ,    dovecot    dovecot unix - nn - - pipe flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/deliver -f ${sender} -d ${recipient} #  smtpd     sasl,    ,  spamassassin    smtp inet n - n - - smtpd -o content_filter=spamassassin -o smtpd_sasl_auth_enable=yes #  587     sasl submission inet n - n - - smtpd -o smtpd_sasl_auth_enable=yes #  smtp    SASL smtps inet n - n - - smtpd -o smtpd_sasl_auth_enable=yes -o smtpd_tls_wrappermode=yes # Spamassassin spamassassin unix - nn - - pipe flags=DROhu user=vmail:vmail argv=/usr/local/bin/spamc -f -e /usr/local/libexec/dovecot/deliver -f ${sender} -d ${user}@${nexthop} #628 inet n - n - - qmqpd pickup unix n - n 60 1 pickup cleanup unix n - n - 0 cleanup qmgr unix n - n 300 1 qmgr #qmgr unix n - n 300 1 oqmgr tlsmgr unix - - n 1000? 1 tlsmgr rewrite unix - - n - - trivial-rewrite bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce verify unix - - n - 1 verify flush unix n - n 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - n - - smtp relay unix - - n - - smtp -o syslog_name=postfix/$service_name # -o smtp_helo_timeout=5 -o smtp_connect_timeout=5 showq unix n - n - - showq error unix - - n - - error retry unix - - n - - error discard unix - - n - - discard local unix - nn - - local virtual unix - nn - - virtual lmtp unix - - n - - lmtp anvil unix - - n - 1 anvil scache unix - - n - 1 scache postlog unix-dgram n - n - 1 postlogd 

main.cf

 #       dovecot,       local_transport = dovecot #      ,  SMTP-      EHLO  SMTP  smtpd_discard_ehlo_keywords = CONNECT GET POST #            smtpd_delay_reject = yes #     smtpd_helo_required = yes #     ,   disable_vrfy_command = yes #       broken_sasl_auth_clients = yes #   smtpd_sasl_security_options = noanonymous noactive nodictionary smtp_sasl_security_options = noanonymous noactive nodictionary # dovecot  (  cyrus) smtpd_sasl_type = dovecot smtp_sasl_type = dovecot #    smtpd_sasl_path = private/auth #   local_recipient_maps = $virtual_mailbox_maps $virtual_alias_maps #   ,    smtpd_reject_unlisted_recipient = yes #   message_size_limit = 10485760 #     spamassassin spamassassin_destination_recipient_limit = 1 # milter_default_action = accept milter_protocol = 2 #   clamav smtpd_milters = unix:/var/run/clamav/clmilter.sock non_smtpd_milters = unix:/var/run/clamav/clmilter.sock #MYSQL relay_domains = mysql:/usr/local/etc/postfix/mysql/relay_domains.cf virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql/virtual_alias_maps.cf, mysql:/usr/local/etc/postfix/mysql/virtual_alias_domain_maps.cf virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql/virtual_mailbox_maps.cf # HELO smtpd_helo_restrictions = permit_sasl_authenticated, reject_non_fqdn_helo_hostname, reject_invalid_hostname #    smtpd_data_restrictions = permit_sasl_authenticated reject_unauth_pipelining, reject_multi_recipient_bounce #   smtpd_sender_restrictions = permit_sasl_authenticated reject_sender_login_mismatch,reject_unauthenticated_sender_login_mismatch, reject_non_fqdn_sender, reject_unknown_sender_domain #  (check_policy_service inet:127.0.0.1:10023  postgrey -      ) smtpd_recipient_restrictions = permit_sasl_authenticated reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_multi_recipient_bounce, reject_unknown_client_hostname, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023 #   virtual_mailbox_base = /var/vmail #uid  gid vmail virtual_minimum_uid = 1000 virtual_uid_maps = static:1000 virtual_gid_maps = static:1000 #   virtual_transport = devecot dovecot_destination_recipient_limit = 1 #  smtp_use_tls=yes smtp_tls_note_starttls_offer=yes # smtp_tls_security_level=encrypt       ssl,        ssl,    smtp_tls_security_level=may(    ssl,     ) smtp_tls_security_level=encrypt smtp_tls_session_cache_database=btree:$data_directory/smtp_tls_session_cache smtp_tls_CAfile=/etc/ssl/demoCA/cacert.pem smtp_tls_key_file=/etc/ssl/foo-key.pem smtp_tls_cert_file=/etc/ssl/foo-cert.pem smtp_tls_session_cache_timeout=3600s smtp_tls_protocols=!TLSv1.2 smtp_tls_loglevel=1 # smtpd_tls_security_level=encrypt       ssl,        ssl,    smtpd_tls_security_level=may(    ssl,     ) smtpd_tls_security_level=encrypt smtpd_use_tls=yes smtpd_tls_auth_only=yes smtpd_tls_loglevel=1 smtpd_tls_received_header=yes smtpd_tls_session_cache_timeout=3600s smtpd_tls_session_cache_database=btree:$data_directory/smtpd_tls_session_cache smtpd_tls_key_file=/etc/ssl/foo-key.pem smtpd_tls_cert_file=/etc/ssl/foo-cert.pem smtpd_tls_CAfile= /etc/ssl/demoCA/cacert.pem smtpd_tls_protocols=!TLSv1.2 #      tls_random_source=dev:/dev/urandom #  compatibility_level = 2 #   ,    ,      ,    soft_bounce = no #   UNIX       postfix mail_owner = postfix #     postfix(        ) myhostname = $mydomain #       mydomain = virusslayer.su myorigin = $myhostname #    inet_interfaces = all #        mydestination = $mydomain, localhost, localhost.$mydomain #   550         unknown_local_recipient_reject_code = 550 #    localhost mynetworks_style = host #       , -         mynetworks = #  ip inet_protocols = ipv4 #  (   ) alias_maps = hash:/etc/mail/aliases alias_database = dbm:/etc/mail/aliases.db #          smtpd_banner = $myhostname ESMTP $mail_name #       debug_peer_level = 2 #      (   ,    yandex.ru gmail.ru mail.ru  ..) debug_peer_list = 127.0.0.1 #   debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 #  sendmail sendmail_path = /usr/local/sbin/sendmail mailq_path = /usr/local/bin/mailq setgid_group = maildrop #    html_directory = /usr/local/share/doc/postfix manpage_directory = /usr/local/man sample_directory = /usr/local/etc/postfix readme_directory = /usr/local/share/doc/postfix meta_directory = /usr/local/libexec/postfix shlib_directory = /usr/local/lib/postfix queue_directory = /var/spool/postfix command_directory = /usr/local/sbin daemon_directory = /usr/local/libexec/postfix data_directory = /var/db/postfix 

Docot


dovecot.conf

 #     dovecot protocols = imap pop3 #    listen = *, :: #        mysql dict { quota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext } #   !include conf.d/*.conf !include_try local.conf 

dovecot-dict-sql.conf.ext

 connect = host=127.0.0.1 dbname=postfix user=postfix password=password123 map { pattern = priv/quota/storage table = quota2 username_field = username value_field = bytes } map { pattern = priv/quota/messages table = quota2 username_field = username value_field = messages } 

dovecot-sql.conf.ext

 #    MYSQL driver = mysql connect = host=127.0.0.1 dbname=postfix user=postfix password=password123 #     default_pass_scheme = MD5 #  ,    user_query = SELECT '/var/mail/%d/%n/' AS home, 'maildir:/var/vmail/%d/%n' AS mail, 1000 AS uid, 1000 AS gid, concat('*:bytes=',quota) as quota_rule FROM mailbox \ WHERE username ='%u' AND active = '1' password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 1000 as userdb_uid, \ 1000 as userdb_gid, concat('*:bytes=',quota) AS userdb_quota_rule FROM mailbox WHERE username ='%u' AND active ='1' 

10-auth.conf

 #   SSL disable_plaintext_auth = yes #   auth_realms = virusslayer.su auth_default_realm = virusslayer.su #    ( ,         ssl) auth_mechanisms = plain login #   ,  !include auth-sql.conf.ext,        mysql #!include auth-deny.conf.ext #!include auth-master.conf.ext #!include auth-system.conf.ext !include auth-sql.conf.ext #!include auth-ldap.conf.ext #!include auth-passwdfile.conf.ext #!include auth-checkpassword.conf.ext #!include auth-vpopmail.conf.ext #!include auth-static.conf.ext 

10-mail.conf

 #    mail_location = maildir:/var/vmail/%d/%n #       namespace inbox { inbox = yes } #uid  gid vmail mail_uid = 1000 mail_gid = 1000 # ,    quota mail_plugins = quota 

10-master.conf

 #     ssl service imap-login { inet_listener imap { port = 143 } inet_listener imaps { port = 993 ssl = yes } } service pop3-login { inet_listener pop3 { port = 110 } inet_listener pop3s { port = 995 ssl = yes } } service submission-login { inet_listener submission { port = 587 } } #           (   ,       ) service auth { unix_listener auth-userdb { mode = 0600 user = vmail group = vmail } # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } } #  vmail   service dict { unix_listener dict { mode = 0660 user = vmail group = vmail } } 

10-ssl.conf

 # ssl  (    sll  ) ssl = required #   ssl_cert = </etc/ssl/foo-cert.pem ssl_key = </etc/ssl/foo-key.pem ssl_ca = </etc/ssl/demoCA/cacert.pem #    ssl_min_protocol = TLSv1.2 

15-lda.conf

 quota_full_tempfail = no lda_mailbox_autosubscribe = yes protocol lda { #      sieve,        mail_plugins = $mail_plugins sieve quota } 

90-plugin.conf

 #             "",       chown -R vmail:vmail #          "" plugin { #setting_name = value sieve = /usr/local/etc/dovecot/conf.d/def/default.sieve } 

auth-sql.conf.ext

 #      MYSQL passdb { driver = sql # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext args = /usr/local/etc/dovecot/dovecot-sql.conf.ext } userdb { driver = sql args = /usr/local/etc/dovecot/dovecot-sql.conf.ext } 

Spamassassin


El "config" spamassassin se ve así, pero algo me dice que los datos no son suficientes, por favor ayuda con los datos "config":

local.cf

 rewrite_header Subject *****SPAM***** report_safe 0 required_score 5.0 use_bayes 1 bayes_auto_learn 1 ifplugin Mail::SpamAssassin::Plugin::Shortcircuit endif # Mail::SpamAssassin::Plugin::Shortcircuit 

También es necesario realizar capacitación sobre cartas con spam y sin él:

 sa-learn --spam /path/spam/folder sa-learn --ham /path/ham/folder 

Opcional


En esta sección, especificaré la configuración del firewall basada en pf, agregaré pf a la ejecución automática y especificaré el archivo con las reglas:

 sysrc pf_enable="YES" sysrc pf_rules="/etc/0.pf" 

Crea un archivo con las reglas:

 ee /etc/0.pf 

Y agrégale las reglas:

 # (   lo0)    ,     set skip on lo0 #      deovecot, postfix, root pass in quick proto { tcp, udp } from any to any port {53,25,465,587,110,143,993,995} user {dovecot,postfix,root} flags S/SA modulate state pass out quick proto { tcp, udp } from any to any port {53,25,465,587,110,143,993,995} user {dovecot,postfix,root} #      root pass out quick proto {tcp,udp} from any to any user root #     pass in quick proto tcp from any to any port 80 flags S/SA modulate state #SSH pass in quick proto tcp from any to any port 22 flags S/SA modulate state #     clamav  spamd pass out quick proto {tcp,udp} from any to any user {clamav,spamd} #DNS  ICMP pass out quick proto {tcp,udp} from any to any port=53 keep state pass out quick proto icmp from any to any block from any to any fragment block from any to any block all 

Puede ejecutar pf con el comando:

 service pf start 

Prueba


Para probar todas las conexiones posibles (STARTTLS, SLL), puede usar el cliente MyOffice Mail para dispositivos móviles (en mi caso para ios), en esta aplicación hay muchos parámetros para configurar conexiones al servidor de correo.

Para probar spaassasin utilizamos la firma GTUBE, agregue la línea en el mensaje:

 XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X 

Si todo es correcto, el mensaje se marcará con correo no deseado y, en consecuencia, se moverá a la carpeta de correo no deseado.

Para probar el antivirus, debe enviar un correo electrónico con un archivo de texto, en este archivo habrá una secuencia EICAR:

 X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* 

Naturalmente, las cartas deben enviarse desde buzones externos.
Para ver los registros en tiempo real, ejecute:

 tail -f /var/log/maillog 

Además, para probar correctamente el envío de correo a buzones externos (por ejemplo, yandex.ru, mail.ru, gmail.com, etc.), debe registrar la zona DNS inversa (registro PTR), puede hacerlo contactando a su proveedor (si ciertamente no tienes tu propio servidor DNS).

Conclusión


Por supuesto, puede parecer que el servidor de correo es una cosa bastante complicada, pero si lo averigua, no es para nada así, después de pasar un poco de tiempo en la configuración, puede obtener un servidor de correo bastante funcional, con protección contra correo no deseado y virus.

PD: si planea "copiar y pegar" con comentarios, debe agregar el usuario raíz (y los que lo necesitan) a los registros de la clase rusa:

 pw usermod root -L russian 

Después de estas acciones, los caracteres rusos se mostrarán correctamente.

Source: https://habr.com/ru/post/476148/


All Articles