postfix + dovecot + mysql no FreeBSD

1. Introdução


Eu queria estudar o servidor de email por um longo tempo, mas minhas mãos chegaram apenas agora e não consegui encontrar muitas informações corretas, então decidi escrever uma publicação o mais detalhada possível. Esta publicação discutirá não apenas postfix, dovecot, mysql, postfixadmin, mas também spamassassin, clamav-milter (uma versão especial do clamav para servidores de correio), postgrey, bem como a possibilidade de transferir spam para a pasta Spam (dovecot- buraco de pombo).

Preparação


Primeiro, instalaremos os pacotes que você precisa para trabalhar (o postfix, o dovecot e o dovecot-pigeonhole devem ser instalados a partir das portas, o dovecot-sieve pode ser instalado a partir dos pacotes; em princípio, existem versões mais recentes nas portas e, por esse motivo, pode haver incompatibilidade entre dovecot e dovecot- peneira). Instale os seguintes pacotes:

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

Após a instalação, colocaremos os serviços necessários na execução 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" 

Execute os serviços:

 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 

Não esqueça de adicionar no httpd.conf as linhas necessárias para o php funcionar no apache e para o postfixadmin funcionar corretamente:

 <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" 

Em seguida, vá para o diretório e faça o download do postfixadmin

 cd /usr/local/www/apache24/data 

Faça o download do postfixadmin (no momento da redação, a versão atual era 3.2)

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

Depois disso, você precisa descompactar o arquivo morto neste diretório e alterar o proprietário do diretório:

 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 

Em seguida, prepare o banco de dados para postfixadmin, execute o script mysql-secure-installation (a senha que você criar neste script precisará ser criada no mysql com o comando alter user), para a configuração inicial do mysql, digite mysql, crie o banco de dados e os direitos para ela:

 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 

Após a configuração do banco de dados, você precisa editar o arquivo config.inc.php; neste exemplo, este arquivo está no diretório /usr/local/www/apache24/data/postfixadmin-3.2/. Nesse arquivo, você precisa editar várias linhas e trazê-las para lembre-se, depois de alterar as configurações, reinicie o apache, você também precisará criar o diretório templates_c no diretório /usr/local/www/apache24/data/postfixadmin-3.2 e atribuir www owner a ele:

 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 gerar a chave, usaremos o método proposto no postfix.org. Com a criação de nossa própria autoridade de certificação, precisamos acessar o diretório / etc / ssl e executar o script:

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

Durante a execução do script, um nome para o certificado será solicitado, não digite nada, pressione Enter; o script solicitará que você crie uma senha para o certificado; em seguida, haverá perguntas padrão para a criação de um certificado.

Em seguida, você precisa criar uma chave secreta (sem senha) e um certificado de chave pública não assinado (Nome da Unidade Organizacional (por exemplo, seção) [] deve ser diferente do especificado no certificado criado acima):

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

Assinaremos o certificado de chave pública (especifique o número de dias quantos você precisar):

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

Deixe os certificados criados nesse diretório ou transfira-os para o diretório mais conveniente para você, o postfix “configs” e o dovecote serão configurados levando em consideração o fato de que os certificados estarão nesse diretório.

Usuário do Vmail


Antes de instalar o postfix, dovecot e dovecot-pigeonhole, criaremos um usuário e um grupo (um grupo será criado automaticamente) vmail, bem como o diretório em que o email será localizado.

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

Crie um diretório para correio e defina o proprietário do usuário do vmail:

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

Postfix, dovecot, dovecot-pigeonhole


Como escrevi anteriormente, reuniremos os dados do aplicativo a partir das portas, executaremos o comando para baixar e descompactar as portas:

 portsnap fetch extract 

Após descompactar as portas, vá para o diretório dovecot, configure a porta (observe o suporte ao mysql) e execute a compilação (BATCH = yes dirá ao make para não fazer perguntas durante a instalação):

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

Faça o mesmo com postfix e dovecot-pigeonhole

dovecot-pigeonhole:

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

postfix: verifique também o suporte ao mysql nas configurações da porta

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

Antes de iniciar o dovecot, copie as "configurações":

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

Após a instalação do postfix e dovecot, inicie os serviços:

 service postfix start service dovecot start 

Também é necessário criar um diretório no qual o módulo para envio de spam para a pasta spam será compilado; no meu caso, esse diretório está localizado na pasta /usr/local/etc/dovecot/conf.d, o nome do diretório é def, crie este diretório e um arquivo com código para compilação e defina o proprietário do diretório de usuário do vmail fornecido:

 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 as linhas neste arquivo:

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

Configs


Nesta seção, darei exemplos de "configs" com comentários, duvido apenas da "config" do spamassassin, pois não encontrei as descrições corretas na rede (deixei a "config" por padrão), por favor, adicione nos comentários a melhor forma de configurar o spamassassin.

Postfix


Primeiro de tudo, você precisa criar arquivos para extrair usuários, domínios e cotas do banco de dados. Crie um diretório para armazenar os arquivos de dados e os arquivos necessários:

 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 

O conteúdo desses arquivos 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


O spamassassin "config" se parece com isso, mas algo me diz que os dados não são suficientes, por favor ajude com os dados no "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 

Também é necessário realizar treinamento em cartas com spam e sem ele:

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

Opcional


Nesta seção, especificarei as configurações do firewall com base em pf, adicionarei pf à execução automática e especificará o arquivo com as regras:

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

Crie um arquivo com as regras:

 ee /etc/0.pf 

E adicione as regras a ele:

 # (   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 

Você pode executar o pf com o comando:

 service pf start 

Teste


Para testar todas as conexões possíveis (STARTTLS, SLL), você pode usar o cliente MyOffice Mail para dispositivos móveis (no meu caso para ios); neste aplicativo, existem muitos parâmetros para configurar conexões com o servidor de correio.

Para testar spaassasin, usamos a assinatura GTUBE, adicione a linha na mensagem:

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

Se tudo estiver correto, a mensagem será marcada com spam e movida para a pasta de spam.

Para testar o antivírus, você precisa enviar um email com um arquivo de texto, esse arquivo conterá a sequência EICAR:

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

Cartas naturalmente precisam ser enviadas de caixas de correio externas.
Para visualizar os logs em tempo real, execute:

 tail -f /var/log/maillog 

Além disso, para o teste correto de envio de email para caixas de correio externas (por exemplo, yandex.ru, mail.ru, gmail.com etc.), é necessário registrar a zona DNS reversa (registro PTR), você pode fazer isso entrando em contato com seu provedor (se você certamente não possui seu próprio servidor DNS).

Conclusão


É claro que pode parecer que o servidor de email é uma coisa bastante complicada, mas se você descobrir, não é nada disso, tendo passado um pouco de tempo na configuração, você poderá obter um servidor de email bastante funcional, com proteção contra spam e vírus.

PS Se você planeja “copiar e colar” com comentários, precisa adicionar o usuário root (e aqueles que precisam dele) aos logs de classe russos:

 pw usermod root -L russian 

Após essas ações, os caracteres russos serão exibidos corretamente.

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


All Articles