DEV Community

Railander Marques
Railander Marques

Posted on • Edited on

1

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">
    <meta name="referrer" content="strict-origin-when-cross-origin">
    <meta name="theme-color" content="#000000">
    <title>Redirecionando para Mail</title>

    <style>
        /* Verifica o esquema de cores do sistema e ajusta a cor de fundo */
        body {
            background-color: #ffffff; /* Cor de fundo clara padrão */
            color: #000000; /* Texto escuro padrão */
            font-family: Arial, sans-serif;
            text-align: center;
            padding: 20px;
        }

        /* Estilo para o modo escuro */
        @media (prefers-color-scheme: dark) {
            body {
                background-color: #121212; /* Cor de fundo escura */
                color: #ffffff; /* Texto claro */
            }
        }
    </style>
</head>
<body>
    <noscript>
        <meta http-equiv="refresh" content="0;url=/mail">
        <p>JavaScript está desativado. Você será redirecionado automaticamente em 0 segundos. Caso isso não aconteça, <a href="/mail">clique aqui</a>.</p>
    </noscript>
    <p>Você será redirecionado para a página de login em breve. Caso isso não aconteça, <a href="/mail">clique aqui</a>.</p>
</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 (2)

Collapse
 
aldeiacloud profile image
Railander Marques • Edited

Recomendo colocar uma tratativa no local.conf do nginx para retornar a url padrão em caso de pagina 404.

Adicione as linhas abaixo da sessão "server" da porta 443:
vim /etc/nginx/conf.d/local.conf

# Tratamento de erro 404 - Redireciona para a raiz
error_page 404 = @redirect_to_root;

location @redirect_to_root {
    return 301 /; # Redireciona para a raiz
}
Enter fullscreen mode Exit fullscreen mode
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.

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more