DEV Community

Railander Marques
Railander Marques

Posted on • Updated on

Mail-in-a-Box (Relay AWS SES)

Introdução:

Mail-in-a-Box é uma solução de servidor de e-mail de código aberto projetada para simplificar a implantação e o gerenciamento de serviços de e-mail pessoais. Criado por Josh Tauberer, o Mail-in-a-Box visa oferecer uma alternativa fácil de configurar e manter em comparação com soluções de e-mail mais complexas.

Image description

A ideia principal por trás do Mail-in-a-Box é proporcionar a indivíduos e organizações a capacidade de configurar seu próprio servidor de e-mail com facilidade, sem a necessidade de conhecimentos avançados em administração de servidores. Algumas das ferramentas e características incluídas no Mail-in-a-Box são:

  1. Postfix: Um servidor de transferência de e-mail (MTA) que lida com a entrega de e-mails.
  2. Dovecot: Um servidor de e-mail IMAP e POP3, que permite que os usuários acessem suas mensagens remotamente.
  3. Roundcube: Uma interface web para acessar e-mails via navegador.
  4. SpamAssassin: Um filtro de spam que ajuda a reduzir a quantidade de mensagens indesejadas.
  5. OpenDKIM e SPF: Mecanismos de autenticação que ajudam a verificar a autenticidade dos e-mails enviados, reduzindo a probabilidade de serem marcados como spam.
  6. OwnCloud (opcional): Uma plataforma de nuvem que pode ser integrada para fornecer serviços adicionais, como armazenamento de arquivos e calendário.
  7. Automatização de Backups: O Mail-in-a-Box inclui um sistema de backup automático para proteger dados críticos via AWS S3.
  8. Configuração Simplificada: A instalação e configuração do Mail-in-a-Box são projetadas para serem simples e amigáveis para usuários que não possuem conhecimentos avançados em administração de servidores.

Link da Implementação: https://www.youtube.com/watch?v=eS0rbF2jS9I
Referência: https://mailinabox.email/


Requerimentos Mínimos:

  1. Hardware:
    • Um servidor dedicado ou uma máquina virtual com pelo menos 1 GB de RAM. (x64x86)
    • Atualmente o Mail-in-a-Box não fornece suporte para ARM.
  2. Sistema Operacional:
    • Ubuntu Server 22.04
  3. Conectividade e DNS:
    • Um nome de domínio registrado e funcional.
    • Um endereço IP estático vinculado ao seu servidor.
    • Controle total sobre os registros DNS do seu domínio.
  4. Portas Abertas:
    • As portas 25, 53, 80, 143, 443, 465, 587, 993, 995 e 4190 devem estar abertas no firewall do seu servidor.
  5. Recomendações Adicionais:
    • Um servidor SMTP externo pode ser útil para garantir a entrega de e-mails, já que alguns ISPs bloqueiam o tráfego SMTP doméstico, nesse caso usaremos somente o AWS SES.

Passo 1. Crie 2 buckets privados:

  1. mailserver-seudominio-backup
  2. mailserver-seudominio-nextcloud



Passo 2. Vamos subir uma EC2 com a seguinte configuração:

  • Escolha a imagem do Ubuntu Server 22 e uma instância adequada (por exemplo, t2.micro).
  • Na seção de Rede, selecione a VPC e a subnet pública desejada.
  • Na seção Security Group, crie um novo security group Exemplo: SG_Mail-in-a-Box com as seguintes regras na entrada:

    • 25 (SMTP): Email transfer service.
    • 53 (DNS): Domain Name System service (TCP e UDP).
    • 80 (HTTP): Standard HTTP traffic.
    • 143 (IMAP): Email access protocol.
    • 443 (HTTPS): Standard HTTPS traffic.
    • 465 (SMTPS): Secure email transfer service.
    • 587 (SMTP): Commonly used for secure email transmission.
    • 993 (IMAPS): Secure email access protocol.
    • 995 (POP3): Post Office Protocol version 3.
    • 4190 (Custom TCP): ManageSieve port.
  • Configurar 1 disco adicional inicialmente de 8 GB do tipo magnético como disco secundário para storage da ferramenta.

  • Adicione uma Role que dê acesso aos 2 buckets e acesso ao SSM (AmazonSSMManagedInstanceCore)

    • Exemplo de Role de acesso aos buckets:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ListAccessPointsForObjectLambda",
                "s3:GetAccessPoint",
                "s3:PutAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:CreateStorageLensGroup",
                "s3:ListJobs",
                "s3:PutStorageLensConfiguration",
                "s3:ListMultiRegionAccessPoints",
                "s3:ListStorageLensGroups",
                "s3:ListStorageLensConfigurations",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:ListAccessGrantsInstances",
                "s3:PutAccessPointPublicAccessBlock",
                "s3:CreateJob"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mailserver-seudominio-backup",
                "arn:aws:s3:::mailserver-seudominio-backup/*",
                "arn:aws:s3:::mailserver-seudominio-nextcloud",
                "arn:aws:s3:::mailserver-seudominio-nextcloud/*"
            ]
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode



Passo 3. Solicite um endereço de IP Elástico e atache ao servidor criado.

  • Na tabela de DNS faça um apontamento personalizado para seu servidor de emails.
    • Exemplo:
    • mail.aldeiacloud.link > A > 54.xx.xx.xx
  • Volte na pagina de endereços de IP elasticos, selecione o ip do seu servidor > Actions > Update Reverse DNS.
    • Insira o apontamento criado na tabela de DNS e confirme.



Passo 4. Logue no servidor via SSH.

apt update  # ATUALIZAR LISTA DE PACOTES
apt upgrade  # ATUALIZAR SERVIDOR
timedatectl set-timezone America/Sao_Paulo    # AJUSTAR TIMEZONE PARA SP 
Enter fullscreen mode Exit fullscreen mode
  • Vamos fazer uma montagem do disco adicional. (Veja o vídeo na integra para auxílio a montagem)
    • Comandos Auxiliares para montagem:
  mkdir -p /mail/storage    # CRIAR PASTA PARA MONTAGEM DO STORAGE
  mkfs.xfs /dev/nvme1n1    # FORMATAÇÃO EM XFS NO DISCO AUXILIAR MAGNETICO
  mount /dev/nvme1n1 /mail/storage    # MONTAGEM DO DISCO
  blkid /dev/nvme1n1    # DESCOBRIR UUID DO DISCO
  vim /etc/fstab    # FAÇA A MONTAGEM DO DISCO SIMILAR A IMAGEM ABAIXO, USANDO SEU UUID
  chmod -R 755 /mail/storage    # DEFINIR PERMISSÕES CORRETAS PARA PASTA
Enter fullscreen mode Exit fullscreen mode

Image description

  • Vamos configurar um Swapfile:
  sudo fallocate -l 1G /swapfile    # CRIAR ARQUIVO DE 1G PARA SWAP
  sudo chmod 600 /swapfile    # AJUSTAR PERMISSÃO NO ARQUIVO SWAP
  sudo mkswap /swapfile    # CONFIGURAR AREA DE SWAP NO /swapfile
  sudo swapon /swapfile    # HABILITA AREA DE SWAP NO /swapfile
  echo “/swapfile swap swap defaults 0 0“ >> /etc/fstab    # ADICIONAR ENTRADA NO FSTAB
Enter fullscreen mode Exit fullscreen mode

Image description

  • Declarar variáveis de ambiente para Mail-in-a-Box:
  export NONINTERACTIVE=true
  export SKIP_NETWORK_CHECKS=true
  export PUBLIC_IPV6=""
  export PRIVATE_IPV6=""
  export MTA_STS_MODE=enforce
  export PRIMARY_HOSTNAME="mail.aldeiacloud.link"
  export EMAIL_ADDR="admin@aldeiacloud.link"
  export EMAIL_PW=XXXXXX
  export NEXTCLOUD_S3_BUCKET=mailserver-seudominio-nextcloud
  export NEXTCLOUD_S3_REGION=us-east-1
  export SMTP_RELAY_ENDPOINT="email-smtp.us-east-1.amazonaws.com"
  export SMTP_RELAY_PORT=587
  export SMTP_RELAY_USER=XXXXXX-PROGRAMATICA-XXXXXX
  export SMTP_RELAY_PASSWORD=XXXXXX-SECRET-ACCESS-KEY-XXXXXX
  export STORAGE_ROOT=/mail/storage
  curl -s https://mailinabox.email/setup.sh | sudo -E bash
Enter fullscreen mode Exit fullscreen mode



Passo 5. Após a instalação, que irá demorar cerca de 10 minutos, faça o login de acordo com as instruções no terminal.

  • Logue com seu usuário admin@dominio.com.br
  • Adicione as entradas de DNS de DKIM do seu AWS SES usando o botão Set Record:

Image description

  • Configure o Backup do MailServer no Bucket S3:
    • Crie uma pasta dentro do bucket para armazenar os backups e aponte conforme a imagem;
    • Crie uma credencial programática para acesso ao bucket de backup e adicione nesta pagina;

Image description

  • Agora vá na guia External DNS e crie as entradas de acordo com as solicitações abaixo:

Image description

  • Faça o deploy do seu certificado ou aguarde a geração do certificado Lets Encrypt após os apontamentos na tabela de DNS ou adicione um certificado próprio.

Image description

Image description



Passo 6. Agora vamos configurar o postfix para envio de mensagens com o AWS SES.

  • vim /etc/postfix/main.cf
relayhost = [email-smtp.us-east-1.amazonaws.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = PLAIN LOGIN
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
smtp_tls_security_level = may
smtp_tls_note_starttls_offer = yes
Enter fullscreen mode Exit fullscreen mode
  • Adicionar no arquivo abaixo o endpoint do SES e a senha para autenticação:
    • vim /etc/postfix/sasl_passwd
[email-smtp.us-east-1.amazonaws.com]:587 AKIxxxxxxxxxxxxxx54N:BJUxxxxxxxxxxxxxxxxxxxxxxxxxxxxWw2
Enter fullscreen mode Exit fullscreen mode
  • Compilar as informações do sasl_passwd para o Postfix usar e reinicie o serviço:
sudo postmap /etc/postfix/sasl_passwd
systemctl restart postfix
Enter fullscreen mode Exit fullscreen mode



Passo 7. Para alterar o logo do servidor de emails, altere os arquivos abaixo para o logo da sua preferencia em .svg

scp -i chave.pem logo.svg ubuntu@50.xx.xxx.110:/home/ubuntu   # SCP PARA ENVIO DO LOGO AO SERVIDOR
Enter fullscreen mode Exit fullscreen mode

Image description



Passo 8. Faça um redirect na página principal do servidor:

  • mail.dominio.com.br > mail.dominio.com.br/mail

Atualmente o arquivo esta dessa forma:
cat /mail/storage/www/default/index.html

Image description

Iremos alterar para esse código:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="0;url=/mail">
    <meta name="robots" content="noindex, nofollow">
    <title></title>
</head>
<body>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode



Passo 9. Configuração de segurança no Nginx:

  • X-Frame-Options: O cabeçalho X-Frame-Options é usado para controlar se um navegador deve ser permitido ou não incorporar uma página em um <frame>, <iframe>, <embed> ou <object>. Neste caso, a configuração "SAMEORIGIN" indica que a página só pode ser exibida em um frame se o documento que contém o header X-Frame-Options estiver no mesmo domínio. Isso ajuda a prevenir ataques como clickjacking, onde uma página é exibida dentro de um frame sem o conhecimento do usuário.
  • X-Content-Type-Options: O cabeçalho X-Content-Type-Options é usado para prevenir ataques de tipo MIME sniffing. A configuração "nosniff" instrui o navegador a não realizar a detecção de tipo MIME e usar o tipo de conteúdo fornecido pelo servidor. Isso ajuda a mitigar possíveis ataques que exploram falhas na interpretação do tipo MIME pelo navegador.
  • Content-Security-Policy (CSP): O cabeçalho Content-Security-Policy (CSP) é uma política de segurança que ajuda a mitigar riscos de ataques de Cross-Site Scripting (XSS) e outros ataques de injeção de código. A configuração fornecida define uma política que permite que determinados tipos de conteúdo sejam carregados apenas a partir do mesmo domínio ('self').

Abra o seguinte arquivo:
vim /etc/nginx/conf.d/local.conf

Adicione as linhas abaixo dentro do intervalo da porta 80 e na porta 443 conforme mostrado na figura abaixo:

Entradas:

add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self'; font-src 'self'; connect-src 'self'";
Enter fullscreen mode Exit fullscreen mode

Porta 80:
Image description

Porta 443:
Image description

Agora reinicie o servidor Nginx:
systemctl restart nginx



Pronto!
Seu servidor de e-mails esta pronto para ser usado!

Top comments (1)

Collapse
 
aldeiacloud profile image
Railander Marques • Edited

Caso desejem estabelecer uma retenção de e-mails para todos os usuários, por exemplo, uma retenção de 365 dias, utilizem o código abaixo:

#!/bin/bash

base_path="/mail/storage/mail/mailboxes/aldeiacloud.link/"
delete_period=365  # Altere para o número de dias desejado

# Verifica se o diretório base existe
if [ ! -d "$base_path" ]; then
  echo "O diretório base $base_path não existe."
  exit 1
fi

# Obtém a lista de usuários
users=($(ls "$base_path"))

# Função para limpar arquivos de uma pasta específica
limpar_pasta() {
  user=$1
  folder=$2

  path="${base_path}${user}/${folder}/"

  # Verificar se a pasta existe
  if [ -d "$path" ]; then
    # Listar arquivos do período especificado
    files_to_delete=$(find "$path" -type f -daystart -ctime +"$delete_period")

    # Exibir os arquivos encontrados
    echo "Arquivos a serem excluídos em $path:"
    echo "$files_to_delete"

    # Apagar os arquivos
    rm -f $files_to_delete

    echo "Arquivos excluídos com sucesso!"
  else
    echo "A pasta $path não existe para o usuário $user."
  fi
}

# Iterar sobre usuários e pastas
for user in "${users[@]}"; do
  limpar_pasta "$user" ".Archive"
  limpar_pasta "$user" ".Drafts"
  limpar_pasta "$user" ".Sent"
  limpar_pasta "$user" ".Spam"
  limpar_pasta "$user" ".Trash"
  limpar_pasta "$user" "cur"  # Caixa de entrada
done
Enter fullscreen mode Exit fullscreen mode

Adicionem este script ao /etc/crontab para execução diária. Quando completar 365 dias desde a criação de cada mensagem nas pastas especificadas no script, ela será apagada automaticamente, mantendo a retenção de 365 dias para cada mensagem. Este script busca as caixas de todos os usuários do servidor.