Mudanças entre as edições de "Servidor de Email"

De IFRS Campus Canoas
Ir para: navegação, pesquisa
 
(43 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
 
== Postfix ==
 
== Postfix ==
  
Neste tutorial será mostrado como montar um servidor de e-mails para envio de e-mails usando Postfix, este servidor será usado apenas para envio de notificações de sistemas internos para funcionários e alunos, então não será necessário a criação de domínios virtuais, autenticação em bancos de dados externos nem a instalação de serviços de recebimento de e-mail como POP e IMAP.
+
Neste tutorial será mostrado como configurar um servidor de e-mails usando Postfix, a proposta de uso deste servidor é apenas para envio de notificações de sistemas internos (Zabbix, Moodle, Booked Scheduler, Scan-to-mail das impressoras) sem a intenção de disponibilizar o serviço SMTP para usuários, então não será necessário a criação de domínios virtuais, autenticação em bancos de dados externos nem a instalação de serviços de recebimento de e-mail como POP e IMAP.
  
 
== Informações iniciais==
 
== Informações iniciais==
Linha 23: Linha 23:
  
 
Na próxima janela "nome de email" digite:
 
Na próxima janela "nome de email" digite:
  exemplo.com.br
+
  email.exemplo.com.br
  
 
== Configuração ==
 
== Configuração ==
 +
 +
Edite o arquivo de configuração /etc/postfix/main.cf
 +
 +
smtpd_banner = $myhostname ESMTP $mail_name
 +
biff = no
 +
append_dot_mydomain = no
 +
readme_directory = no
 +
# TLS parameters
 +
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
 +
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
 +
smtpd_use_tls=yes
 +
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
 +
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
 +
smtpd_tls_CApath = /etc/ssl/certs
 +
myhostname = email.exemplo.com.br
 +
alias_maps = hash:/etc/aliases
 +
alias_database = hash:/etc/aliases
 +
myorigin = /etc/mailname
 +
mydestination = email.exemplo.com.br, localhost.exemplo.com.br, localhost
 +
# clientes cadastrados em mynetworks podem enviar emails sem autenticacao:
 +
mynetworks = 192.0.2.0/24, localhost
 +
relayhost =
 +
mailbox_command = procmail -a "$EXTENSION"
 +
mailbox_size_limit = 0
 +
recipient_delimiter = +
 +
inet_interfaces = all
 +
# Politicas de segunranca.
 +
smtpd_relay_restrictions = permit_mynetworks
 +
                        permit_sasl_authenticated defer_unauth_destination
 +
# Rejeitar e-mails de dominios que nao existem
 +
smtp_sender_restrictions = reject_unknown_sender_domain,
 +
                        reject_non_fqdn_sender
 +
## Utilizadores locais podem enviar e-mails para qualquer endereco
 +
smtpd_recipient_restrictions = permit_sasl_authenticated,
 +
                        permit_mynetworks,
 +
                        reject_unauth_destination
 +
# Delay para e-mails com o mesmo dominio de destino, para evitar congestionamento, valor em segundos.
 +
default_destination_rate_delay = 1
 +
 +
Com esta configuração básica, já é possível realizar o primeiro teste de envio com o comando:
 +
 +
# echo "body of your email" | mail -s "This is a Subject" -a "From: envio@exemplo.com.br" destino@destino.com
 +
 +
e observe o arquivo de log para monitorar o envio:
 +
 +
# tail -f /var/log/mail.log
 +
 +
Se houver um firewall na rede, libere a porta '''25 de SAÍDA''' para qualquer IP de destino, '''não libere a porta 25 de entrada''' caso contrário você estará assumindo uma falha de segurança chamado Open Relay.
 +
 +
== Evitar que seu e-mail caia no SPAM ==
 +
 +
É possível que seu e-mail de teste caia na caixa de spam do destinatário, ou pior, o IP do seu servidor cair em uma blacklist de servidores Spammers, isto ocorre pois alguns servidores de e-mail (Gmail, Terra, Outlook entre outros) utilizam algumas políticas rigorosas para o controle de spam, para resolver o problema é necessário implementar alguns métodos de segurança.
 +
 +
Para tornar o servidor confiável aos olhos do servidor destinatário é preciso de 4 componentes:
 +
* rDNS (DNS Reverso)
 +
* SPF
 +
* DKIM
 +
* DMARC
 +
 +
=== rDNS <ref>https://wiki.canoas.ifrs.edu.br/index.php/DNS</ref> ===
 +
 +
Acesse o seu servidor de DNS e configure a zona exemplo.com.br inserindo o seguinte registro:
 +
email  IN    A          192.0.2.4
 +
email  IN    AAAA      2001:0DB8::4
 +
email  IN    MX    1    email.exemplo.com.br.
 +
 +
na zona reversa IPv4 2.0.192.in-addr.arpa insira:
 +
4      IN    PTR        email.exemplo.com.br.
 +
 +
e zona reversa IPv6 0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa insira:
 +
4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0      IN    PTR        email.exemplo.com.br.
 +
 +
De fora de sua rede, utilize o seguinte comando para verificar se o DNS reverso esta configurado corretamente:
 +
dig -x 192.0.2.4 @IP.SERVIDOR.DNS
 +
 +
Se retornar email.exemplo.com.br esta funcionando corretamente, se não funcionar vide [[ DNS#Observa.C3.A7.C3.B5es | Servidor de DNS reverso]].
 +
 +
=== SPF<ref>https://help.ubuntu.com/community/Postfix/SPF</ref> ===
 +
SPF é uma tecnologia para combater a falsificação de endereços de retorno dos emails (return-path). O mecanismo permite ao administrador de um domínio defina uma política SPF, onde são designados os endereços das máquinas autorizadas a enviar mensagens em nome do seu domínio e estabelecer critérios de aceitação de mensagens em função da checagem das políticas SPF publicadas.<ref>http://antispam.br/admin/spf/</ref>
 +
 +
Instale o pacote com o comando:
 +
# apt-get install postfix-policyd-spf-perl
 +
 +
Adicione o parâmetro abaixo no arquivo /etc/postfix/main.cf
 +
policy-spf_time_limit = 3600s
 +
 +
e adicione o valor
 +
check_policy_service unix:private/policy-spf
 +
 +
no final do parâmetro smtpd_recipient_restrictions, exemplo abaixo:
 +
 +
smtpd_recipient_restrictions = permit_sasl_authenticated,
 +
                        permit_mynetworks,
 +
                        reject_unauth_destination,
 +
                        check_policy_service unix:private/policy-spf
 +
 +
Adicione as seguintes linhas no arquivo /etc/postfix/master.cf
 +
policy-spf  unix  -      n      n      -      -      spawn
 +
        user=nobody argv=/usr/sbin/postfix-policyd-spf-perl
 +
 +
Pra finalizar, no servidor de DNS o seguinte registro do tipo TXT na zona exemplo.com.br, informando o IP do servidor de e-mail autorizado a usar o domínio exemplo.com.br como remetente:
 +
 +
email    IN      TXT    "v=spf1 ip6:2001:0DB8::4 ip4:192.0.2.4 -all"
 +
 +
=== DKIM <ref>https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy</ref> ===
 +
# apt-get install opendkim opendkim-tools
 +
 +
Edite o arquivo /etc/opendkim.conf
 +
 +
AutoRestart            Yes
 +
AutoRestartRate        10/1h
 +
UMask                  002
 +
Syslog                  yes
 +
SyslogSuccess          Yes
 +
LogWhy                  Yes
 +
Canonicalization        relaxed/simple
 +
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
 +
InternalHosts          refile:/etc/opendkim/TrustedHosts
 +
KeyTable                refile:/etc/opendkim/KeyTable
 +
SigningTable            refile:/etc/opendkim/SigningTable
 +
Mode                    sv
 +
PidFile                /var/run/opendkim/opendkim.pid
 +
Socket                  inet:12345@localhost
 +
SignatureAlgorithm      rsa-sha256
 +
OversignHeaders        From
 +
 +
Edite o arquivo /etc/default/opendkim e altere para:
 +
SOCKET="inet:12345@localhost"
 +
 +
No arquivo de configuração /etc/postfix/main.cf acrescente os parâmetros abaixo:
 +
milter_protocol = 2
 +
milter_default_action = accept
 +
 +
Para melhor organização crie um diretório opendkim e criar os arquivos abaixo:
 +
# mkdir /etc/opendkim
 +
# touch /etc/opendkim/TrustedHosts
 +
# touch /etc/opendkim/KeyTable
 +
# touch /etc/opendkim/SigningTable
 +
# touch /etc/opendkim/keys
 +
 +
No arquivo /etc/opendkim/TrustedHosts adicione os hosts que podem enviar e-mails assinados:
 +
localhost
 +
email.exemplo.com.br
 +
 +
Gerar chave privada e pública com o comando:
 +
opendkim-genkey -s seletor -d exemplo.com.br
 +
 +
Salve a chave privata seletor.private na pasta /etc/opendkim/keys e proteja o acesso:
 +
chown opendkim:opendkim seletor.private
 +
 +
Edite o arquivo de tabela de chaves /etc/opendkim/KeyTable
 +
seletor._domainkey.exemplo.com.br exemplo.com.br:seletor:/etc/opendkim/keys/exemplo.com.br/seletor.private
 +
 +
Edite a tabela de assinaturas /etc/opendkim/SigningTable
 +
*@exemplo.com.br seletor._domainkey.exemplo.com.br
 +
 +
Pra finalizar adicione no servidor de DNS um registro do tipo TXT constando a chave pública gerada pelo comando opendkim-genkey, arquivo seletor.txt:
 +
seletor._domainkey  IN    TXT "v=DKIM1\; k=rsa\; p=ADDLLSKKCKAKSSSKALS..."
 +
 +
Reinicie os serviços:
 +
# systemctl restart postfix
 +
# systemctl restart opendkim
 +
 +
Realize um teste de envio de e-mail, para confirmar visualize o arquivo de log mail.log e verifique se a seguinte informação consta no log  "DKIM-Signature field added"
 +
 +
=== DMARC ===
 +
 +
=== Testes ===
 +
https://www.mail-tester.com/
 +
== Cliente de e-mail ==
 +
=== PHPMailer ===
 +
$mail = new PHPMailer();
 +
$mail->Host = "IP.DO.SERVIDOR";
 +
$mail->SMTPKeepAlive = true;
 +
$mail->Debugoutput = 'html';
 +
$mail->IsSMTP();
 +
$mail->Port = 587;
 +
$mail->SMTPAutoTLS = true;
 +
$mail->SMTPSecure = 'tls';
 +
//$mail->SMTPDebug = 3;            // Opcional
 +
$mail->SMTPAuth = true;
 +
$mail->Username = "usuario";
 +
$mail->Password = "senha";
 +
$mail->CharSet = 'UTF-8';
 +
$mail->SetFrom('usuario@exemplo.com.br', 'Fulano');
 +
// $mail->AddReplyTo('email@exemplo.com.br', 'Ciclano');  // Opcional
 +
$mail->IsHTML(true);
 +
$mail->Subject  = "Assunto";
 +
$mail->setLanguage('pt-br');
 +
$mail->AltBody = "";
 +
$body = "Corpo do e-mail aqui";
 +
$mail->MsgHTML($body);
 +
$mail->AddAddress("e-mail do destinatário aqui");
 +
if (!$mail->Send())
 +
//erro
 +
else
 +
//sucesso
 +
 +
== Referências ==
 +
<references/>

Edição atual tal como às 08h51min de 19 de abril de 2018

Postfix

Neste tutorial será mostrado como configurar um servidor de e-mails usando Postfix, a proposta de uso deste servidor é apenas para envio de notificações de sistemas internos (Zabbix, Moodle, Booked Scheduler, Scan-to-mail das impressoras) sem a intenção de disponibilizar o serviço SMTP para usuários, então não será necessário a criação de domínios virtuais, autenticação em bancos de dados externos nem a instalação de serviços de recebimento de e-mail como POP e IMAP.

Informações iniciais

Domínio: exemplo.com.br

IPv4: 192.0.2.4

IPv6: 2001:0DB8::4

Hostname: email.exemplo.com.br

S.O.: Debian 8 (Jessie)

Versão do Postfix: 2.11.3

Instalação do Postfix

# apt-get install postfix

Ao apresentar a janela solicitando o tipo de configuração do servidor de e-mail, selecione:

Site da Internet

Na próxima janela "nome de email" digite:

email.exemplo.com.br

Configuração

Edite o arquivo de configuração /etc/postfix/main.cf

smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_CApath = /etc/ssl/certs
myhostname = email.exemplo.com.br
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = email.exemplo.com.br, localhost.exemplo.com.br, localhost
# clientes cadastrados em mynetworks podem enviar emails sem autenticacao:
mynetworks = 192.0.2.0/24, localhost
relayhost =
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
# Politicas de segunranca.
smtpd_relay_restrictions = permit_mynetworks
                       permit_sasl_authenticated defer_unauth_destination
# Rejeitar e-mails de dominios que nao existem
smtp_sender_restrictions = reject_unknown_sender_domain,
                       reject_non_fqdn_sender
## Utilizadores locais podem enviar e-mails para qualquer endereco
smtpd_recipient_restrictions = permit_sasl_authenticated,
                       permit_mynetworks,
                       reject_unauth_destination
# Delay para e-mails com o mesmo dominio de destino, para evitar congestionamento, valor em segundos.
default_destination_rate_delay = 1

Com esta configuração básica, já é possível realizar o primeiro teste de envio com o comando:

# echo "body of your email" | mail -s "This is a Subject" -a "From: envio@exemplo.com.br" destino@destino.com

e observe o arquivo de log para monitorar o envio:

# tail -f /var/log/mail.log

Se houver um firewall na rede, libere a porta 25 de SAÍDA para qualquer IP de destino, não libere a porta 25 de entrada caso contrário você estará assumindo uma falha de segurança chamado Open Relay.

Evitar que seu e-mail caia no SPAM

É possível que seu e-mail de teste caia na caixa de spam do destinatário, ou pior, o IP do seu servidor cair em uma blacklist de servidores Spammers, isto ocorre pois alguns servidores de e-mail (Gmail, Terra, Outlook entre outros) utilizam algumas políticas rigorosas para o controle de spam, para resolver o problema é necessário implementar alguns métodos de segurança.

Para tornar o servidor confiável aos olhos do servidor destinatário é preciso de 4 componentes:

  • rDNS (DNS Reverso)
  • SPF
  • DKIM
  • DMARC

rDNS [1]

Acesse o seu servidor de DNS e configure a zona exemplo.com.br inserindo o seguinte registro:

email  IN    A          192.0.2.4
email  IN    AAAA       2001:0DB8::4
email  IN    MX    1    email.exemplo.com.br.

na zona reversa IPv4 2.0.192.in-addr.arpa insira:

4      IN    PTR        email.exemplo.com.br.

e zona reversa IPv6 0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa insira:

4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0      IN    PTR        email.exemplo.com.br.

De fora de sua rede, utilize o seguinte comando para verificar se o DNS reverso esta configurado corretamente:

dig -x 192.0.2.4 @IP.SERVIDOR.DNS

Se retornar email.exemplo.com.br esta funcionando corretamente, se não funcionar vide Servidor de DNS reverso.

SPF[2]

SPF é uma tecnologia para combater a falsificação de endereços de retorno dos emails (return-path). O mecanismo permite ao administrador de um domínio defina uma política SPF, onde são designados os endereços das máquinas autorizadas a enviar mensagens em nome do seu domínio e estabelecer critérios de aceitação de mensagens em função da checagem das políticas SPF publicadas.[3]

Instale o pacote com o comando:

# apt-get install postfix-policyd-spf-perl

Adicione o parâmetro abaixo no arquivo /etc/postfix/main.cf

policy-spf_time_limit = 3600s

e adicione o valor

check_policy_service unix:private/policy-spf 

no final do parâmetro smtpd_recipient_restrictions, exemplo abaixo:

smtpd_recipient_restrictions = permit_sasl_authenticated,
                       permit_mynetworks,
                       reject_unauth_destination,
                       check_policy_service unix:private/policy-spf

Adicione as seguintes linhas no arquivo /etc/postfix/master.cf

policy-spf  unix  -       n       n       -       -       spawn
       user=nobody argv=/usr/sbin/postfix-policyd-spf-perl

Pra finalizar, no servidor de DNS o seguinte registro do tipo TXT na zona exemplo.com.br, informando o IP do servidor de e-mail autorizado a usar o domínio exemplo.com.br como remetente:

email    IN      TXT     "v=spf1 ip6:2001:0DB8::4 ip4:192.0.2.4 -all"

DKIM [4]

# apt-get install opendkim opendkim-tools

Edite o arquivo /etc/opendkim.conf

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes
Canonicalization        relaxed/simple
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
Socket                  inet:12345@localhost
SignatureAlgorithm      rsa-sha256
OversignHeaders         From

Edite o arquivo /etc/default/opendkim e altere para:

SOCKET="inet:12345@localhost"

No arquivo de configuração /etc/postfix/main.cf acrescente os parâmetros abaixo:

milter_protocol = 2
milter_default_action = accept

Para melhor organização crie um diretório opendkim e criar os arquivos abaixo:

# mkdir /etc/opendkim
# touch /etc/opendkim/TrustedHosts
# touch /etc/opendkim/KeyTable
# touch /etc/opendkim/SigningTable
# touch /etc/opendkim/keys

No arquivo /etc/opendkim/TrustedHosts adicione os hosts que podem enviar e-mails assinados:

localhost
email.exemplo.com.br

Gerar chave privada e pública com o comando:

opendkim-genkey -s seletor -d exemplo.com.br

Salve a chave privata seletor.private na pasta /etc/opendkim/keys e proteja o acesso:

chown opendkim:opendkim seletor.private

Edite o arquivo de tabela de chaves /etc/opendkim/KeyTable

seletor._domainkey.exemplo.com.br exemplo.com.br:seletor:/etc/opendkim/keys/exemplo.com.br/seletor.private

Edite a tabela de assinaturas /etc/opendkim/SigningTable

*@exemplo.com.br seletor._domainkey.exemplo.com.br

Pra finalizar adicione no servidor de DNS um registro do tipo TXT constando a chave pública gerada pelo comando opendkim-genkey, arquivo seletor.txt:

seletor._domainkey   IN    TXT "v=DKIM1\; k=rsa\; p=ADDLLSKKCKAKSSSKALS..."

Reinicie os serviços:

# systemctl restart postfix
# systemctl restart opendkim

Realize um teste de envio de e-mail, para confirmar visualize o arquivo de log mail.log e verifique se a seguinte informação consta no log "DKIM-Signature field added"

DMARC

Testes

https://www.mail-tester.com/

Cliente de e-mail

PHPMailer

$mail = new PHPMailer();
$mail->Host = "IP.DO.SERVIDOR";
$mail->SMTPKeepAlive = true;
$mail->Debugoutput = 'html';
$mail->IsSMTP();
$mail->Port = 587;
$mail->SMTPAutoTLS = true;
$mail->SMTPSecure = 'tls';
//$mail->SMTPDebug = 3;            // Opcional
$mail->SMTPAuth = true;
$mail->Username = "usuario";
$mail->Password = "senha";
$mail->CharSet = 'UTF-8';
$mail->SetFrom('usuario@exemplo.com.br', 'Fulano');
// $mail->AddReplyTo('email@exemplo.com.br', 'Ciclano');  // Opcional
$mail->IsHTML(true);
$mail->Subject  = "Assunto";
$mail->setLanguage('pt-br');
$mail->AltBody = "";
$body = "Corpo do e-mail aqui";
$mail->MsgHTML($body);
$mail->AddAddress("e-mail do destinatário aqui");
if (!$mail->Send()) 
//erro
else
//sucesso

Referências

  1. https://wiki.canoas.ifrs.edu.br/index.php/DNS
  2. https://help.ubuntu.com/community/Postfix/SPF
  3. http://antispam.br/admin/spf/
  4. https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy