# Задания

Система электронной почты состоит из нескольких компонентов:
 - Пользовательский агент MUA (Mail User Agent), редактор, который позволяет читать и составлять почтовые сообщения;
 - Агент передачи электронной почты MSA (Mail Submission Agent), принимающий сообщения от MUA и передающий после обработки транспортной системе;
 - Транспортный агент MTA (Mail Transfer Agent), который пересылает сообщение по сети на другой компьютер;
 - Агент доставки DA (Delivery Agent), перемещающий сообщения в локальное хранилище (почтовый ящик или база данных);
 - Необязательный агент доступа AA (Access Agent), связывающий пользовательский агент с хранилищем сообщений (по протоколу IMAP или POP).

Примеры агентов:
 - Пользовательские агенты MUA: Thunderbird, MS Outlook, mac OS Mail, /bin/mail;
 - Транспортные агенты MTA: sendmail, Exim, MS Exchange, Postfix;
 - Агенты доставки DA: local, mail.local, procmail, Maildrop, Dovecot;
 - Агенты доступа AA: Cyrus, UW imapd.

Транспортный агент может использовать несколько портов (RFC 5321):
 - 25/tcp - стандартный порт, без шифрования,
 - 587/tcp - порт, который используется для передачи с шифрованием STARTLS,
 - 465/tcp - порт, который используется для передачи с шифрованием SSL.

Агент доставки может использовать следующие порты:
 - 143/tcp - для протокола IMAP, 
 - 993/tcp - для протокола IMAPS (IMAP поверх SSL),
 - 110/TCP - для протокола POP, 
 - 995/TCP - для протокола POPS (POP over SSL).

Для хранения почты обычно используется формат `mbox` или `Maildir`. В случае с `mbox` почта хранится в одном файле в `/var/mail/username` с разделителем в виде специальной строки `From` между сообщениями. В случае с `Maildir` каждое сообщение хранится в отдельном файле. 

Преимущество протокола IMAP перед POP, которые используются агентами доступа для получения почты от сервера, заключается в возможности доставки сообщений по одному и улучшенной обработке больших файлов, прикреплённых к письму.

В заданиях используйте домен studX.myoffice.ru (193.32.63.170+X), порты 25, 587, 993.

``` 
                 ________
                |        |
                | клиент | (Thunderbird на ноутбуке, 
                |________|  подключается по IMAPS протоколу на порт 993)
                    |
                    |     DNS A stud15.myoffice.ru -> 193.32.63.185
                  роутер  public IP 193.32.63.185:[25,587,993] -> private IP 10.160.179.25:[25,587,993] 
                    |
                    | ens18 в vlan499 с доступом в интернет с IP 10.160.179.25/24
             _______|_______
            |               | 
            |  mail server  |    
            |_______________|   
```

# 1.
Установите и настройте MTA (Message Transfer Agent) агент Postfix. Страница документации основного конфигурационного файла `man postconf.5`. Онлайн документация доступна по ссылке http://postfix.cs.utah.edu/postfix-manuals.html.

Используйте параметры в конфигурации `/etc/postfix/main.cf` для будущей интеграции с dovecot:
```
home_mailbox = mail/
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
```

и раскомментируйте строки в конфигурации `/etc/postfix/master.cf`:
```
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
```

Проверьте работоспособность, отправив письмо командой `mail` или `sendmail` на свой личный почтовый адрес. После составления письма завершите ввод символом конца файла Ctrl+D или вводом точки.
```
$ mail -s "This is a test mail from postfix stud15"  <email получателя>
$ sendmail <email получателя>
Subject: This is a test mail from postfix stud15
Hello, will this mail be delivered?           
Best regards,
Postfix MTA
```

# 2.
Заведите почтовые ящики `noreply@studX.myoffice.ru` и `logs@studX.myoffice.ru`. Протестируйте отправку почты с ящика `noreply`. Протестируйте приём программно-сгенерированной почты на ящик `logs`, например от демона `cron`. 

# 3.
Установите и настройте DA (Delivery Agent) агент Dovecot. 

Используйте следующую конфигурацию:
```
disable_plaintext_auth = yes
mail_privileged_group = mail
mail_location = maildir:~/mail
#set mailbox location to Maildir style

userdb {
      driver = passwd
}

passdb {
     args = %s
     driver = pam
}

protocols = "imap"

namespace inbox {
  inbox = yes

  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Spam {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Archive {
    auto = subscribe
    special_use = \Archive
  }
}
#create and autosubscribe to some default folders

service auth {
      unix_listener /var/spool/postfix/private/auth {
      mode = 0660
      user = postfix
      group = postfix
    }
}

```


Проверьте работоспособность из клиента Thunderbird или аналога. Подключите в клиенте почтовые ящики, созданные ранее. Укажите в качестве IMAP сервера studX.myoffice.ru порт 993, шифрование TLS. Подтвердите, что вы доверяете самоподписанному сертификату. 

# 4. 
Вместо самоподписанных сертификатов используйте сертификаты letsencrypt, полученные на почтовом сервере с помощью утилиты `certbot`. Следуйте инструкциям на официальном сайте (https://certbot.eff.org/instructions?ws=other&os=debianbuster) для установки пакета и получении сертификата. 
```
# sudo apt update
# sudo apt install snapd
# sudo snap install core; sudo snap refresh core
# sudo snap install --classic certbot
```
Временно остановите веб-сервер на 80 порту, если он работает. Certbot запустит свой сервер-агент, чтобы проверить, что вы владете доменом studX.myoffice.ru https://letsencrypt.org/ru/how-it-works/. Сертификаты будут помещены в папку `/etc/letsencrypt/live/` При запросе сертификатов учитывайте лимит обращений https://letsencrypt.org/ru/docs/rate-limits/, достижение которых приведёт к блокировке на неделю.
```
# certbot --standalone
Account registered.
Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): stud15.myoffice.ru
Requesting a certificate for stud15.myoffice.ru

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/stud15.myoffice.ru/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/stud15.myoffice.ru/privkey.pem
This certificate expires on 2023-01-20.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
```
Проверьте, что расписание обновления сертификата включено командой `systemctl list-timers`. Добавьте также расписание для перезагрузки postfix, так как после обновления сертификатов postfix автоматически их не подхватывает. Например в cron:
```
0 0 * * 1 systemctl reload postfix
```

Измените путь к ключу `privkey.pem` и сертификату `fullchain.pem` в кофигурации postfix `/etc/postfix/main.cf` (параметры `smtp_tls_cert_file` и `smtpd_tls_key_file`) и dovecot `/etc/dovecot/conf.d/10-ssl.conf` (параметры `ssl_cert`, `ssl_key`). Перезагрузите postfix и dovecot.

Проверьте сертификаты командой
```
openssl s_client -connect stud15.myoffice.ru:993 -showcerts | openssl x509 -text
```

Переподключите клиент одного из пользователей, и проверьте, что вы можете принимать и отправлять почту.

# 5. *
Спам сильно повлиял на систему электронной почты. Появилось множество проверок для такого почтового трафика, которые могут помешать письму дойти до адресата. TLS увеличит вероятность доставки письма если только письмо передаётся на сервер, принимающий исключительно TLS трафик. Увеличить вероятность доставки также позволяет правильная настройка:
- SPF,
- DKIM (DomainKeys Identified Mail), 
- DMARC (Domain-based Message Authentication, Reporting and Conformance), 
- MAT-STS записей,
- включение поддержки DANE.

## 5.1
Настройте SPF сами или обратитесь к владельцу домена для внесения txt DNS записи следующего вида:
```
Имя: stud15.myoffice.ru.
Значение: v=spf1 ip4:193.32.63.185 a mx ~all
```

## 5.2
Настройте DMARC сами или обратитесь к владельцу домена для внесения txt DNS записи следующего вида:
```
Имя: _dmarc.stud15.myoffice.ru.
Значение: v=DMARC1; p=none; aspf=r; sp=none
```

## 5.3
Настройте DKIM, установив пакеты `opendkim` и `opendkim-tools`:
```
$ sudo apt install opendkim opendkim-tools -y
$ sudo systemctl enable opendkim
$ sudo systemctl start opendkim
```
Для настройки следуйте инструкциям `man opendkim` или онлайн инструкциям http://www.opendkim.org/opendkim-README. Сгенерировать ключи и запись для DNS вы можете утилитой `opendkim-genkey` в директории `/etc/dkimkeys/stud15.myoffice.ru`.  После генерации файлов поменяйте владельца на пользователя и группу `opendkim`.
```
# mkdir /etc/opendkim/stud15.myoffice.ru
# opendkim-genkey --domain stud15.myoffice.ru --selector mail
# chown opendkim:opendkim mail.private
# cat mail.txt
mail._domainkey IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3wiGFJNaPzXwUg7zgNxLgNO247s0Flmz3t3d56Rzyfgtwwlao/7S37o1vxBLLZj+J49sh8kHNDCljmxYAG0vjkK9cWHzDH6Yst146UkLI2ltGTv+kBf1oOE4LOdUvR/N/fzWeIU5FV8wdzenxPNryWXsJiO7X11j48BtBA7NsajSdTU64aG/cF3i03OrlyE4BYxz64yUefSpNM"
          "6JaGZbCg9E9ONpKhb8Rf5E1StHyC19B24/YVakxURVr5KHlxgoR7NBLCjWU4k631LpTRbgueY/zQJlKg+bmZO43cC/KdTHggECxhFKzE5AugJZtd64CeFByGMTdIF6x0+tGS6w4QIDAQAB" )  ; ----- DKIM key mail for stud15.myoffice.ru
``` 
Также вы можете воспользоваться онлайн сервисами для генерации ключей, например https://www.dynu.com/NetworkTools/DKIMWizard. Внесите полученную txt DNS запись сами или обратитесь к владельцу домена для внесения записи в DNS.

Отредактируйте `/etc/opendkim.conf`, чтобы изменить или добавить следующие параметры:
```
Domain                  stud15.myoffice.ru
Selector                mail
KeyFile                 /etc/dkimkeys/stud15.myoffice.ru/mail.private
Socket                  inet:8891@localhost
```

Измените в `/etc/default/opendkim` следующий параметр (порт прослушивания сервиса opendkim):
```
SOCKET=inet:8891@localhost 
```

Сконфигурируйте взаимодействие DKIM с postfix, добавив следующие параметры в конфигурационный файл `/etc/postfix/main.cf`:
```
postconf -e 'milter_default_action=accept'
postconf -e 'milter_protocol=2'
postconf -e 'smtpd_milters=inet:127.0.0.1:8891'
postconf -e 'non_smtpd_milters=inet:127.0.0.1:8891'
```

Перезапустите `opendkim` и `postfix`:
```
systemctl restart opendkim
systemctl restart postfix
```

## 5.4
Проверьте ваш почтовый домен с помощью валидатора https://esmtp.email/tools/mta-sts/.

# Релевантные источники 
- https://en.wikipedia.org/wiki/Email
- https://en.wikipedia.org/wiki/Message_transfer_agent
- https://en.wikipedia.org/wiki/Message_delivery_agent
- https://ru.wikipedia.org/wiki/SMTP
- https://ru.wikipedia.org/wiki/IMAP
- https://ru.wikipedia.org/wiki/POP3
- https://ru.wikipedia.org/wiki/Postfix
- https://ru.wikipedia.org/wiki/Dovecot
- https://ru.wikipedia.org/wiki/DomainKeys_Identified_Mail
- https://ru.wikipedia.org/wiki/DMARC
- Evi Nemeth, Garth Snyder, Trent R. Hein, Ben Whaley, Dan Macking. Unix Handbook. 18 Chapter.
- https://gist.github.com/howyay/57982e6ba9eedd3a5662c518f1b985c7