Mail-in-a-Box (Relay AWS SES)
Tags: mailserver, opensource, ses, aws
Published: 2024-01-11 20:11:19

**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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0pdn3tsr13l1bmucgan.png)

> 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.

<br>
> 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`

<br> 
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**:

```json
{
    "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/*"
            ]
        }
    ]
}
```

<br> 
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.

<br> 
Passo 4. **Logue no servidor via SSH.**

```bash
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:

  ```bash
  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
  ```

   
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tuknxndq0sp0ropi3m33.png)

  
* Vamos configurar um Swapfile:

  ```bash
  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
  ```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zazcinr68077vc5m9oxz.png)

* Declarar variáveis de ambiente para **Mail-in-a-Box:**

  ```bash
  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
  ```

<br> 
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6jxpj3adl9ru819onmf3.png)


* 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/81e5bse161tbjun0f5fd.png)


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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w4n3skt71wrcelpd27jv.png)

* 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h0gzlmgq2y7e9v2sbszs.png)



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dhxi6uk8frk2cqx1ds50.png)

<br>
Passo 6. **Agora vamos configurar o postfix para envio de mensagens com o AWS SES.**
  * `vim /etc/postfix/main.cf`

```bash
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`

```bash
[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:

```bash
sudo postmap /etc/postfix/sasl_passwd
systemctl restart postfix
```

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

```bash
scp -i chave.pem logo.svg ubuntu@50.xx.xxx.110:/home/ubuntu   # SCP PARA ENVIO DO LOGO AO SERVIDOR
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dq4f1lgsaa78wizjt5zg.png)


<br>
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w2xww2efgrjwe9gp4915.png)

Iremos alterar para esse código:
```html
<!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>
```

<br>
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:**
```bash
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'";
```

**Porta 80:**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2alzfcpm4e8vc4wsigqh.png)

**Porta 443:**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/at4fyjxsizf10pdnkiua.png)

**Agora reinicie o servidor Nginx:**
`systemctl restart nginx`

<br>
**Pronto!**
  **Seu servidor de e-mails esta pronto para ser usado!**
* Check X-Content-Type-Options: 
  * https://domsignal.com/mime-sniffing-test
* Check X-Frame-Options Header: 
  * https://domsignal.com/x-frame-options-test
* Check CSP (Content-Security-Policy):
  * https://domsignal.com/csp-test