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.