Mail-in-a-Box (Relay AWS SES)
Railander Marques
Posted on January 11, 2024
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.
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:
- Postfix: Um servidor de transferência de e-mail (MTA) que lida com a entrega de e-mails.
- Dovecot: Um servidor de e-mail IMAP e POP3, que permite que os usuários acessem suas mensagens remotamente.
- Roundcube: Uma interface web para acessar e-mails via navegador.
- SpamAssassin: Um filtro de spam que ajuda a reduzir a quantidade de mensagens indesejadas.
- 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.
- OwnCloud (opcional): Uma plataforma de nuvem que pode ser integrada para fornecer serviços adicionais, como armazenamento de arquivos e calendário.
- Automatização de Backups: O Mail-in-a-Box inclui um sistema de backup automático para proteger dados críticos via AWS S3.
- 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:
-
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.
-
Sistema Operacional:
- Ubuntu Server 22.04
-
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.
-
Portas Abertas:
- As portas 25, 53, 80, 143, 443, 465, 587, 993, 995 e 4190 devem estar abertas no firewall do seu servidor.
-
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:
mailserver-seudominio-backup
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/*"
]
}
]
}
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
- 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
- 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
- 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
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:
- 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;
- Agora vá na guia External DNS e crie as entradas de acordo com as solicitações abaixo:
- 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.
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
- 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
- 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
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
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
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>
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'";
Agora reinicie o servidor Nginx:
systemctl restart nginx
Pronto!
Seu servidor de e-mails esta pronto para ser usado!
- Check X-Content-Type-Options:
- Check X-Frame-Options Header:
- Check CSP (Content-Security-Policy):
Posted on January 11, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.