Como montar um servidor de e-mail com Postfix, Dovecot, PostfixAdmin, SpamAssassin, Amavis, Clamav, RoundCube, SPF, DKIM, DMARC, Fail2Ban

Neste tutorial vou ensinar como configurar um servidor de e-mail com domínios virtuais com integração dos usuários/domínios no banco de dados MariaDB/MySQL. Nele vamos ter filtros entre varias otimizações.

Postfix Postfix é um agente de transferência de e-mails livre e de código aberto que encaminha e entrega e-mails, e tem como objetivo ser uma alternativa segura ao Sendmail.
Dovecot é um servidor de IMAP e POP3 open source para sistemas Linux e UNIX, escrito primariamente com segurança em mente.
Postfixadmin Interface web para o gerenciamento de contas de e-mails e domínios.
Spamassassin é um programa de computador licenciado através da licença Apache e utilizado como filtro de spam enviado através de mensagem eletrônica. O filtro SpamAssassin funciona dando uma pontuação a cada mensagem que entra, baseado em diferentes “testes” que faz analisando todo o conteúdo da mensagem.
Clamav é um antivírus open source gratuito feito especialmente para Linux, mas que conta também com uma versão gratuita para Windows e outra paga para Mac OS.
Amavis é um filtro de conteúdo de código aberto para correio eletrônico, implementando transferência de mensagens, decodificação, algum processamento e verificação e interface com filtros de conteúdo externos para fornecer proteção contra spam, vírus e outros malwares.
RoundCube é um cliente de email IMAP baseado na Web (Webmail).
SPF (Sender Policy Framework) é um sistema que identifica para os servidores de email quais hosts têm permissão para enviar email para um determinado domínio. A configuração do SPF ajuda a impedir que seu email seja classificado como spam.
DKIM (DomainKeys Identified Mail) é um sistema que permite que seus servidores de email oficiais adicionem uma assinatura aos cabeçalhos dos emails de saída e identifique a chave pública do seu domínio para que outros servidores de email possam verificar a assinatura. Assim como no SPF, o DKIM ajuda a impedir que seu email seja considerado spam. Também permite que os servidores de correio detectem quando o seu correio foi adulterado em trânsito.
DMARC (Autenticação, Relatório e Conformidade de Mensagens de Domínio) permite anunciar aos servidores de email quais são as políticas do seu domínio em relação a emails que falham nas validações SPF e / ou DKIM. Além disso, permite solicitar relatórios de mensagens com falha dos servidores de email.
Fail2Ban é uma estrutura de software de prevenção de intrusões que protege os servidores de computadores contra ataques de força bruta.

REQUISITOS

0 – Saber que esse procedimento exige conhecimento 🙂
1 – Ter configurado DNS Autoritativo e Reverso sobre seus IPS.
2 – Debian 10 Buster instalação limpa
3 – Não ter seu endereço IP listado em backlist.

Você pode verificar se seu IP está em uma blacklist nos sites:
https://mxtoolbox.com/blacklists.aspx
http://www.anti-abuse.org/multi-rbl-check-results/
https://viewdns.info/spamdblookup/

AJUSTES

IP ex. do servidor: 45.80.50.6 / 2804:f123:bebe:cafe::6
Sendo que o reverso deste ips apontam para mail.remontti.com.br
Entradas MX, TXT e SPF configuradas.
Ex autoritativo:

$TTL 86400      ; 1 day
remontti.net.br        IN SOA  ns1.remontti.net.br. hostmaster.remontti.net.br. (
                            2019071900 ; serial
                            10800      ; refresh (3 hours)
                            3600       ; retry (1 hour)
                            2419200    ; expire (4 weeks)
                            300        ; minimum (5 minutes)
                            )

                        NS      ns1.remontti.net.br.
                        NS      ns2.remontti.net.br.

                        A       45.80.50.4
                        AAAA    2804:f123:bebe:cafe::4
                        MX      10 mail.remontti.net.br.
                        TXT     "v=spf1 a mx -all"
                        SPF     "v=spf1 a mx -all"
$ORIGIN remontti.net.br.
$TTL 10800      ; 3 hours

45-80-50-0                      A       45.80.50.0
router-gw                       A       45.80.50.1
                                AAAA    2804:f123:bebe:cafe::1

ns1                             A       45.80.50.2
                                AAAA    2804:f123:bebe:cafe::2
hostmaster                      A       45.80.50.2
                                AAAA    2804:f123:bebe:cafe::2
ns2                             A       45.80.50.3
                                AAAA    2804:f123:bebe:cafe::3

www                             A       45.80.50.4
                                AAAA    2804:f123:bebe:cafe::4
ftp                             A       45.80.50.4
                                AAAA    2804:f123:bebe:cafe::4

zabbix                          A       45.80.50.5
                                AAAA    2804:f123:bebe:cafe::5
phpipam                         A       45.80.50.5
                                AAAA    2804:f123:bebe:cafe::5

mail                            A       45.80.50.6
                                AAAA    2804:f123:bebe:cafe::6
imap                            A       45.80.50.6
                                AAAA    2804:f123:bebe:cafe::6
pop                             A       45.80.50.6
                                AAAA    2804:f123:bebe:cafe::6
smtp                            A       45.80.50.6
                                AAAA    2804:f123:bebe:cafe::6

Ex reverso:

$ORIGIN .
$TTL 86400      ; 1 day
50.80.45.in-addr.arpa IN SOA ns1.remontti.net.br. hostmaster.remontti.net.br. (
                    2019071900 ; serial
                    10800      ; refresh (3 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
                NS      ns1.remontti.net.br.
                NS      ns2.remontti.net.br.
 
$ORIGIN 50.80.45.in-addr.arpa.
0         PTR     45.80.50.0.remontti.net.br.
1         PTR     cpd.remontti.net.br.
2         PTR     ns1.remontti.net.br.
3         PTR     ns2.remontti.net.br.
4         PTR     www.remontti.net.br.
5         PTR     zabbix.remontti.net.br.
6         PTR     mail.remontti.net.br.
 
; ....

Ajuste o nome do servidor alterando alguns parâmetros do sistema.

# vim /etc/hosts
[...]
127.0.0.1         localhost
250.250.250.6     mail.remontti.com.br    mail
[...]
# vim /etc/hostname
mail

Configure sua interface de rede. Vou deixar um modelo, onde o bloco de IPv4 é um /28 (255.255.255.240) e um /64 para IPv6.

# vim /etc/network/interfaces
allow-hotplug enp0s3
iface enp0s3 inet static
        address 45.80.50.6/28
        gateway 45.80.50.1
        dns-nameservers 45.80.50.2
        dns-search remontti.com.br

iface enp0s3 inet6 static
        pre-up modprobe ipv6
        address 2804:f123:bebe:cafe::6
        netmask 64
        gateway 2804:f123:bebe:cafe::1

Reinicie seu servidor

 # reboot

APACHE2, MARIADB E PHP7

# su -
# apt update; apt upgrade
# apt install apache2 apache2-utils mariadb-server mariadb-client curl\
  libapache2-mod-php php php-mysql php-cli php-pear php-gmp php-gd php-bcmath\
  php-mbstring php-curl php-xml php-zip php-imap php-intl php-ldap php-imagick wget

Vamos habilitar o mod_rewrite.

# a2enmod rewrite

A página que vimos ao abri o ip do nosso servidor no navegador fica no diretório /var/www/html, isso está sendo informado no arquivo default do apache que fica em /etc/apache2/sites-enabled/000-default.conf, e para que nosso mod_rewrite funcione corretamente será necessário adicionar alguma linhas.

# vim /etc/apache2/sites-enabled/000-default.conf

Adicione abaixo de “DocumentRoot /var/www/html” o seguinte:

	<Directory /var/www/html/>
    		Options FollowSymLinks
    		AllowOverride All
	</Directory>

Por segurança recomendo remover a assinatura do servidor, para isso edite:

# sed -i 's/ServerTokens OS/ServerTokens Prod/' /etc/apache2/conf-available/security.conf
# sed -i 's/ServerSignature On/ServerSignature Off/' /etc/apache2/conf-available/security.conf

Agora precisamos restartar o apache2 para que tenha efeito as alterações.

# systemctl restart apache2

http://[SERVER_IP]/

phpMyAdmin `** Opcional **`

Cade ele do repositório?
O PHPMyAdmin não está mais disponível como pacote .deb no Debian 10. Fazendo um pesquisa o motivo é que o “pessoal” que faz empacotamento não tem uma versão estável. https://security-tracker.debian.org/tracker/CVE-2018-19968

Desta forma debian “obriga” com que o usuário instale-o a partir da fonte. https://www.phpmyadmin.net/downloads/

phpMyAdmin 4.9.2 (25/11/2019)

# cd /tmp/
# wget https://files.phpmyadmin.net/phpMyAdmin/4.9.2/phpMyAdmin-4.9.2-all-languages.tar.gz
# tar -vxzf phpMyAdmin-4.9.2-all-languages.tar.gz -C /usr/share/
# mv /usr/share/phpMyAdmin-4.9.2-all-languages /usr/share/phpmyadmin
# mkdir /etc/phpmyadmin
# touch /etc/phpmyadmin/htpasswd.setup
# mkdir -p /var/lib/phpmyadmin/tmp
# chown -R www-data:www-data /var/lib/phpmyadmin

Criaremos o arquivo de configuração do Apache.

# vim /etc/apache2/conf-available/phpmyadmin.conf
# phpMyAdmin default Apache configuration

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
 Options FollowSymLinks
 DirectoryIndex index.php

 <IfModule mod_php7.c>
 AddType application/x-httpd-php .php

 php_flag magic_quotes_gpc Off
 php_flag track_vars On
 php_flag register_globals Off
 php_value include_path .
 </IfModule>

</Directory>

# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
 <IfModule mod_authn_file.c>
 AuthType Basic
 AuthName "phpMyAdmin Setup"
 AuthUserFile /etc/phpmyadmin/htpasswd.setup
 </IfModule>
 Require valid-user
</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/libraries>
 Order Deny,Allow
 Deny from All
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
 Order Deny,Allow
 Deny from All
</Directory>

Ative a configuração e reinicie o Apache.

# a2enconf phpmyadmin
# systemctl restart apache2
# systemctl status apache2

Na próxima etapa, vamos configurar o armazenamento de configuração do phpMyadmin (banco de dados).
Faça o login no MariaDB como usuário root:

# mariadb

Criamos um novo banco de dados para o chamado phpmyadmin e um usuario pma (altere para sua senha). Em seguida, concedemos as permissões do banco de dados.
Você pode gerar uma senha acessando https://senhasegura.remontti.com.br/

CREATE DATABASE phpmyadmin;
CREATE USER 'pma'@'localhost' IDENTIFIED BY 'SUA_SENHA';
GRANT ALL PRIVILEGES ON phpmyadmin.* TO 'pma'@'localhost' IDENTIFIED BY 'SUA_SENHA' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

Carregue as tabelas do banco de dados: (Informe a senha do root do MariaDB)

# mariadb phpmyadmin < /usr/share/phpmyadmin/sql/create_tables.sql

Agora é necessário ajustar o arquivo de configuração do phpmyadmin.
Definir:
* senha segura (blowfish secret) que deve ter 32 caracteres. Não use o meu exemplo blowfish secreto, defina o seu próprio! Use o gerador https://senhasegura.remontti.com.br
* diretório que o PHPMyAdmin deve usar para armazenar arquivos temporários.
* Descomentar as linhas $cfg['Servers']
- controlhost : localhost
- controlpass : SUA_SENHA

# cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php
# vim /usr/share/phpmyadmin/config.inc.php
$cfg['blowfish_secret'] = 'dkJhGx83XR3JjuFrDn8kPp9NtXnkLptl';
/* Adicione esta linha */
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

/* User used to manipulate with storage */
$cfg['Servers'][$i]['controlhost'] = 'localhost';
$cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'SUA_SENHA';

/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';

http://[SERVER_IP]/phpmyadmin/

POSTFIX / DOVECOTE / DKIM / SPF

O Postfix é um agente de transferência de emails (MTA = Message Transfer Agent), um software livre para envio e entrega de emails. Rápido e fácil de administrar, muito utilizado em servidores UNIX.
Algumas vantagens:
- Suporte a Ipv6
- Suporte a MIME
- Autenticação SASL
- Canal seguro utilizando TLS
- Suporte a banco de dados(MySQL,PostgreSQL,LDAP,entre outros)
- Verificação a listas RBL
- Extenso suporte a filtros
- Suporte a expressão-regular
- Verificação de cabeçalho
- Verificação no corpo da mensagem
- Suporte a Greylisting e SPF através de plugins.

Dovecot é um servidor de IMAP e POP3 open source para sistemas Linux e UNIX, escrito primariamente com segurança em mente, tem o objetivo primário de ser um servidor de email leve, rápido e de fácil configuração. Dovecot suporta mbox, Maildir e seu próprio formato nativo de alta performance, Dbox. É 100% compatível com clientes de emails acessando as caixas de correio diretamente. Também inclui um agente de entrega de emails com suporte opcional a filtros Sieve, o que acho muito legal!

Vamos a instalação:

# apt install postfix postfix-mysql dovecot-core dovecot-mysql dovecot-imapd\
  dovecot-pop3d dovecot-lmtpd dovecot-sieve dovecot-managesieved openssl\
  opendkim opendkim-tools postfix-policyd-spf-python postfix-pcre

Responda:
Site da Internet

Se seu DNS reverso estiver ok ele virá já com o domínio reverso de seu IP, mas isso não é necessariamente ser o nome do ip rever, mas eu recomendo que tenha confurado o reverso para o seu servidor de e-mail.
mail.remontti.com.br

Verifique o arquivo /etc/mailname e sertifique-se que seja seu domínio.

# vim /etc/mailname
mail.remontti.com.br

Adicione um e-mail para seu usuário root do Linux

# vim /etc/aliases
root: postmaster@remontti.com.br
# newaliases

POSTFIXADMIN

PostfixAdmin gerenciará os domínios e e-mail.

# apt install postfixadmin

Ajuste o tipo do banco para mysqli

# vim /etc/postfixadmin/dbconfig.inc.php
$dbtype='mysqli'

Defina o tipo de criptografia para as senhas salvas no BD e o idioma.

# vim /etc/postfixadmin/config.inc.php 

Procure pelas seguintes linhas e altere conforme a baixo.

$CONF['encrypt'] = 'md5';
$CONF['default_language'] = 'pt-br';

Como existe varias alterações "change-this-to-your.domain.tld" vou usar o comando sed para alterar todas de uma única vez. Não esqueça de substituir pelo seu dominio.

# sed -i 's/change-this-to-your.domain.tld/remontti.com.br/' /etc/postfixadmin/config.inc.php

Mais alguns ajustes

# cp /etc/postfixadmin/config.inc.php  /usr/share/postfixadmin/config.local.php
# mkdir /usr/share/postfixadmin/templates_c/
# chown -R www-data. /usr/share/postfixadmin/templates_c/

Acesse:
http://SEU-DOMINO/postfixadmin/public/setup.php

No primeiro acesso suas tabelas já serão criadas no seu bd, você deve ter todas as dependências OK.

Bem no final temos: Change setup password
Preencha os campos Setup password com uma senha e repita (Essa senha será necessária pra criar administradores do PostfixAdmin) e clique em Generate password hash

Voce vai receber uma mensagem parecida com essa:
If you want to use the password you entered as setup password, edit config.inc.php or config.local.php and set
$CONF['setup_password'] = 'ca06e6cd4df066ac8e7999616a773b00:51508f16ca5ef631a5ed23ccc44160d934375ec5';

screenshot_20161017_134710

Esta senha criptografada, será necessários informar no arquivo config.inc.php antes de prosseguir. Então vamos a edição.

# vim /etc/postfixadmin/config.inc.php

Localize:

$CONF['setup_password'] = 'changeme';

Altere para:

$CONF['setup_password'] = 'ca06e6cd4df066ac8e7999616a773b00:51508f16ca5ef631a5ed23ccc44160d934375ec5';

Salve se arquivo e volte para seu navegador. Em Create superadmin account vamos criar nosso usuário administrador do PostfixAdmin.

Nos campos:
Setup password = Informe a senha q você gerou no passo anterior.
Administrador: = um endereço email que será o seu login (postmaster@remontti.com.br)
screenshot_20161017_134743
Clique em Criar administrador

Deve retornar a mensagem:

	Administrador criado! (postmaster@remontti.com.br)
	You are done with your basic setup.

	You can now login to PostfixAdmin using the account you just created.

Acesse: http://SEU-DOMINO//postfixadmin/public/

Já é possível acessa-lo com nosso usuários administrador, e adicionar seus domínios e contas de e-mails.
Domínios => Criar Domínio
Virtual => Criar conta de Email

Dando continuidade criaremos nosso usuários vmail que será o "cara" responsável pelo trabalho.

# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /var/vmail
# mkdir /var/vmail
# chown vmail:vmail /var/vmail

Edite o arquivo /etc/postfix/main.cf

# cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
# vim /etc/postfix/main.cf

Altere e adicione como descrito abaixo.

#--------ALTERE--------#
smtpd_banner = $myhostname
myorigin = $myhostname
mydestination = localhost
#--------COMENTE--------#
#relayhost =
#mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
#mailbox_size_limit = 0
#--------ADD AO FINAL--------#
# Authentification
smtpd_sasl_type=dovecot
smtpd_sasl_path=private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql_sender_login_maps.cf
broken_sasl_auth_clients = yes
# Virtual mailboxes
local_transport = virtual
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /var/vmail/
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 104
virtual_transport = dovecot
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
dovecot_destination_recipient_limit = 1
spamassassin_destination_recipient_limit = 1
###### EXTRAS COMENTADO #######
# Tamanho maximo do anexo (21 MB)
# No webmail php deve permitir upar esse tamanho
message_size_limit = 22020096
# Um pouco mais de  protecao contra spam
disable_vrfy_command = yes
# A RFC 821 basicamente exige que os enderecos sejam envelopados ou contidos por <>.
# Seguir esta regra faz com que se use essa notacao na sessao SMTP. Isso ajuda a barrar alguns Mailers.
strict_rfc821_envelopes = yes
# Caixa postal inexistente devolver aosender o erro 500,
# desta forma daqui alguns minutos voce nao precisara processar novamente o mesmo spam.
unknown_local_recipient_reject_code = 500
# E rejeitar com erro 554 enderecos desconhecidos
unknown_address_reject_code = 554
# Tambem com o erro 554 podemos rejeitar as conexoes que venham de hostnames desconhecidos
unknown_hostname_reject_code = 554
# Os cliente desconhecidos tambem rejeitaremos com o mesmo erro
unknown_client_reject_code = 554
# Vamos definir que o servidores remotos podem fazer no maximo 10
# conexõsimultaneas (e um valor que trabalho, editem conforme a necessidade).
# Um spammer faz mais de 20
smtp_destination_recipient_limit = 10
# Vamos definir que a conexao so pode cometer 3 erros de codigos 500
# (erros definitivos), apos isto sera desconectado
smtpd_hard_error_limit = 3
# Para erros de codigo 400 (erros temporarios), podemos desconecta-los na primeira
smtpd_soft_error_limit = 1
# Bom, claro que o spammer tambem pode ser desconectado e depois se reconectar,
# entao vamos nos prevenir destes espertinhos definindo quantas conexoes ele pode fazer por minuto.
smtpd_client_connection_count_limit = 10
# Nestas conexoes vamos limitar quantas mensagens ele pode mandar por minuto,
# no meu caso uso 25. Se algum usuario seu reclamar deste limite,
# classifique-o como ninja ou na pior hipotese, um mail maniaco.
smtpd_client_message_rate_limit = 25
# Deixar um spammer maluco e faze-lo perder tempo. Dificilmente um servidor conectado
# ao seu servidor vai cometer erros, os spammer cometem muitos erros, pois eles ficam tentando.
# Para irrita-los e quem sabe um dia desistirem de mim, eu travo eles dentro do meu servidor a cada erro.
# No meu caso, a cada erro eu os travo por 20 segundos. Ate que diminuiu o numero de spammers no meu servidor,
# devo estar na blacklist deles.rs
smtpd_error_sleep_time = 20
# Para este tipo de problema, os spammers podem resetar os erros deles.
# Para evitar que eles facam isto e sejam desconetados, podemos dizer se eles podem ou nao fazer isto.
# Como colher de cha, vamos deixar fazer isto apenas uma vez (ate porque servidores as vezes usam este comando).
# Permitir a maquina remota dar o comando RSET apenas 1 vez.
smtpd_junk_command_limit = 1
# Defina tambem o numero maximo de destinatarios em uma unica mensagem.
# Utilize o numero que melhor lhe convir, entreviste pessoas chaves se necessarios.
smtpd_recipient_limit = 50
# Os spammers nao se preocupam muito com isto,
# entao uma otima pratica para bloquear spams eh
# tornar a identificacao por HELO/EHLO obrigatoria.
smtpd_helo_required = yes
# Um pouco mais sobre o HELO/EHLO eh definir um tempo
# limite para o servidor fazer a identificacao, um
# servidor serio nao tem porque ficar enrolando.
# Vai diminuindo o tempo e observando os resultados.
# Vamos comecar com 60 segundos
smtp_helo_timeout = 60s
smtpd_client_restrictions =     permit_mynetworks,
permit_sasl_authenticated,
check_recipient_access hash:/etc/postfix/white-black-list,
check_client_access hash:/etc/postfix/white-black-list,
reject_unknown_client_hostname,
reject_unknown_reverse_client_hostname,
sleep 1,
reject_unauth_pipelining
smtpd_helo_restrictions =       permit_mynetworks,
permit_sasl_authenticated,
check_recipient_access hash:/etc/postfix/white-black-list,
check_client_access hash:/etc/postfix/white-black-list,
check_helo_access hash:/etc/postfix/white-black-list,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
reject_unknown_helo_hostname,
reject_unauth_pipelining
smtpd_sender_restrictions =     reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_unlisted_sender,
reject_authenticated_sender_login_mismatch,
permit_sasl_authenticated,
reject_sender_login_mismatch,
warn_if_reject,
permit_mynetworks
smtpd_recipient_restrictions =  check_sender_access hash:/etc/postfix/white-black-list,
check_helo_access hash:/etc/postfix/white-black-list,
check_recipient_access hash:/etc/postfix/white-black-list,
check_client_access hash:/etc/postfix/white-black-list,
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
check_policy_service unix:private/policyd-spf,
reject_unknown_reverse_client_hostname,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
reject_rbl_client access.redhawk.org, 
reject_rbl_client all.spamrats.com, 
reject_rbl_client b.barracudacentral.org, 
reject_rbl_client bl.spamcop.net, 
reject_rbl_client blackholes.mail-abuse.org, 
reject_rbl_client bogons.cymru.com, 
reject_rbl_client cbl.abuseat.org, 
reject_rbl_client cblless.anti-spam.org.cn, 
reject_rbl_client csi.cloudmark.com, 
reject_rbl_client db.wpbl.info, 
reject_rbl_client dnsbl.dronebl.org, 
reject_rbl_client dnsbl.inps.de, 
reject_rbl_client dnsbl.sorbs.net, 
reject_rbl_client drone.abuse.ch, 
reject_rbl_client dsn.rfc-ignorant.org, 
reject_rbl_client httpbl.abuse.ch, 
reject_rbl_client ix.dnsbl.manitu.net, 
reject_rbl_client korea.services.net, 
reject_rbl_client multi.surbl.org, 
reject_rbl_client netblock.pedantic.org, 
reject_rbl_client opm.tornevall.org, 
reject_rbl_client pbl.spamhaus.org, 
reject_rbl_client psbl.surriel.com, 
reject_rbl_client query.senderbase.org, 
reject_rbl_client rbl.efnetrbl.org, 
reject_rbl_client rbl.interserver.net, 
reject_rbl_client rbl.rbldns.ru, 
reject_rbl_client rbl.spamlab.com, 
reject_rbl_client rbl.suresupport.com, 
reject_rbl_client rbl-plus.mail-abuse.org, 
reject_rbl_client relays.mail-abuse.org, 
reject_rbl_client sbl.spamhaus.org, 
reject_rbl_client spamguard.leadmon.net, 
reject_rbl_client spamrbl.imp.ch, 
reject_rbl_client tor.dan.me.uk, 
reject_rbl_client ubl.unsubscore.com, 
reject_rbl_client virbl.bit.nl, 
reject_rbl_client wormrbl.imp.ch, 
reject_rbl_client zen.spamhaus.org, 
reject_rbl_client dnsbl-1.uceprotect.net, 
reject_rhsbl_sender dbl.spamhaus.org, 
reject_rhsbl_helo dbl.spamhaus.org, 
reject_rhsbl_client dbl.spamhaus.org, 
reject_rhsbl_helo black.uribl.com,
reject_rhsbl_sender black.uribl.com,
reject_rhsbl_client black.uribl.com,
reject_rhsbl_helo multi.surbl.org,
reject_rhsbl_sender multi.surbl.org,
reject_rhsbl_client multi.surbl.org,
reject_rhsbl_helo multi.uribl.com,
reject_rhsbl_sender multi.uribl.com,
reject_rhsbl_client multi.uribl.com,
permit

RBL/RHSBL: Caso não queira utilizar alguma das rbl/sbl ou utilizar outras sinta-se a vontade.

Aproveitamos já iremos criar uma lista Negra / Branca, crie um arquivo chamado white-black-list

# vim /etc/postfix/white-black-list

Nele adicione os dominos/emails com OK que você confia e REJECT para os que deseja descartar, ex.:

remontti.com.br OK
gmail.com OK
spamerdoinferno.com.br REJECT
propagandadocapeta.com.br REJECT

Agora você precisa executar o comando postmap no seu arquivo white-black-list ele irá gerar um novo arquivo white-black-list.db

# postmap /etc/postfix/white-black-list

Mais informações você encontra em:
http://www.postfix.org/VIRTUAL_README.html#virtual_mailbox

Precisamos criar 4 arquivos que farão a conexão com o BD, pra facilitar criamos nossa variável MINHASENHA

Vamos criar uma variável com o valor da senha que foi informada na instalação do postfixadmin, assim ira facilitar.

# MINHASENHA='sua-senha-do-usuario-postfixadmin-do-mysql'

Não use $ ou # em sua senha

mysql_virtual_alias_maps.cf

# echo "
hosts = localhost
user = postfixadmin
password = $MINHASENHA
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
" >> /etc/postfix/mysql_virtual_alias_maps.cf

mysql_virtual_mailbox_maps.cf

# echo "
hosts = localhost
user = postfixadmin
password = $MINHASENHA
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
" >> /etc/postfix/mysql_virtual_mailbox_maps.cf

mysql_sender_login_maps.cf

# echo "
hosts = localhost
user = postfixadmin
password = $MINHASENHA
dbname = postfixadmin
query = SELECT username AS allowedUser FROM mailbox WHERE username='%s' AND active = 1 UNION SELECT goto FROM alias WHERE address='%s' AND active = '1'
" >> /etc/postfix/mysql_sender_login_maps.cf

mysql_virtual_domains_maps.cf

# echo "
hosts = localhost
user = postfixadmin
password = $MINHASENHA
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
" >> /etc/postfix/mysql_virtual_domains_maps.cf

Acesse o diretório de instalação e verifique se os arquivos com as iniciais mysql_* foram criados. Depois altere as permissões e grupos.

# cd /etc/postfix
# ls -lh mysql_*
# chmod o-rwx,g+r mysql_*
# chgrp postfix mysql_*

Vamos as alterações no master.cf.

Faça um backup do arquivo original antes e adicione no final:

# cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
# vim /etc/postfix/master.cf

Adicione ao final:

# Dovecot
dovecot   unix  -       n       n       -       -       pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Localize as seguintes linhas e descomente-as:

submission inet n       -       -       -       -       smtpd
-o syslog_name=postfix/submission
-o smtpd_sasl_auth_enable=yes
smtps     inet  n       -       -       -       -       smtpd
-o smtpd_tls_wrappermode=yes

Descomente e altere os valores de smtpd_client_restrictions, os originais são diferentes. (veja na imagem abaixo como fica)

  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
[...]
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

screenshot_20161017_143502

Configurando o Dovecot

Vou usar o comando sed para fazer as alterações necessárias em vez de ficarmos abrindo arquivo e editando.

# cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
# sed -i -e 's/#listen/listen/' /etc/dovecot/dovecot.conf
# cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
# sed -i -e 's/#driver =/driver = mysql/' /etc/dovecot/dovecot-sql.conf.ext

Adicionamos ao final do arquivo /etc/dovecot/dovecot.conf mais algumas conf:

# echo " " >> /etc/dovecot/dovecot.conf
# echo "service stats {" >> /etc/dovecot/dovecot.conf
# echo "    unix_listener stats-reader {" >> /etc/dovecot/dovecot.conf
# echo "        user = vmail" >> /etc/dovecot/dovecot.conf
# echo "        group = vmail" >> /etc/dovecot/dovecot.conf
# echo "        mode = 0660" >> /etc/dovecot/dovecot.conf
# echo "    }" >> /etc/dovecot/dovecot.conf
# echo " " >> /etc/dovecot/dovecot.conf
# echo "    unix_listener stats-writer {" >> /etc/dovecot/dovecot.conf
# echo "        user = vmail" >> /etc/dovecot/dovecot.conf
# echo "        group = vmail" >> /etc/dovecot/dovecot.conf
# echo "        mode = 0660" >> /etc/dovecot/dovecot.conf
# echo "    }" >> /etc/dovecot/dovecot.conf
# echo "}" >> /etc/dovecot/dovecot.conf

Certifique-se que sua senha do postfixadmin ainda esta salva na variável $MINHASENHA.

# echo $MINHASENHA
# sed -i -e "s/#connect =/connect = host=localhost dbname=postfixadmin user=postfixadmin password=$MINHASENHA/" /etc/dovecot/dovecot-sql.conf.ext
# sed -i -e 's/#default_pass_scheme/default_pass_scheme/' /etc/dovecot/dovecot-sql.conf.ext

Vamos inserir algumas linhas ao final de dovecot-sql.conf.ext.

# echo "" >> /etc/dovecot/dovecot-sql.conf.ext
# echo "user_query = SELECT concat('/var/vmail/', maildir) as home, concat('maildir:/var/vmail/', maildir) as mail, 5000 AS uid, 5000 AS gid, concat('*:bytes=', (quota)) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1';" >> /etc/dovecot/dovecot-sql.conf.ext
# echo "" >> /etc/dovecot/dovecot-sql.conf.ext
# echo "password_query = SELECT username as user, password, concat('/var/vmail/', maildir) as userdb_home, concat('maildir:/var/vmail/', maildir) as userdb_mail, 5000 as userdb_uid, 5000 as userdb_gid, concat('*:bytes=', (quota)) AS userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = '1';" >> /etc/dovecot/dovecot-sql.conf.ext

Alterações dos arquivos 10-auth.conf / 10-logging.conf / 10-ssl.conf

# cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
# sed -i -e 's/#disable_plaintext_auth = yes/disable_plaintext_auth = no/' /etc/dovecot/conf.d/10-auth.conf
# sed -i -e 's/auth_mechanisms = plain/auth_mechanisms = plain login/' /etc/dovecot/conf.d/10-auth.conf
# sed -i -e 's/!include auth-system.conf.ext/#!include auth-system.conf.ext/' /etc/dovecot/conf.d/10-auth.conf
# sed -i -e 's/#!include auth-sql.conf.ext/!include auth-sql.conf.ext/' /etc/dovecot/conf.d/10-auth.conf
# cp /etc/dovecot/conf.d/10-logging.conf /etc/dovecot/conf.d/10-logging.conf.orig
# sed -i -e 's/#log_path/log_path/' /etc/dovecot/conf.d/10-logging.conf
# sed -i -e 's/#log_timestamp = "%b %d %H:%M:%S "/log_timestamp = "%Y-%m-%d %H:%M:%S "/' /etc/dovecot/conf.d/10-logging.conf

Em 10-master.conf ficou complicado fazer alteração com sed então vamos no braço.

# cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
# vim /etc/dovecot/conf.d/10-master.conf

em :service auth {
COMENTE tudo de unix_listener auth-userdb

service auth {
#  unix_listener auth-userdb {
#    #mode = 0666
#    #user = 
#    #group = 
#  }
# Descomente
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
}
# Adicione
unix_listener auth-master {
mode = 0666
}
# Descomente
# Auth process is run as this user.
user = $default_internal_user
}

Vamos criar um filtro para que todas as mensagens marcada com spam sejam movida para o diretórios SPAM.

# mkdir /var/lib/dovecot/sieve/
# cp /etc/dovecot/conf.d/90-sieve.conf /etc/dovecot/conf.d/90-sieve.conf.orig
# sed -i -e 's/sieve = file:~\/sieve;active=~\/.dovecot.sieve/sieve = ~\/dovecot.sieve/' /etc/dovecot/conf.d/90-sieve.conf
# sed -i -e 's/#sieve_default =/sieve_default =/' /etc/dovecot/conf.d/90-sieve.conf
# echo 'require ["fileinto"];' >> /var/lib/dovecot/sieve/default.sieve
# echo '# rule:[Spam]' >> /var/lib/dovecot/sieve/default.sieve
# echo 'if header :contains "X-Spam-Flag" "YES" {' >> /var/lib/dovecot/sieve/default.sieve
# echo '        fileinto "Junk";' >> /var/lib/dovecot/sieve/default.sieve
# echo '}' >> /var/lib/dovecot/sieve/default.sieve
# sievec /var/lib/dovecot/sieve/default.sieve
# chown -R vmail:vmail /var/lib/dovecot
# cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
# sed -i -e 's/mail_location = mbox:~\/mail:INBOX=\/var\/mail\/%u/mail_location = mbox:~\/mail:INBOX=\/var\/vmail\/%u/' /etc/dovecot/conf.d/10-mail.conf

!Exatamente nessa ordem!

# sed -i -e 's/inbox = yes/inbox = yes\n  /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n    } /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n      special_use = \Junk /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n      auto = subscribe /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n    mailbox Junk { /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n    } /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n      special_use = \Sent /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n      auto = subscribe /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n    mailbox Sent { /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n    } /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n      special_use = \Drafts /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n      auto = subscribe /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n    mailbox Drafts { /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n    } /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n      special_use = \Trash /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n      auto = subscribe /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n  mailbox Trash { /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/inbox = yes/inbox = yes\n  /' /etc/dovecot/conf.d/10-mail.conf
# sed -i -e 's/#mail_plugins =/mail_plugins = quota/' /etc/dovecot/conf.d/10-mail.conf
# cp /etc/dovecot/conf.d/20-managesieve.conf  /etc/dovecot/conf.d/20-managesieve.conf.orig
# vim /etc/dovecot/conf.d/20-managesieve.conf

Descomente:

protocols = $protocols sieve
service managesieve-login {
#...
#...
#....
}
service managesieve {
#...
#...
#....
}
protocol sieve {
#...
#...
#....
}
# cp /etc/dovecot/conf.d/15-lda.conf /etc/dovecot/conf.d/15-lda.conf.orig
# sed -i -e 's/#mail_plugins = $mail_plugins/mail_plugins = $mail_plugins sieve quota/' /etc/dovecot/conf.d/15-lda.conf
# cp /etc/dovecot/conf.d/20-imap.conf /etc/dovecot/conf.d/20-imap.conf.orig
# sed -i -e 's/#mail_plugins = $mail_plugins/mail_plugins = $mail_plugins quota imap_quota/' /etc/dovecot/conf.d/20-imap.conf
# cp /etc/dovecot/conf.d/20-pop3.conf /etc/dovecot/conf.d/20-pop3.conf.orig
# sed -i -e 's/#mail_plugins = $mail_plugins/mail_plugins = $mail_plugins quota/' /etc/dovecot/conf.d/20-pop3.conf
# cp /etc/dovecot/conf.d/90-quota.conf /etc/dovecot/conf.d/90-quota.conf.orig
# sed -i -e 's/#quota = maildir/quota = maildir/' /etc/dovecot/conf.d/90-quota.conf
# sed -i -e 's/#quota_rule =/quota_rule =/' /etc/dovecot/conf.d/90-quota.conf
# sed -i -e 's/#quota_rule2 =/quota_rule2 =/' /etc/dovecot/conf.d/90-quota.conf
# sed -i -e 's/#quota_warning/quota_warning/' /etc/dovecot/conf.d/90-quota.conf
# vim /etc/dovecot/conf.d/90-quota.conf

Descomente e altere user = dovecot para user = root

service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = root
unix_listener quota-warning {
user = vmail
}
}
# vim /usr/local/bin/quota-warning.sh
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@remontti.com.br
Subject: $USER com  $PERCENT% 
Content-Type: text/plain; charset="UTF-8"
Sua conta de email: $USER 
está com uso acima de $PERCENT%,
-- 
Rudimar Remontti
Remontti ME
EOF
# Evine uma cópia para o administrador:
ADM=noc@remontti.com.br
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $ADM -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@remontti.com.br
Subject: $USER com  $PERCENT% 
Content-Type: text/plain; charset="UTF-8"
Verificar conta de email: $USER 
Caixa acima de  $PERCENT%
-- 
Rudimar Remontti
Remontti ME
EOF

Demos permissão e restartamos o serviços.

# chmod +x /usr/local/bin/quota-warning.sh
# systemctl restart dovecot postfix
# systemctl status dovecot postfix 

Comando para ver cota

# doveadm quota get -u usuario@dominio.com.br

WEBMAIL ROUNDCUBE

Ajuste o time zone de acordo com sua localidade.

# sed -i -e "s/^;date\.timezone =.*$/date\.timezone = 'America\/Sao_Paulo'/" /etc/php/7.3/apache2/php.ini
# systemctl restart apache2

Acesse e baixe a versão mais recente
https://roundcube.net/download/

Hoje (27/Nov/2019) 1.4.1 Complete

# cd /var/www/html
# wget https://github.com/roundcube/roundcubemail/releases/download/1.4.1/roundcubemail-1.4.1-complete.tar.gz
# tar -vxzf roundcubemail*
# mv roundcubemail-1.4.1 webmail
# rm roundcubemail-1.4.1-complete.tar.gz

Criaremos nosso banco de dados para o roundcubemail.

# mariadb

Será solicitado a senha root do mysql, entre com a senha.

CREATE DATABASE roundcubemail;
GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'SUA-SENHA-BD-ROUND';
FLUSH PRIVILEGES;
quit;

Acesse:
http://SEU-DOMINIO/webmail/installer/

Clique em Next

Será necessário dar permissão para criação do config.inc.php na pasta config,

# chown www-data. /var/www/html/webmail/ -R

Itens a serem alterados:

== General configuration ==
product_name: Nome do Webmail
Check client IP in session authorization: MARQUE

== Logging & Debugging ==
log_driver: syslog

== Database setup ==
Database type: MYSQL
Database server: localhost
Database name: roundcubemail
Database user name: roundcube
Database password: SUA-SENHA-BD-ROUND
db_prefix:

== IMAP Settings ==
default_host: localhost (se vc usar certificado deixe tls://mail.remontti.com.br)
username_domain: remontti.com.br

== SMTP Settings ==
smtp_server: tls://mail.remontti.com.br (se vc nao for criar certificado deixe localhost)

== Display settings & user prefs ==
language *: pt_BR
Compose HTML formatted messages: always

== Plugins ==
"De acordo com suas necessidades! Porém vou configurar os seguintes.
- emoticons
- managesieve
- markasjunk
- newmail_notifier
- password
- zipdownload

Agora clique em [CREAT CONFIG]
Vai retornar uma mensagem:
The config file was saved successfully into RCMAIL_CONFIG_DIR directory of your Roundcube installation.

Isso significa que nosso arquivo de configuração do roundcube foi criado (config/config.inc.php)

Agora clique em: [CONTINUE]
Agora em: [Inicialize database]

Irá retornar:
Check DB config
DSN (write): OK
DB Schema: OK
DB Write: OK
DB Time: OK

Por seguração deixe as permissões para o root novamente, e para www-data apenas para pasta temp

# chown root. /var/www/html/webmail/ -R
# chown www-data. /var/www/html/webmail/temp -R

Se você já criou uma conta de email você pode testa-la [Check login]

Como recomendações, mova o diretório installer para outro nome ou remova.

After completing the installation and the final tests please remove the whole installer folder from the document root of the webserver or make sure that enable_installer option in config.inc.php is disabled.

# rm installer/ -rf

Acesse o diretório dos plugins do roundcube.

# cd /var/www/html/webmail/plugins/

== newmail_notifier ==

# cd newmail_notifier
# cp config.inc.php.dist config.inc.php
# sed -i -e 's/= false/= true/' config.inc.php

== zipdownload ==

# cd ../zipdownload
# cp config.inc.php.dist config.inc.php

== markasjunk ==

# cd ../markasjunk/
# cp config.inc.php.dist config.inc.php

= managesieve =
Faz emails identificado com spam cair na pasta spam.

# cd ../managesieve
# cp config.inc.php.dist  config.inc.php
# vim config.inc.php

Altere: (atençao para o caminho)

$config['managesieve_default'] = '/var/www/html/webmail/plugins/managesieve/default.sieve';
$config['managesieve_script_name'] = 'Filtros';

Crie o arquivo default.sieve

# vim /var/www/html/webmail/plugins/managesieve/default.sieve
require ["fileinto"];
# rule:[Spam]
if header :contains "X-Spam-Flag" "YES"
{
fileinto "Junk";
stop;
}

== password ==
Permite usuário alterar sua senha.

# cd ../password
# cp config.inc.php.dist  config.inc.php
# vim config.inc.php

Altere:

//Define o uma quantidade minima de caracteres
$config['password_minimum_length'] = 8;
$config['password_minimum_score'] = 4;
$config['password_db_dsn'] = 'mysql://postfixadmin:SENHA-POSTFIX-MYSQL@localhost/postfixadmin';
$config['password_query'] = "UPDATE  mailbox SET  password=MD5(%p) WHERE username=%u AND password=MD5(%o)";

Plugins extra

== contextmenu ==
Baixe a versão mais recente

# cd /var/www/html/webmail/plugins/
# wget https://github.com/johndoh/roundcube-contextmenu/archive/3.0.zip
# apt install unzip 
# unzip 3.0.zip
# rm 3.0.zip
# mv roundcube-contextmenu-3.0 contextmenu

== dovecot_ident ==
Como webmail é um acesso localhost, nos logs de acesso IMAP não queremos isso e sim o IP do usuário que esta acessando, para isso:

# cd /var/www/html/webmail/plugins
# wget https://github.com/remontti/dovecot_ident/archive/3.0.tar.gz
# tar -vxzf 3.0.tar.gz
# rm 3.0.tar.gz
# mv dovecot_ident-3.0 dovecot_ident
# vim /etc/dovecot/dovecot.conf

Descomente incluindo:

login_trusted_networks = 127.0.0.1 ::1

Restarte os serviços

# systemctl restart dovecot postfix
# systemctl status dovecot postfix

Agora precisamos adicionar nossos plugins extrar nas configurações do Round.

# vim /var/www/html/webmail/config/config.inc.php

Procure por:

$config['plugins'] = array('emoticons', 'identity_select', 'managesieve', 'markasjunk', 'newmail_notifier', 'password', 'zipdownload');

Inclua os plugins contextmenu e contextmenu ficando:

$config['plugins'] = array('emoticons', 'identity_select', 'managesieve', 'markasjunk', 'newmail_notifier', 'password', 'zipdownload', 'contextmenu', 'dovecot_ident');

Adicione também check_all_folders, para verificar novos e-mails em todas as pastas, bom caso você criar algum filtro personalizado, ex todas as mensagems contendo x assunto ou de um domínio/email... assim se cair uma mensagem ela fica uma notificação numérica além da pasta principal.

// If true all folders will be checked for recent messages
$config['check_all_folders'] = true;

Seu servidor de e-mail já está funcionado, logue em seu webmail, envie algum e-mails.
Acesse: http://SEU-DOMINIO/webmail/

PEGANDO A ULTIMA VEZ QUE USUÁRIO LOGOU E O IP

Se você é administrador de um servidor de e-mail certamente vai querer isso!
Primeiramente vamos adicionar alguns campos extrar nassa tabela mailbox (last_login_date last_login_ip last_login_proto)

# mariadb
use postfixadmin;
ALTER TABLE `mailbox` ADD `last_login_date` DATETIME NULL COMMENT 'last login date',ADD `last_login_ip` VARCHAR( 39 ) NULL COMMENT 'last login ip',ADD `last_login_proto` CHAR( 5 ) NULL ;
quit;

Vamos ensinar o dovecot a alimentar esses campos.
10-master.conf

# sed -i -e 's/service imap {/service imap {\n  executable = imap imap-postlogin/' /etc/dovecot/conf.d/10-master.conf
# sed -i -e 's/service imap {/service imap {\n  # Post-login action/' /etc/dovecot/conf.d/10-master.conf
# sed -i -e 's/service pop3 {/service pop3 {\n  executable = pop3 pop3-postlogin/' /etc/dovecot/conf.d/10-master.conf
# sed -i -e 's/service pop3 {/service pop3 {\n  # Post-login action/' /etc/dovecot/conf.d/10-master.conf
# echo ''>> /etc/dovecot/conf.d/10-master.conf
# echo '# Post login scripting POP3'>> /etc/dovecot/conf.d/10-master.conf
# echo 'service pop3-postlogin {'>> /etc/dovecot/conf.d/10-master.conf
# echo '  executable = script-login /usr/local/bin/postlogin-pop.sh'>> /etc/dovecot/conf.d/10-master.conf
# echo '  user = $default_internal_user'>> /etc/dovecot/conf.d/10-master.conf
# echo '  unix_listener pop3-postlogin {'>> /etc/dovecot/conf.d/10-master.conf
# echo '  }'>> /etc/dovecot/conf.d/10-master.conf
# echo '}'>> /etc/dovecot/conf.d/10-master.conf
# echo ''>> /etc/dovecot/conf.d/10-master.conf
# echo '# Post login scripting IMAP'>> /etc/dovecot/conf.d/10-master.conf
# echo 'service imap-postlogin {'>> /etc/dovecot/conf.d/10-master.conf
# echo '  executable = script-login /usr/local/bin/postlogin-imap.sh'>> /etc/dovecot/conf.d/10-master.conf
# echo '  user = $default_internal_user'>> /etc/dovecot/conf.d/10-master.conf
# echo '  unix_listener imap-postlogin {'>> /etc/dovecot/conf.d/10-master.conf
# echo '  }'>> /etc/dovecot/conf.d/10-master.conf
# echo '}'>> /etc/dovecot/conf.d/10-master.conf

Crie o arquivo postlogin-imap.sh

# vim /usr/local/bin/postlogin-imap.sh

Atenção para SENHA.

#!/bin/sh
MYSQL_USER='postfixadmin'
PASSWD='SENHA'
DB_NAME='postfixadmin'
if [ X"${USER}" != X"dump-capability" ]; then
mysql -u${MYSQL_USER} -p${PASSWD} ${DB_NAME} >/dev/null 2>&1 <<EOF
UPDATE mailbox SET \
last_login_ip="$IP", \
last_login_date=NOW(), \
last_login_proto="POP3" \
WHERE username="$USER";
EOF
fi
exec "$@"

Crie o arquivo postlogin-pop.sh

# vim /usr/local/bin/postlogin-pop.sh

Atenção para SENHA.

#!/bin/sh
MYSQL_USER='postfixadmin'
PASSWD='SENHA'
DB_NAME='postfixadmin'
if [ X"${USER}" != X"dump-capability" ]; then
mysql -u${MYSQL_USER} -p${PASSWD} ${DB_NAME} >/dev/null 2>&1 <<EOF
UPDATE mailbox SET \
last_login_ip="$IP", \
last_login_date=NOW(), \
last_login_proto="POP3" \
WHERE username="$USER";
EOF
fi
exec "$@"
# chmod +x /usr/local/bin/postlogin-*
# systemctl restart dovecot

Acesse sua conta de e-mail e apos consulte a tabela mailbox (`SELECT * FROM mailbox`)

Até este ponto nosso servidor está 100%, agora falta apenas um Anti-Spam e um Anti-Vírus para ficar perfeito, Então vamos nessa 🙂

SPAMASSASSIN

Vamos começar pelo SpamAssassin

# apt install spamc spamassassin

Alguns ajustes

# systemctl enable spamassassin
# sed -i -e 's/CRON=0/CRON=1/' /etc/default/spamassassin
# sed -i -e 's/# report_safe 1/report_safe 0/' /etc/spamassassin/local.cf
# vim /etc/postfix/master.cf

Adicione ==> -o content_filter=spamassassin

smtp      inet  n       -       -       -       -       smtpd
-o content_filter=spamassassin
{..}
submission inet n       -       -       -       -       smtpd
-o content_filter=spamassassin
{..}
smtps     inet  n       -       -       -       -       smtpd
-o content_filter=spamassassin
{..}

E no final do arquivo:

# SpamAssassin
spamassassin unix -     n       n       -       -       pipe
user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Vamos instalar o Razor Pyzor para ajudar no bloquei dos Spam.

# apt install razor pyzor
# vim /etc/spamassassin/local.cf

Inclua antes da ultima linha (endif # Mail::SpamAssassin::Plugin::Shortcircuit)

# ...
# razor2
use_razor2 1
score RAZOR2_CHECK 2.500
# pyzor
use_pyzor 1
score PYZOR_CHECK 2.500
endif # Mail::SpamAssassin::Plugin::Shortcircuit
# su - debian-spamd -c 'razor-admin -d --create'
# su - debian-spamd -c 'razor-admin -register'
# su - debian-spamd -c 'razor-admin -discover'

ANTIVIRUS AMAVIS / CLAMAV

Você precisa ter nos repositórios os pacotes contrib non-free

# vim /etc/apt/sources.list

(exemplo)

deb http://deb.debian.org/debian/ buster main contrib non-free
deb-src http://deb.debian.org/debian/ buster main contrib non-free
deb http://security.debian.org/debian-security buster/updates main contrib non-free
deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
# buster-updates, previously known as 'volatile'
deb http://deb.debian.org/debian/ buster-updates main contrib non-free
deb-src http://deb.debian.org/debian/ buster-updates main contrib non-free
# apt update
# apt install amavisd-new clamav clamav-freshclam clamav-daemon p7zip p7zip-full\
arj bzip2 cabextract nomarch pax rar unrar unrar-free unzip zip lhasa lrzip lz4\
libmail-dkim-perl libnet-ldap-perl libsnmp-perl libmessage-passing-zeromq-perl\
lzop p7zip rpm
# adduser clamav amavis
# mkdir /var/run/clamav
# touch /var/run/clamav/clamd.ctl
# chown clamav.  /var/run/clamav/clamd.ctl
# systemctl stop clamav-freshclam
# freshclam
# su - amavis -c 'razor-admin -d --create'
# su - amavis -c 'razor-admin -register'
# su - amavis -c 'razor-admin -discover'
# vim /etc/amavis/conf.d/15-content_filter_mode

#(Descomente)

[...]
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
[...]
# vim /etc/amavis/conf.d/50-user

Adicionar !! Atenção para SENHA

use strict;
#
# Place your configuration directives here.  They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file
#
@lookup_sql_dsn = (
['DBI:mysql:database=postfixadmin;host=127.0.0.1;port=3306',
'postfixadmin',
'SENHA-BD-POSTFIX']);
$sql_select_policy = 'SELECT "Y" as local FROM alias WHERE address IN (%k)';
#------------ Do not modify anything below this line -------------
1;  # ensure a defined return
# vim /etc/amavis/conf.d/05-node_id

Altere:

$myhostname = "mail.remontti.com.br";
# vim /etc/amavis/conf.d/01-debian

Comente:

#$unarj      = ['arj', 'unarj'];

Descomente:

$unrar      = ['rar', 'unrar']; #disabled (non-free, no security support)

Personalização Amavis

# vim /etc/amavis/conf.d/20-debian_defaults

Eu comento sa_spam_subject_tag, assim as mensagens que forem spam não terão o assunto trocado, pois elas já irão cair na caixa de spam.

#$sa_spam_subject_tag = '***SPAM*** ';

Comente se não desejar receber as menssagens de erro.

#$final_virus_destiny      = D_DISCARD;  # (data not lost, see virus quarantine)
#$final_banned_destiny     = D_BOUNCE;   # D_REJECT when front-end MTA
#$final_spam_destiny       = D_BOUNCE;
$final_bad_header_destiny = D_PASS;     # False-positive prone (for spam)

Não comente final_bad_header_destiny (se não os spam não serão entregues)

Se não quiser que seu email postmaster receba um email com todos os emails q ele discartou, comente:

#$virus_admin = "postmaster\@$mydomain"; # due to D_DISCARD default

Habilitar o amavis no postfix

# postconf -e "content_filter = smtp-amavis:[127.0.0.1]:10024"
# vim /etc/postfix/master.cf

Adicionar ao final

#Amavis
smtp-amavis       unix  -       -       -       -       2       smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
-o smtp_generic_maps=
127.0.0.1:10025 inet    n       -       -       -       -       smtpd
-o mynetworks=127.0.0.0/8
-o content_filter=
-o local_recipient_maps=
-o local_header_rewrite_clients=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
-o strict_rfc821_envelopes=yes
# SPF
policyd-spf  unix       -       n       n       -       0       spawn
user=policyd-spf argv=/usr/bin/policyd-spf

Ajuste o SPF para que execute seus testes.

# sed -i 's/HELO_reject = Fail/HELO_reject = False/' /etc/postfix-policyd-spf-python/policyd-spf.conf
# sed -i 's/Mail_From_reject = Fail/Mail_From_reject = False/' /etc/postfix-policyd-spf-python/policyd-spf.conf

Inclua em main.cf `policyd-spf_time_limit = 3600` para aumentar o tempo limite impedirá o Postfix de interromper o agente se as transações forem um pouco lentas.

# postconf -e "policyd-spf_time_limit = 3600"

Alguns pacotes que o amavis utiliza já não estão mais no debian buster então vamos baixa-los e instala-los.

# cd /tmp
# wget http://ftp.br.debian.org/debian/pool/main/r/ripole/ripole_0.2.0+20081101.0215-3_amd64.deb
# apt install ./ripole_0.2.0+20081101.0215-3_amd64.deb
# wget http://ftp.br.debian.org/debian/pool/main/z/zoo/zoo_2.10-28_amd64.deb
# apt install ./zoo_2.10-28_amd64.deb

Restarte todos os serviços e verifique se tudo esta ok.

# systemctl restart clamav-daemon clamav-freshclam spamassassin amavis dovecot postfix
# systemctl status clamav-daemon clamav-freshclam spamassassin amavis dovecot postfix

Simular o envio de um spam:

# cd /tmp
# wget http://spamassassin.apache.org/gtube/gtube.txt
# sendmail seu@email.com.br < gtube.txt

Não podemos esquecer de definir a senha do usuário root do mariadb/mysql

# mariadb
USE mysql;
UPDATE user SET password=PASSWORD('SENHA_DB_ROOT') WHERE User='root';
UPDATE user SET plugin="mysql_native_password";
FLUSH PRIVILEGES;
quit;

HTTPS / SSL / CERTIFICADO VÁLIDO

Sugestão é você configurar seu domínios virtuais (ou mais de um) e configurar o Let’s Encrypt
Leitura recomendada:
- Criando certificado grátis com Let’s Encrypt para o Apache no Debian 10
- Como ter diversos sub/domínios no mesmo servidor? (Domínios virtuais com Apache2)

Vou fazer um exemplo bem simples editando o 000-default.conf

# vim /etc/apache2/sites-enabled/000-default.conf

Descomente a linha ServerName e adicione o domínio do seu servidor

<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
Protocols h2 http/1.1
ServerName mail.remontti.com.br
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<Directory /var/www/html/>
Options FollowSymLinks
AllowOverride All
</Directory>
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Restarte o apache

# a2enmod http2
# systemctl restart apache2

Instale o letsencrypt e cerbot

# apt install letsencrypt python-certbot-apache

Antes de gerar o certificado para “mail.remontti.com.br” pare o apache

# systemctl stop apache2
# letsencrypt --authenticator standalone --installer apache -d mail.remontti.com.br
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): noc@remontti.com.br
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mail.remontti.com.br
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://mail.remontti.com.br
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=mail.remontti.com.br
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/mail.remontti.com.br/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/mail.remontti.com.br/privkey.pem
Your cert will expire on 2020-02-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le

Agora já temos uma acesso seguro em "mail.remontti.com.br", interessante que agora temos certificados válidos que podemos usar no nosso serviço de e-mail, então vamos ajustar!

# mv /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/ssl/certs/ssl-cert-snakeoil.pem.off
# mv /etc/ssl/private/ssl-cert-snakeoil.key /etc/ssl/private/ssl-cert-snakeoil.key.off
# ln -s /etc/letsencrypt/live/mail.remontti.com.br/fullchain.pem /etc/ssl/certs/ssl-cert-snakeoil.pem
# ln -s /etc/letsencrypt/live/mail.remontti.com.br/privkey.pem /etc/ssl/private/ssl-cert-snakeoil.key

Adicione smtp_tls_security_level, smtp_tls_CAfile e smtp_tls_loglevel em main.cf

# postconf -e "smtp_tls_security_level = may"
# postconf -e "smtp_tls_CAfile = /etc/ssl/certs/ssl-cert-snakeoil.pem"
# postconf -e "smtp_tls_loglevel = 1"

Restart os serviços

# systemctl restart clamav-daemon clamav-freshclam spamassassin amavis dovecot postfix

DKIM

Adicione usuário postfix ao opendkimgrupo para que o Postfix possa acessar o soquete do OpenDKIM quando for necessário.

# adduser postfix opendkim
# vim /etc/opendkim.conf

Altere

#Socket                 local:/var/run/opendkim/opendkim.sock
Socket              local:/var/spool/postfix/opendkim/opendkim.sock

Adicione ao final do arquivo

##  Specifies the path to the private key to use when signing.  Ignored if
##  SigningTable and KeyTable are used.  No default; must be specified for 
##  signing if SigningTable/KeyTable are not in use.
KeyTable            /etc/dkimkeys/key.table
##  SigningTable dataset
##      default (none)
##
##  Defines a dataset that will be queried for the message sender's address
##  to determine which private key(s) (if any) should be used to sign the
##  message.  The sender is determined from the value of the sender
##  header fields as described with SenderHeaders above.  The key for this
##  lookup should be an address or address pattern that matches senders;
##  see the opendkim.conf(5) man page for more information.  The value
##  of the lookup should return the name of a key found in the KeyTable
##  that should be used to sign the message.  If MultipleSignatures
##  is set, all possible lookup keys will be attempted which may result
##  in multiple signatures being applied.
SigningTable        refile:/etc/dkimkeys/signing.table
##  ExternalIgnoreList filename
##
##  Names a file from which a list of externally-trusted hosts is read.
##  These are hosts which are allowed to send mail through you for signing.
##  Automatically contains 127.0.0.1.  See man page for file format.
ExternalIgnoreList  /etc/dkimkeys/trusted.hosts
##  InternalHosts dataset
##      default "127.0.0.1"
##
##  Names a file from which a list of internal hosts is read.  These are
##  hosts from which mail should be signed rather than verified.
##  Automatically contains 127.0.0.1.
InternalHosts       /etc/dkimkeys/trusted.hosts
##  Canonicalization hdrcanon[/bodycanon]
##      default "simple/simple"
##
##  Select canonicalizations to use when signing.  If the "bodycanon" is
##  omitted, "simple" is used.  Valid values for each are "simple" and
##  "relaxed".
Canonicalization    relaxed/simple
##  AutoRestart { yes | no }
##      default "no"
##
##  Indicate whether or not the filter should arrange to restart automatically
##  if it crashes.
AutoRestart     yes
##  AutoRestartRate n/t[u]
##      default (none)
## 
##  Sets the maximum automatic restart rate.  See the opendkim.conf(5)
##  man page for the format of this parameter.
AutoRestartRate 10/1M
##  DNSTimeout n
##      default 10
##
##  Specify the time in seconds to wait for replies from the nameserver when
##  requesting keys or signing policies.
DNSTimeout      5

Crie o diretório do soquete OpenDKIM na área de trabalho do Postfix e verifique se ele possui a propriedade correta, em seguida edite o caminho para o soquete é diferente do padrão, porque no Debian 10 o processo Postfix lida com uma prisão chroot e não pode acessar o local normal.

# mkdir /var/spool/postfix/opendkim
# chown opendkim:postfix /var/spool/postfix/opendkim
# vim /etc/default/opendkim

Altere

#RUNDIR=/var/run/opendkim
RUNDIR=/var/spool/postfix/opendkim
# vim /etc/dkimkeys/signing.table

Crie a tabela de assinatura /etc/dkimkeys/signing.table. Ele precisa ter uma linha por domínio para a qual você lida com o email. Cada linha deve ficar assim:

*@remontti.com.br   remontti

Substitua *@remontti.com.br por seu domínio e remontti por um nome abreviado para o domínio. O primeiro campo é um padrão que corresponde aos endereços de email. O segundo campo é um nome para a entrada da tabela de chaves que deve ser usada para assinar emails desse endereço.

# vim /etc/dkimkeys/key.table 
remontti     remontti.com.br:201911:/etc/dkimkeys/remontti.private

Substitua remontti pelo valor que você usou para o domínio na tabela de assinatura. Substitua remontti.com.br por seu nome de domínio e substitua 201911 ano atual de 4 dígitos e mês de 2 dígitos (isso é chamado de seletor). O primeiro campo conecta as tabelas de assinatura e chave.

O segundo campo é dividido em 3 seções separadas por dois pontos.
1- A primeira seção é o nome de domínio para o qual a chave é usada.
2- A segunda seção é um seletor usado ao procurar registros importantes no DNS.
3- A terceira seção nomeia o arquivo que contém a chave de assinatura do domínio.

Crie o arquivo de hosts confiáveis.

# vim /etc/dkimkeys/trusted.hosts
127.0.0.1
::1
localhost
mail
remontti.com.br
mail.remontti.com.br

Ao criar o arquivo, mude "mail" para o nome do seu servidor e substitua remontti.com.br pelo seu próprio nome de domínio. Estamos identificando os hosts pelos quais os usuários enviarão mensagens e devem ter as mensagens enviadas assinadas, que para configurações básicas será o seu próprio servidor de email.

Gere chaves para cada domínio:

# cd /etc/dkimkeys
# opendkim-genkey -b 2048 -h rsa-sha256 -r -s 201911 -d remontti.com.br -v

opendkim-genkey: generating private key
opendkim-genkey: private key written to 201911.private
opendkim-genkey: extracting public key
opendkim-genkey: DNS TXT record written to 201911.txt

Criamos uma atalho e alteramos as permissões

# ln -s 201911.private  remontti.private
# chown -R opendkim. /etc/dkimkeys/
# chmod -R go-rw /etc/dkimkeys/

Restart e verifique se o OpenDKIM iniciou corretamente.

# systemctl restart opendkim
# systemctl status -l opendkim

Configurar DKIM no seu DNS

Como no SPF, o DKIM usa registros TXT para armazenar informações sobre a chave de assinatura de cada domínio.
Usando o AAAAMM como acima, é necessário criar um registro TXT para o host YYYYMM._domainkeyde de cada domínio para o qual você lida com o correio. Seu valor pode ser encontrado no arquivo 201911.txt. Esses arquivos são assim:

201911._domainkey       IN      TXT     ( "v=DKIM1; h=rsa-sha256; k=rsa; s=email; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAks0HGeii8xoDxuL9vlZmJg6ajHg0l5Mc/8PfC4FQtVTp1BWhlRHQwIQAgbnD+y1nt4JAp4hC7vGx/qdMd1MGlUUJGTpXtTOr4p5DyBwO8zGC+vIuN0cJaBViNXQxLKT0ZX0bg00yQ2LtJIbw+0nAmTyuPcHxOtLfS5GMJe7kP/rmCCOCqiVAfuq/sslkqlpNkOWHaJf211x0Q3"
"ts6TNrFxu7ExdGfWFpzEtSW+a/HhR/iIwYQGPl63JdjOLhS6Sy7IGk0xKRbIMQfLa91voPTKq+GnHcXbKzwI1SFfF39wGnrxfw9bIS/KmgzHBrFJ8nvrwTas2Q249AZUNzqhvFSwIDAQAB" )  ; ----- DKIM key 201911 for remontti.com.br

Remova os parênteses, e as quebras de linhas. E h=rsa-sha256 altere para h=sha256. O resultado ficaria:

201911._domainkey       TXT     "v=DKIM1; h=sha256; k=rsa; s=email; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAks0HGeii8xoDxuL9vlZmJg6ajHg0l5Mc/8PfC4FQtVTp1BWhlRHQwIQAgbnD+y1nt4JAp4hC7vGx/qdMd1MGlUUJGTpXtTOr4p5DyBwO8zGC+vIuN0cJaBViNXQxLKT0ZX0bg00yQ2LtJIbw+0nAmTyuPcHxOtLfS5GMJe7kP/rmCCOCqiVAfuq/sslkqlpNkOWHaJf211x0Q3" "ts6TNrFxu7ExdGfWFpzEtSW+a/HhR/iIwYQGPl63JdjOLhS6Sy7IGk0xKRbIMQfLa91voPTKq+GnHcXbKzwI1SFfF39wGnrxfw9bIS/KmgzHBrFJ8nvrwTas2Q249AZUNzqhvFSwIDAQAB"

Você pode adicionar uma política ADSP ao seu domínio, dizendo que todos os emails do seu domínio devem ser assinados por DKIM. Como de costume, isso é feito com um registro TXT para host _adsp._domainkeyem seu domínio com um valor de dkim=all. Você não precisa configurar isso, mas isso dificulta a falsificação de emails de seus domínios, porque os servidores de e-mail do destinatário verão a falta de uma assinatura DKIM e rejeitarão a mensagem.

_adsp._domainkeyem      TXT     "dkim=all"

Relatório e conformidade de mensagens de domínio (DMARC). O registro DNS do DMARC pode ser adicionado para informar aos servidores de correio o que você acha que eles devem fazer com os e-mails que afirmam pertencer ao seu domínio e que falham na validação com SPF e/ou DKIM. O DMARC também permite solicitar relatórios sobre mensagens que não passam em uma ou mais verificações de validação. O DMARC deve ser configurado apenas se você tiver o SPF e o DKIM configurados e operando com êxito. Se você adicionar o registro DNS DMARC sem o SPF e o DKIM, as mensagens do seu domínio falharão na validação, o que pode fazer com que sejam descartadas ou relegadas a uma pasta de spam.

O registro DMARC é um registro TXT para host _dmarcem seu domínio que contém os seguintes valores recomendados:

v=DMARC1;p=quarantine;sp=quarantine;adkim=r;aspf=r

Isso solicita que os servidores de correio em quarentena (não descartem, mas separem das mensagens regulares) qualquer email que falhe nas verificações de SPF ou DKIM. Nenhum relatório é solicitado. Pouquíssimos servidores de correio implementam o software para gerar relatórios sobre mensagens com falha; portanto, é desnecessário solicitá-las. Se você deseja solicitar relatórios, o valor seria semelhante a este exemplo, adicionado como uma única sequência:

v=DMARC1;p=quarantine;sp=quarantine;adkim=r;aspf=r;fo=1;rf=afrf;rua=mailto:seuemail@domino.com.br

Os registros DMARC têm um número de tags e opções disponíveis. Essas tags são usadas para controlar suas configurações de autenticação:

`v` especifica a versão do protocolo, neste caso DMARC1.
`p` determina a política para o domínio raiz, como "example.com". As opções disponíveis:
- `quarantine` instrui que, se um email falhar na validação, o destinatário deve separá-lo para processamento.
- `reject` solicita que o servidor de email receptor rejeite os emails que falham na validação.
- `none` solicita que o destinatário não tome nenhuma ação se um email não passar na validação.

`sp` determina a política para subdomínios, como "subdomínio.exemplo.com". Ele usa os mesmos argumentos que a `p` tag.

`adkim` especifica o modo de alinhamento para DKIM, que determina com que rigor os registros DKIM são validados. As opções disponíveis são:
- `r` modo de alinhamento relaxado, a autenticação DKIM é aplicada com menos rigor.
- `s` modo de alinhamento estrito. Somente uma correspondência exata com a entrada DKIM para o domínio raiz será vista como validada.

`aspf` determina o modo de alinhamento para verificação do SPF. Leva os mesmos argumentos que `adkim`.

Adicione nas configurações do seu arquivo DNS autoritativo e restart seu DNS. Ex (bind):

$TTL 86400      ; 1 day
remontti.net.br        IN SOA  ns1.remontti.net.br. hostmaster.remontti.net.br. (
2019071900 ; serial
10800      ; refresh (3 hours)
3600       ; retry (1 hour)
2419200    ; expire (4 weeks)
300        ; minimum (5 minutes)
)
NS      ns1.remontti.net.br.
NS      ns2.remontti.net.br.
A       45.80.50.4
AAAA    2804:f123:bebe:cafe::4
MX      10 mail.remontti.net.br.
TXT     "v=spf1 a mx -all"
SPF     "v=spf1 a mx -all"
$ORIGIN remontti.net.br.
$TTL 10800      ; 3 hours
45-80-50-0                      A       45.80.50.0
router-gw                       A       45.80.50.1
AAAA    2804:f123:bebe:cafe::1
ns1                             A       45.80.50.2
AAAA    2804:f123:bebe:cafe::2
hostmaster                      A       45.80.50.2
AAAA    2804:f123:bebe:cafe::2
ns2                             A       45.80.50.3
AAAA    2804:f123:bebe:cafe::3
www                             A       45.80.50.4
AAAA    2804:f123:bebe:cafe::4
ftp                             A       45.80.50.4
AAAA    2804:f123:bebe:cafe::4
zabbix                          A       45.80.50.5
AAAA    2804:f123:bebe:cafe::5
phpipam                         A       45.80.50.5
AAAA    2804:f123:bebe:cafe::5
mail                            A       45.80.50.6
AAAA    2804:f123:bebe:cafe::6
imap                            A       45.80.50.6
AAAA    2804:f123:bebe:cafe::6
pop                             A       45.80.50.6
AAAA    2804:f123:bebe:cafe::6
smtp                            A       45.80.50.6
AAAA    2804:f123:bebe:cafe::6
$TTL 300 ; 5 min
$ORIGIN remontti.com.br.
201911._domainkey       TXT     "v=DKIM1; h=sha256; k=rsa; s=email; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAks0HGeii8xoDxuL9vlZmJg6ajHg0l5Mc/8PfC4FQtVTp1BWhlRHQwIQAgbnD+y1nt4JAp4hC7vGx/qdMd1MGlUUJGTpXtTOr4p5DyBwO8zGC+vIuN0cJaBViNXQxLKT0ZX0bg00yQ2LtJIbw+0nAmTyuPcHxOtLfS5GMJe7kP/rmCCOCqiVAfuq/sslkqlpNkOWHaJf211x0Q3" "ts6TNrFxu7ExdGfWFpzEtSW+a/HhR/iIwYQGPl63JdjOLhS6Sy7IGk0xKRbIMQfLa91voPTKq+GnHcXbKzwI1SFfF39wGnrxfw9bIS/KmgzHBrFJ8nvrwTas2Q249AZUNzqhvFSwIDAQAB"
_adsp._domainkeyem      TXT     "dkim=all"
_dmarc                  TXT     "v=DMARC1;p=quarantine;sp=quarantine;adkim=r;aspf=r"

Teste as chaves para a assinatura e verificação corretas usando o opendkim-testkeycomando:

# opendkim-testkey -d remontti.com.br -s 201911

Se tudo estiver correto, você não deverá obter nenhuma saída. Se você quiser ver mais informações, adicione -vvvno final do comando. Isso produz saída de depuração detalhada. A última mensagem deve ser "tecla OK". Pouco antes disso, você poderá ver a mensagem "chave não segura". Isso é normal e não indica um erro, apenas significa que seu domínio ainda não está configurado para DNSSEC.

Adicione

vim /etc/postfix/main.cf
# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = local:opendkim/opendkim.sock
# systemctl restart opendkim postfix
# systemctl status opendkim postfix

Rotação da chave DKIM

(Não faça isso agora! Leia com atenção)

O motivo pelo qual o formato AAAAMM é usado é que a prática recomendada exige a alteração das chaves de assinatura DKIM de vez em quando (recomenda-se mensalmente, e não mais que a cada 6 meses). Para fazer isso sem interromper as mensagens em trânsito, você gera as novas chaves usando um novo seletor. O processo é:

Gere novas chaves como anteriormente no /etc/dkimkeys/. Use o ano e o mês atuais para o valor do seletor AAAAMM, para que seja diferente do seletor atualmente em uso.

# cd /etc/dkimkeys/
# opendkim-genkey -b 2048 -h rsa-sha256 -r -s 202006 -d remontti.com.br -v

Use o .txt gerado para adicionar as novas chaves ao seu DNS, usando o novo seletor AAAAMM nos nomes de host. Não remova ou altere os registros DKIM TXT existentes. Feito isso, verifique os novos dados da chave usando o seguinte comando:

# opendkim-testkey -d remontti.com.br -s 202006 -k remontti.private

Pare o Postfix e o OpenDKIM para que eles não processem e-mails enquanto você estiver trocando as chaves.

# systemctl stop postfix opendkim

Remova o link anterior do "remontti.private" e link ao novo "202006.private" arquivo gerado e defina as permissões corretas:

# cd /etc/dkimkeys
# rm remontti.private 
# ln -s 202006.private  remontti.private
# chown -R opendkim. /etc/dkimkeys/
# chmod -R go-rw /etc/dkimkeys/

Altere o antigo valores de AAAAMM em key.table para o novo seletor e salve o arquivo.

# vim /etc/dkimkeys/key.table 
remontti     remontti.com.br:202006:/etc/dkimkeys/remontti.private

Inicie o OpenDKIM e o Postfix

# systemctl start opendkim postfix

Certifique-se de que ambos iniciem sem erros.

# systemctl status opendkim postfix

Espere algumas semanas para remover o antigo registro pois algum servidor pode estar ainda usando a antiga chave. (Eu normalmente removo apenas quando crio uma nova)

FAIL2BAN + NFTABLES

Fail2Ban é uma estrutura de software de prevenção de intrusões que protege os servidores de computadores contra ataques de força bruta, que opera monitorando arquivos de logs. Sendo o mais comum usado para bloquear endereços IPs selecionados que podem pertencer a hosts que estão tentando violar a segurança.

# apt install nftables fail2ban

Como o iptables está sendo substituído por nftables começando com o Debian Buster, vamos configurar o Fail2Ban para usar o nftables como padrão.
Mas vou ir além em vez de usar o filtro multiport vou setar allports e modifica-lo para que quando uma tentativa de violação acontecer o Fail2Ban crie uma regra de firewall que dropa definitivamente o IP e não apenas fechando a porta do serviço para "invasor".

# vim /etc/fail2ban/jail.conf

Procure por "banaction = iptables-multiport" e "banaction_allports = iptables-allports" e altere seu valor para "nftables-allports":

#banaction = iptables-multiport
#banaction_allports = iptables-allports
banaction = nftables-allports
banaction_allports = nftables-allports

Altere o modo de bloqueio em nftables-allports.conf para fazer que ele de um "drop all".

# vim /etc/fail2ban/action.d/nftables-allports.conf

Procure por nftables_mode = meta l4proto e altere deixando seu valor vazio:

#nftables_mode = meta l4proto <protocol>
nftables_mode =

Em nftables-common.conf alteraremos o padrão de reject para drop

# vim /etc/fail2ban/action.d/nftables-common.conf

Procure por "blocktype = reject" e altere seu valor para "drop".

#blocktype = reject
blocktype = drop

Ativamos alguns filtros. Se desejar ajustar o tempo te banimento altere o valor de bantime, e os numeros de erros/tentativas em maxretry.

# vim /etc/fail2ban/jail.d/defaults-debian.conf

Adicione no arquivo:

[sshd]
enabled = true
[postfix-sasl]
enabled = true
bantime  = 1h
maxretry = 5
[dovecot]
enabled = true
bantime  = 1h
maxretry = 5
[sieve]
enabled = true
bantime  = 1h
maxretry = 5

Ativamos o nftables e restartamos os serviços:

# systemctl enable nftables
# systemctl restart nftables fail2ban

Para visualizar seu firewall use o comando:

# nft list ruleset

Alguns comandos do fail2ban
Status:

# fail2ban-client status

Status do filtro:

# fail2ban-client status NOME_FILTRO

Remover um IP bloqueado de um filtro:

# fail2ban-client set NOME_FILTRO unbanip IP_BLOQUEADO

Ufaaaa acabamos, espero que tenha gostado! 🙂

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Abraço!

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

46 Resultados

  1. Frands Franco disse:

    Meu bindo apresenta syntax error na linha da chave TXT do DKIM, ja tentei de tudo e não aceita.

  2. Raildson Felipe da Silva disse:

    Parabéns pelo lab, funcionou perfeitamente.

  3. Vicente Filho disse:

    Boa noite, vim aqui colaborar com os demais com problema de PHP
    Pra quem teve problema com o PHP 7.2 e precisa da Versão 8.2 em diante, só alterar antes de:
    “APACHE2, MARIADB E PHP7”
    —————————

    #1. Add the Sury PPA Repository
    apt update
    apt install lsb-release apt-transport-https ca-certificates software-properties-common -y

    #Following this, import the repository GPG key:
    wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

    #Append the repository to the sources list:
    sh -c ‘echo “deb https://packages.sury.org/php/ $(lsb_release -sc) main” > /etc/apt/sources.list.d/php.list’

    #To make sure it is working correctly:
    apt update; apt upgrade

    # depois de instalar o PHP 8.2, então sim vá pro proximo passo:
    # detalhes: eu troquei: “libapache2-mod-php” para “libapache2-mod-php8.2”
    #APACHE2, MARIADB E PHP7
    apt install apache2-utils mariadb-server mariadb-client curl\
    libapache2-mod-php8.2 php php-mysql php-cli php-pear php-gmp php-gd php-bcmath\
    php-mbstring php-curl php-xml php-zip php-imap php-intl php-ldap php-imagick wget

    • Vicente Filho disse:

      CORRIGINDO:
      # 1 – Adicionando o Repositório “Sury PPA Repository”
      apt update
      apt install lsb-release apt-transport-https ca-certificates software-properties-common -y

      #2 – importando o repositorio “GPG key”:
      wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

      #3 – Adicionando o repositorio para o “sources list”: (removido as duas aspas e ajustado para aspa simples inicio e fim)
      sh -c ‘echo deb https://packages.sury.org/php/ $(lsb_release -sc) main > /etc/apt/sources.list.d/php.list’

      #4 – execute o comando abaixo para funcionar corretamente:
      apt update; apt upgrade

      #5 – Instalando o PHP 8.2 e os modulos já corrigido:
      apt install apache2 apache2-utils mariadb-server mariadb-client curl\
      libapache2-mod-php8.2 php8.2 php8.2-mysql php8.2-cli php8.2-fpm php-pear php8.2-gmp php8.2-gd php8.2-bcmath\
      php8.2-mbstring php8.2-common php8.2-opcache php8.2-curl php8.2-xml php8.2-zip php8.2-readline php8.2-imap php8.2-intl php8.2-ldap php8.2-imagick

      #6 – PRONTO, só continuar o Tutorial daqui em diante

  4. Daniel Lemes disse:

    Nos meus testes, o dovecot_ident registra no banco de dados o ip do proprio servidor, e não o ip da maquina que eu estou usando pra acessar o email. Tô fazendo algo errado? E algum bug? Tem alguma correção?

  5. Jean disse:

    Boa tarde, qual porta o servidor usa para enviar emails?

  6. Parabéns pelo tutorial!
    Queria muito ter esse tutorial em PDF, para servir de base/consulta posterior.
    Grato.

  7. Anderson Carlos disse:

    Olá pessoal,
    Estou com duvida se isso mesmo o esperado no DKIM:
    Comando: opendkim-testkey -d mydomian.com.br -s 202206 -k mydomian.private -vvv
    opendkim-testkey: using default configfile /etc/opendkim.conf
    opendkim-testkey: key loaded from mydomian.private
    opendkim-testkey: checking key ‘202206._domainkey.mydomian.com.br’
    opendkim-testkey: ‘202206._domainkey.mydomian.com.br’ record not found

    • Fabio Bellini disse:

      Olá Anderson!
      Resolvi este problema aqui criando um registro na configuracao de zona dns do registro.br (onde registrei meu dominio .com.br)
      p=MI.. (pega do arquivo /etc/dkimkeys/202206.txt e remova as aspas duplas e os espacos , ou seja uma string única (uma chave única)
      Na configuracao de zona dns do registro.br
      Crie uma nova entrada
      TXT
      202206._domainkey
      “v=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjAN…”
      clique no botão Salvar Alterações e no seu server Debian, execute novamente o opendkim-testkey -d mydomian.com.br -s 202206…

      Espero ter ajudado.

  8. Anderson Carlos disse:

    Olá,
    Ótimo tutorial fiz a configuração toda por esse tutorial.

    Mas está me apresentando um erro na hora de enviar email e não recebo nenhum email.

    Erro apresentado e “Error 451 4.3.5 Server configuration error” revisei toda a configuração e está tudo igual a do tutorial.

    Obs.: o meu dominio já responde ao meu servidor dns autoritativo e o servidor de email está no mesmo servidor do dns. Outra coisa e o DNS Reverso ainda não passou para o meu dominio pois o bloco de IP e emprestado da operadora do link.

    desde já agradeço a atenção…

  9. Henri Azevedo disse:

    É possível configurar quantas tentativas o servidor fará para o envio de email?

    Estou fazendo um teste com o IP fixo que não tem DNSr configurado então um provedor de email em especifico não recebe meus emails, ele rejeita justamente pelo fato do meu IP não ter DNSr configurado, porem eu só recebo o email “Undelivered Mail Returned to Sender” após 5 dias do envio.. por exemplo enviei um dia 28/03 e só recebi o retorno de não recebimento 02/04, e nesse tempo o servidor foi tentando fazer o envio..

  10. Joel Chaves disse:

    Boa noite,
    para quando pode fazer este tutorial para o debian 11?

    • Sem previsão, quem sabe quando receber doações que de para deixar de lado o que realmente paga o leite das crianças para escrever para o blog 🙂
      Não parece mas escrever um tutorial demanda tempo e estudos, testes…
      Infelizmente meu tempo ta cada vez mais curto, pois preciso focar no que me da retorno.
      Mas quando achar um tempinho vou tentar escrever, tem uma fila gigante de pedidos já.

  11. Henri disse:

    Tem alguma configuração ou motivo que possa fazer demorar pra receber os emails?

    Segui o tutorial no Debian 11, fazendo alguns ajustes na parte do postfixadmin, mas deu tudo certo, consigo enviar e receber emaisl, mas os externos demoram um pouco pra ser recebido pelo servidor, bem que eu configurei a poucas horas o DNS então não sei se é por isso..

  12. Bruno disse:

    Parabens pelo tutorial.
    Meu servidor apresentou um problema na hora de enviar email.

    Erro smtp (-1) conexão ao servidor falhou. roundcube.

    Alguem sabe o que pode ser?

  13. Henri Azevedo disse:

    Boa tarde Rudimar, como podemos diagnosticar o que está causando o “delivery temporarily suspended”?

  14. iManjate disse:

    Boa tarde, parabens pelo tutorial muito didatico.
    Eu estou tendo problema ao tentar instalar o postfixadmin, usando o comando: apt install postfixadmin no debian 11.
    recebo o seguinte erro, E: Unable to locate package postfixadmin
    alguma saida para esta mensagem?

  15. Marcio dos Santos disse:

    Bom dia,

    Estou caindo na blacklist por conta do meu servidor estar enviando HELO/EHLO mal formado, saberia dizer onde ajusto isso? não achei no tutorial.

  16. Marcio dos Santos disse:

    Boa tarde, ótimo tutorial

    Estou com um problemas que estou caindo nas black-list por conta de EHLO/HELO mal formados, ja tentei resolver com o parâmetro 9 smtpd_command_filter ) porem sem sucesso, teria ideia de como resolver para que qualquer tentativa de EHLO/HELO seja substituída pelo nome do meu servidor.

    Segue exemplo do EHLO/HELO que peguei no trafego de saída:
    SMTP: EHLO n0Ojgf2.inflation.1Jmwt9t4kQl
    SMTP: EHLO su4jP9301.undisowning.f

    Desde já agradeço sua atenção, Obrigado

  17. Erico disse:

    Eu crio as contas pelo postfix admin, porem na hora de logar no rouncube da falha de comunicação com servidor, e ao verificar no servidor a maildir do dominio/contas não foram criadas, alguém passou por isso?

  18. Alvaro Rezende de Oliveira disse:

    Muito obrigado pelo tutorial. Excelente. Estou conseguindo receber emails de fora. Mas não consigo enviar nenhum email. Mensagemd e erro:
    Oct 26 11:09:41 srv postfix/smtp[15157]: connect to vip-us-br-mx.terra.com[208.84.244.133]:25: Connection timed out
    Oct 26 11:09:41 srv postfix/smtp[15157]: CE4C6BD7F9: to=, relay=none, delay=30, delays=0.11/0.01/30/0, dsn=4.4.1, status=deferred (connect to vip-us-br-mx.terra.com[208.84.244.133]:25: Connection timed out)

    O que pode ser?

  19. Joel disse:

    Estão a conseguir com o novo update do debian?

  20. Olivam Chaves disse:

    parabéns pelo seu artigo, tenho uma duvida no webmail quando recebo spam ele esta indo para a pasta spam, porem no outlook (pop3) nao recebe nada da pasta spam, tem alguma forma de o outlook conseguir receber os spam na pasta spam sem usar imap?

  21. Olivam Chaves disse:

    boa tarde,
    ótimo tutorial
    vc tem algum outro tutorial que complementa esse na parte do postfiadmin e dovecot para aparecer a quota de cada usuario.

    • Olivam Chaves disse:

      consegui resolver isso

      criei 1 arquivos dentro de /etc/dovecot/dovecot-dict-sql-user.conf com o conteudo

      connect = host=localhost dbname=postfixadmin user=postfixadmin password=XXXXXX

      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
      }

      criei 1 arquivos dentro de /etc/dovecot/dovecot-dict-sql-domain.conf com o conteudo

      connect = host=localhost dbname=postfixadmin user=postfixadmin password=XXXXX

      map {
      pattern = priv/quota/storage
      table = domain
      username_field = domain
      value_field = quota
      }
      map {
      pattern = priv/quota/messages
      table = quota2
      username_field = username
      value_field = messages
      }

      alterei o dovecot.conf
      dict {
      #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
      #expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext
      sqluserquota = mysql:/etc/dovecot/dovecot-dict-sql-user.conf
      sqldomainquota = mysql:/etc/dovecot/dovecot-sql-domain.conf
      }

      service stats {
      unix_listener stats-reader {
      user = vmail
      group = vmail
      mode = 0660
      }

      unix_listener stats-writer {
      user = vmail
      group = vmail
      mode = 0660
      }
      }

      alterei o 10-master.conf
      service dict {
      # If dict proxy is used, mail processes should have access to its socket.
      # For example: mode=0660, group=vmail and global mail_access_groups=vmail
      unix_listener dict {
      mode = 0600
      user = vmail
      #group =
      }

      adicionei no final do 90-quota.conf
      plugin {
      # Using SQL Tables to store current quota size
      quota = dict:Quota:%d:proxy::sqldomainquota
      quota = dict:User Quota::proxy::sqluserquota
      # Allow 10% more for Trash Folder
      quota_rule2 = Trash:storage=+10%%
      }

      e ativei no postfixadmin config.inc.php
      $CONF[‘quota’] = ‘YES’;
      $CONF[‘domain_quota’] = ‘YES’;
      $CONF[‘used_quotas’] = ‘YES’;
      $CONF[‘new_quota_table’] = ‘YES’;

      agora mostra a % de cada usuario no postfixadmin

  22. diego brito sousa disse:

    Olá, parabéns pelo teu artigo, ele me ajudou a economizar muito tempo,
    pois eu demorava demais para configurar um sistema de emails. Com teu
    artigo configurei mais rápido e de forma melhor.

    Só me surgiu uma dúvida, quando executei os 3 comandos:
    # su – debian-spamd -c ‘razor-admin -d –create’
    # su – debian-spamd -c ‘razor-admin -register’
    # su – debian-spamd -c ‘razor-admin -discover’

    todos eles me retornaram: ‘This account is currently not available.’

    Estou no Ubuntu 20.04 LTS

  23. Angelo Silva disse:

    Quais os requisitos de hardware?

  24. Rogerio luksevicius disse:

    excelente manual fiz tudo como manda é show parabens
    to recebendo email limpo porem quando tento enviar recebo

    “Jul 23 18:46:23 c906f60d postfix/submission/smtpd[17404]: connect from localhost[127.0.0.1]
    Jul 23 18:46:23 c906f60d postfix/submission/smtpd[17404]: NOQUEUE: reject: RCPT from localhost[127.0.0.1]: 554 5.7.1 : Client host rejected: Access denied; from= to= proto=ESMTP helo=”

    que, puder ajudar seria grato rogerio.luksevicius@gmail.com

  25. Luiz Fernando disse:

    Excelente conteudo, conheço o postfixa um bom tempo e fico feliz que ainda seja uma ferramenta adotada pelos profissionais atuais.

    Você incluiu umas coisas que eu não conhecia ainda, bem detalhada sua explicação.

    Obrigado por compartilhar.

  26. Joel disse:

    Olá,

    Bem que poderia fazer um Tutorial com o ISPConfig, ajudava bastante 😀

  27. Gustavo Peres disse:

    Boa Noite, excelente tutorial, porém não consigo acessar email pelo Roundcube nem por outro gerenciador, no Roundcube apresenta: Falha na conexão com servidor, no postfix já foi criado a conta de email normal. será que é alguma config no postfix???

  28. FELIPE MEIRELES disse:

    Olá. Obrigado pelo tutorial. Eu instalei meu servidor local está funcionando o envio e recebimento interno e externo. Só que o email remoto identifica a mensagens como spam e os emails enviados para gmail são bloqueados ao chegar no servidor deles. Como podemos resolver isso ??

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *