Construindo seu próprio servidor de correio com o FreeBSD 11

Executar o seu próprio servidor de email pode ser bastante gratificante. Você é responsável pelos seus dados. Também permite mais flexibilidade com suas opções de entrega. No entanto, existem alguns desafios. Você corre o risco de abrir seu servidor a vulnerabilidades, além de tornar seu servidor uma possível retransmissão para uso de spammers.

Com isso fora do caminho, vamos começar a executar nosso próprio servidor de correio.

visão global

Existem três partes de software necessárias para instalação que não estão incluídas no sistema básico do FreeBSD:

  • OpenSMTPd
  • Dovecot
  • spamd

O OpenSMTPd é um agente de transferência de mensagens (MTA) e um agente de entrega de mensagens (MDA). Isso significa que ele pode se comunicar com outros servidores de correio pelo SMTPprotocolo e também manipula a entrega de correio nas caixas de correio dos usuários individuais. Estaremos configurando o OpenSMTPd para que ele possa se comunicar com servidores externos (filtrados por spamd) e entregar mensagens para usuários locais, bem como entregar mensagens locais de usuário para usuário.

Dovecot é um MDA que lê caixas de correio locais e as envia por IMAP ou POP3 para os usuários. Ele usará as caixas de correio dos usuários locais para veicular esse conteúdo.

Spamd é um serviço de filtragem de correio. Podemos encaminhar e-mails através de spamd, e ele filtrará os e-mails com base em uma variedade de listas negras, whitelists e greylist.

A ideia geral para este servidor de correio requer alguns caminhos diferentes:

Outside world -> Firewall -> spamd -> OpenSMTPD -> User mail boxes
Outside world -> Firewall (spamd-whitelist) -> OpenSMTPD -> User mailboxes
Outside world -> Firewall (IMAP/POP3) -> Dovecot
Outside world -> Firewall (SMTPD submission)

Neste tutorial, usaremos a versão FreeBSD do PF do OpenBSD para nosso firewall. Você também pode usar ipfw, onde a configuração é muito semelhante.

Nota: O Vultr, por padrão, bloqueia a porta 25, que é usada pelos servidores SMTP em qualquer lugar. Se você deseja executar um servidor de email totalmente funcional, terá que abrir essa porta.

Configuração inicial

Primeiro, precisamos instalar os programas necessários.

Supondo que você esteja executando como usuário com acesso ao sudo configurado, podemos executar os seguintes comandos. Eles variarão dependendo de você estar usando portas ou pacotes.

Pacotes (recomendado)

A menos que você precise de funcionalidade específica incorporada nesses utilitários, é recomendável instalar via pacotes. É mais fácil, leva menos tempo e recursos do servidor e fornece uma interface intuitiva e amigável.

sudo pkg install opensmtpd dovecot spamd

Os seguintes makecomandos fornecerão muitas opções de compilação, os padrões funcionarão bem. Não as altere, a menos que saiba exatamente o que está fazendo.

sudo portsnap fetch update   # or run portsnap fetch extract if using ports for the first time
cd /usr/ports/mail/opensmtpd  
make install  # Installs openSMTPd
make clean
cd /usr/ports/mail/dovecot
make install  # Installs dovecot
make clean
cd /usr/ports/mail/spamd
make install  # Installs spamd
make clean

Precisamos adicionar as seguintes linhas em /etc/rc.conf:

pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"

obspamd_enable="YES"
obspamd_flags="-v"
obspamlogd_enable="YES"

dovecot_enable="YES"

Configuração do Firewall

Para configurar o PF, podemos criar o nosso /usr/local/etc/pf.conf:

## Set public interface ##
ext_if="vtnet0"

## set and drop IP ranges on the public interface ##
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
          10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
          0.0.0.0/8, 240.0.0.0/4 }"

table <spamd> persist
table <spamd-white> persist

# Whitelisted webmail services
table <webmail> persist file "/usr/local/etc/pf.webmail.ip.conf"

## Skip loop back interface - Skip all PF processing on interface ##
set skip on lo

## Sets the interface for which PF should gather statistics such as bytes in/out and packets passed/blocked ##
set loginterface $ext_if

# Deal with attacks based on incorrect handling of packet fragments 
scrub in all


# Pass spamd whitelist
pass quick log on $ext_if inet proto tcp from <spamd-white> to $ext_if port smtp \
    -> 127.0.0.1 port 25
# Pass webmail servers
rdr pass quick log on $ext_if inet proto tcp from <gmail> to $ext_if port smtp \
    -> 127.0.0.1 port 25
# pass submission messages.
pass quick log on $ext_if inet proto tcp from any to $ext_if port submission modulate state
# Pass unknown mail to spamd
rdr pass log on $ext_if inet proto tcp from {!<spamd-white> <spamd>} to $ext_if port smtp \
    -> 127.0.0.1 port 8025 

## Blocking spoofed packets
antispoof quick for $ext_if

## Set default policy ##
block return in log all
block out all

# Drop all Non-Routable Addresses 
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians

pass in inet proto tcp to $ext_if port ssh

# Allow Ping-Pong stuff. Be a good sysadmin 
pass inet proto icmp icmp-type echoreq

# Open up imap/pop3 support
pass quick on $ext_if proto tcp from any to any port {imap, imaps, pop3, pop3s} modulate state


# Allow outgoing traffic
pass out on $ext_if proto tcp from any to any modulate state
pass out on $ext_if proto udp from any to any keep state

Esta é uma configuração de PF em funcionamento. É relativamente simples, mas há algumas peculiaridades a serem explicadas também.

Em primeiro lugar, definimos nossa $ext_ifvariável para o nosso vtnet0dispositivo usar mais tarde. Também definimos endereços IP inválidos que devem ser descartados na interface externa.

Também definimos duas tabelas spamde spamd-white- essas duas tabelas são criadas por spamd em sua configuração padrão. Também definimos uma tabela com o nome webmailque usaremos para permitir a passagem de alguns dos principais provedores de webmail.

Para visualizar uma tabela, você pode usar o comando pfctl -t tablename -T showpara listar os elementos em uma tabela.

Definimos algumas regras de PF: pule o processamento na interface local, habilite as estatísticas na interface externa e limpe os pacotes recebidos.

A seguir, é uma das partes mais importantes, onde gerenciamos o envio de nosso tráfego para spam ou OpenSMTPd.

A primeira é uma regra de redirecionamento (observe a sintaxe aqui, o FreeBSD 11 usa a sintaxe PF do estilo antigo (pré-OpenBSD 4.6), portanto a sintaxe pode parecer estranha. Se recebermos algo no smtp de um host listado na spamdtabela ou não listado em a spamd-whitemesa, nós redirecionamos a conexão até o daemon spamd, que lida com estas ligações. as próximas três regras são regras de passagem para que possamos realmente receber mail. Passamos por mensagens dos IPs listados na spamd-whitee as webmailmesas direto para OpenSMTPd. Também aceitamos mensagens na porta de envio ( 587).

Depois, existem algumas regras de limpeza para definir nossa política padrão e aceitar mensagens SSH e ICMP.

Passamos o IMAP e o POP3 em nossa interface externa para acessar o Dovecot.

Por fim, permitimos todo o tráfego de saída. Se você quiser adicionar segurança extra, poderá limitar as portas pelas quais passa, mas para um servidor de uso único, não é um problema passar tudo.

Iniciar PF:

sudo service pf start

Agora que temos nossa configuração de firewall, podemos seguir para a configuração do servidor de correio.

OpenSMTPd

O OpenSMTPd possui uma sintaxe de configuração muito simples e fácil de ler. Uma configuração de trabalho inteira pode caber em 14 linhas, como você pode ver abaixo:

#This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.

ext_if=vtnet0

# If you edit the file, you have to run "smtpctl update table aliases"
table aliases   file:/etc/mail/aliases
table domains   file:/etc/mail/domains

# Keys
pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"
# If you want to listen on multiple subdomains (e.g. mail.davidlenfesty) you have to add more lines
# of keys, and more lines of listeners

# Listen for local SMTP connections
listen on localhost hostname mail.example.com

# listen for filtered spamd connections
listen on lo0 port 10026

# Listen for submissions
listen on $ext_if port 587 tls-require auth pki mail.example.com tag SUBMITTED

# Accept mail from external sources.
accept from any for domain <domains> alias <aliases> deliver to maildir "~/mail"

accept for local alias <aliases> deliver to maildir "~/mail"
accept from local for any relay tls
accept tagged SUBMITTED for any relay tls

Primeiramente, definimos novamente nossa interface externa, bem como algumas tabelas, aliases e domínios. Em seguida, passamos à chave e ao certificado SSL para todos os domínios nos quais queremos lidar com o correio.

Na próxima seção, definimos as interfaces e portas nas quais queremos ouvir. Em primeiro lugar, ouvimos no localhost o nosso mail.example.comdomínio, as conexões locais. Em seguida, ouvimos nossas mensagens filtradas por spam e as mensagens enviadas na interface externa. Por fim, ouvimos envios, eles acontecem no porto 587e exigimos que eles sejam autenticados, por razões de segurança.

Por fim, são as nossas acceptconfigurações. Aceitamos qualquer mensagem de qualquer um dos nossos domínios definidos em nossa domainstabela para aliases em nossa aliasestabela, para entrega em seu diretório pessoal no maildirformato Em seguida, aceitamos todas as conexões locais para caixas de correio locais e retransmitimos nossas mensagens, para que possamos enviar email. Por fim, aceitamos nossas mensagens enviadas para retransmitir. Se não exigíssemos autenticação para nossa porta de envios, isso seria um grande risco à segurança. Isso permitiria que qualquer pessoa usasse nosso servidor como retransmissão de spam.

Apelido

O FreeBSD é enviado com um arquivo de alias padrão /etc/mail/aliasesno seguinte formato:

vuser1:  user1
vuser2:  user1
vuser3:  user1
vuser4:  user2

Isso define as diferentes caixas de correio e para onde queremos encaminhar as mensagens enviadas para essas caixas de correio definidas. Podemos definir nossos usuários como usuários do sistema local ou caixas de correio externas para encaminhar. O arquivo padrão do FreeBSD é bastante descritivo, portanto você pode consultá-lo como referência.

Domínios

O FreeBSD não fornece um arquivo de domínios padrão, mas é incrivelmente simples:

# Domains
example.com
mail.example.com
smtp.example.com

Este é apenas um arquivo de texto simples com cada domínio que você deseja ouvir em uma nova linha. Você pode fazer um comentário usando o #símbolo. Este arquivo existe simplesmente para que você possa usar menos linhas de configuração.

Certificados SSL

Existem duas maneiras de proteger suas comunicações com o servidor de correio, certificados autoassinados e assinados. Certamente é possível assinar seus certificados automaticamente, no entanto, serviços como o Let's Encrypt fornecem assinatura gratuita e incrivelmente fácil de usar.

Primeiro, temos que instalar o programa certbot.

sudo pkg install py-certbot

Como alternativa, ele pode ser instalado com portas:

cd /usr/ports/security/py-certbot
make install
make clean

Em seguida, para obter seu certificado, verifique se você abriu a porta 80em sua interface externa. Adicione as seguintes linhas em algum lugar das suas regras de filtragem em /usr/local/etc/pf.conf:

pass quick on $ext_if from any to any port http

Em seguida, execute pfctl -f /usr/local/etc/pf.confpara recarregar o conjunto de regras.

Em seguida, você pode executar o comando para qualquer domínio para o qual deseja obter um certificado:

certbot certonly --standalone -d mail.example.com

É recomendável configurar uma entrada do crontab para ser executada a certbot renewcada 6 meses para garantir que seus certificados não expirem.

Então, para cada domínio relevante, você pode modificar as linhas para apontar para o arquivo de chave correto:

pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"

Edite os valores mobiliários:

sudo chmod 700 /usr/local/etc/letsencrypt/archive/mail.example.com/*

Nota: Você precisará fazer isso para cada arquivo-chave original, caso contrário o OpenSMTPd não os abrirá.

Agora podemos iniciar o serviço:

sudo service smtpd start

Configurando spamd

Aqui estamos usando o daemon de spam do OpenBSD para reduzir a quantidade de spam que recebemos da internet. Essencialmente, isso filtra as mensagens dos IPs conhecidas como ruins de várias fontes de spam, bem como (por padrão) as conexões de entrada "lista cinza". O Spamd também tenta desperdiçar o tempo do spammer "gaguejando" as conexões na lista negra e na lista de cinza, o que significa que espalha sua resposta por vários segundos, o que força o cliente a permanecer aberto por mais tempo do que o habitual.

A conexão em lista cinza é feita quando um novo endereço IP é conectado que não está em nenhuma lista negra ou lista branca. Depois que o novo endereço é conectado, o spamd descarta a mensagem com uma mensagem de erro inocente e a adiciona a uma lista temporária. Como os spammers são pagos pelas mensagens entregues, eles não tentarão novamente um erro, enquanto um serviço legítimo tentará novamente em breve.

Você precisará executar o seguinte para montar fdescfs:

mount -t fdescfs null /dev/fd

Então você terá que adicionar esta linha a /etc/fstab:

fdescfs     /dev/fd     fdescfs rw      0       0

O arquivo de configuração padrão (encontrado em /usr/local/etc/spamd/spamd.conf.sample) funcionará bem. Você pode editá-lo para adicionar novas fontes ou alterar as fontes usadas:

sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf

Podemos iniciar o serviço com o seguinte:

sudo service obspamd start

Neste ponto, o spamd está configurado.

Habilitando os Serviços de Webmail

Um problema com a abordagem de lista cinza é que serviços de email grandes geralmente enviam emails por meio de um dos muitos spools diferentes, e você não garante que o mesmo servidor envie a mensagem todas as vezes. Uma solução para isso é colocar na lista branca os intervalos de IP usados ​​por vários serviços de webmail. É para isso que a tabela de webmail é usada na configuração do PF. Essa estratégia pode sair pela culatra se você incluir um endereço IP usado por um remetente de spam, mas contanto que você tenha cuidado com os intervalos que você coloca na tabela, ficará bem.

Para adicionar um intervalo de email à tabela de webmail, você pode executar o seguinte comando:

pfctl -t webmail -T add 192.0.2.0/24

Dovecot

Se você deseja que os usuários acessem seus e-mails sem fazer login via SSH, precisará de um MDA compatível com IMAP e / ou POP3. Um programa muito popular é o Dovecot, com uma configuração bastante simples e recursos poderosos.

Podemos copiar a configuração padrão:

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

A configuração é composta por vários arquivos diferentes. Para ver as diferenças entre sua configuração e os padrões dovecot, execute o comando abaixo:

sudo doveconf -n

A seguir, é apresentada uma configuração simples e funcional:

# 2.3.2.1 (0719df592): /usr/local/etc/dovecot/dovecot.conf
# OS: FreeBSD 11.2-RELEASE amd64  
# Hostname: mail.example.com
hostname = mail.example.com
mail_location = maildir:~/mail
namespace inbox {
  inbox = yes
  location = 
  mailbox Archive {
    auto = create
    special_use = \Archive
  }
  mailbox Archives {
    auto = create
    special_use = \Archive
  }
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = create
    autoexpunge = 60 days
    special_use = \Junk
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox "Sent Mail" {
    auto = no
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    auto = no
    special_use = \Sent
  }
  mailbox Spam {
    auto = no
    special_use = \Junk
  }
  mailbox Trash {
    auto = no
    autoexpunge = 90 days
    special_use = \Trash
  }
  prefix = 
  separator = /
}
passdb {
  args = imap
  driver = pam
}
ssl = required
ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_dh = </usr/local/etc/dovecot/dh.pem
ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem
userdb {
  driver = passwd
}

A maioria dos arquivos de configuração estará em conf.d

Os mais importantes são 10-auth.conf, 10-mail.confe 10-ssl.conf.

Você pode configurar as diferentes caixas de correio usadas 15-mailboxes.conf. O que você vê acima é uma boa configuração para muitos sistemas, mas sua milhagem pode variar. É recomendável que você brinque com isso com o maior número possível de clientes.

Autenticação

A maioria das configurações padrão estará correta. Se você deseja usar os usuários do sistema para autenticar, precisará editar 10-auth.conf.

Remova o comentário da seguinte linha:

! inclua auth-system.conf.ext

Criptografia

Temos que gerar parâmetros Diffie-Hellman:

sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem

Nota: Isso levará muito tempo para ser executado. Muito mais tempo do que você poderia esperar.

Agora podemos iniciar o Dovecot:

sudo service dovecot start

Conclusão

Neste ponto, temos um servidor de correio funcional, seguro e relativamente livre de spam.

Mais algumas coisas a serem analisadas a partir daqui estão usando o SpamAssassin para se livrar do spam de forma heurística, além de encontrar mais listas negras de spam publicadas por fontes confiáveis.


Tags: #BSD #Email

Leave a Comment

A IA pode lutar contra o aumento do número de ataques de ransomware

A IA pode lutar contra o aumento do número de ataques de ransomware

Os ataques de ransomware estão aumentando, mas a IA pode ajudar a lidar com os vírus de computador mais recentes? AI é a resposta? Leia aqui para saber se é AI boone ou bane

ReactOS: Este é o futuro do Windows?

ReactOS: Este é o futuro do Windows?

ReactOS, um sistema operacional de código aberto e gratuito está aqui com a versão mais recente. Será que ela pode atender às necessidades dos usuários modernos do Windows e derrubar a Microsoft? Vamos descobrir mais sobre esse estilo antigo, mas uma experiência de sistema operacional mais recente.

Fique conectado por meio do aplicativo WhatsApp Desktop 24 * 7

Fique conectado por meio do aplicativo WhatsApp Desktop 24 * 7

O Whatsapp finalmente lançou o aplicativo Desktop para usuários de Mac e Windows. Agora você pode acessar o Whatsapp do Windows ou Mac facilmente. Disponível para Windows 8+ e Mac OS 10.9+

Como a IA pode levar a automação de processos ao próximo nível?

Como a IA pode levar a automação de processos ao próximo nível?

Leia isto para saber como a Inteligência Artificial está se tornando popular entre as empresas de pequena escala e como está aumentando as probabilidades de fazê-las crescer e dar vantagem a seus concorrentes.

A atualização do suplemento do macOS Catalina 10.15.4 está causando mais problemas do que resolvendo

A atualização do suplemento do macOS Catalina 10.15.4 está causando mais problemas do que resolvendo

Recentemente, a Apple lançou o macOS Catalina 10.15.4, uma atualização suplementar para corrigir problemas, mas parece que a atualização está causando mais problemas, levando ao bloqueio de máquinas mac. Leia este artigo para saber mais

13 Ferramentas de Extração de Dados Comerciais de Big Data

13 Ferramentas de Extração de Dados Comerciais de Big Data

13 Ferramentas de Extração de Dados Comerciais de Big Data

O que é um sistema de arquivos de registro no diário e como ele funciona?

O que é um sistema de arquivos de registro no diário e como ele funciona?

Nosso computador armazena todos os dados de uma maneira organizada conhecida como sistema de arquivos Journaling. É um método eficiente que permite ao computador pesquisar e exibir arquivos assim que você clicar em search.https: //wethegeek.com/? P = 94116 & preview = true

Singularidade tecnológica: um futuro distante da civilização humana?

Singularidade tecnológica: um futuro distante da civilização humana?

À medida que a ciência evolui em um ritmo rápido, assumindo muitos de nossos esforços, os riscos de nos sujeitarmos a uma singularidade inexplicável também aumentam. Leia, o que a singularidade pode significar para nós.

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

O impacto da inteligência artificial na saúde 2021

O impacto da inteligência artificial na saúde 2021

A IA na área da saúde deu grandes saltos nas últimas décadas. Portanto, o futuro da IA ​​na área da saúde ainda está crescendo dia a dia.