Postfix Dovecot MySql: Difference between revisions
(7 intermediate revisions by the same user not shown) | |||
Line 475: | Line 475: | ||
# Space separated list of plugins to load (default is global mail_plugins). | # Space separated list of plugins to load (default is global mail_plugins). | ||
mail_plugins = $mail_plugins autocreate | mail_plugins = $mail_plugins autocreate | ||
} </pre></li> | |||
<li><p>“15-mailboxes.conf”</p> | |||
<pre>namespace inbox { | |||
# These mailboxes are widely used and could perhaps be created automatically: | |||
mailbox Drafts { | |||
auto = subscribe | |||
special_use = \Drafts | |||
} | |||
mailbox Junk { | |||
auto = subscribe | |||
special_use = \Junk | |||
} | |||
mailbox Trash { | |||
auto = subscribe | |||
special_use = \Trash | |||
} | |||
mailbox Sent { | |||
auto = subscribe | |||
special_use = \Sent | |||
} | |||
} </pre></li> | } </pre></li> | ||
<li><p>“20-imap.conf”</p> | <li><p>“20-imap.conf”</p> | ||
<pre>protocol imap { | |||
<pre> | mail_plugins = $mail_plugins quota imap_quota | ||
} </pre></li> | } </pre></li> | ||
<li><p>“90-quota.conf” Здесь надо установить необходимые с вашими требованиями параметры:<br /></p> | <li><p>“90-quota.conf” Здесь надо установить необходимые с вашими требованиями параметры:<br /></p> | ||
Line 517: | Line 530: | ||
connect = host=mysql.example.edu dbname=postfix user=postfix password=db_admin default_pass_scheme = MD5-CRYPT | connect = host=mysql.example.edu dbname=postfix user=postfix password=db_admin default_pass_scheme = MD5-CRYPT | ||
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n'as mail, 2000 AS uid, 2000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1' | user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n'as mail, 2000 AS uid, 2000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1' | ||
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 2000 as userdb_uid, 2000 as userdb_gid, | password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 2000 as userdb_uid, 2000 as userdb_gid, concat('*:bytes=', quota) AS userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = '1' </pre></li></ol> | ||
=== Spamassassin === | === Spamassassin === | ||
Line 543: | Line 556: | ||
# systemctl start dovecot | # systemctl start dovecot | ||
# systemctl enable dovecot</pre> | # systemctl enable dovecot</pre> | ||
Конфигурация "spamassassin" осуществляется редактированием файла "'''/etc/mail/spamassassin/local.cf'''". Пример файла настроек: | |||
<pre># These values can be overridden by editing ~/.spamassassin/user_prefs.cf | |||
# (see spamassassin(1) for details) | |||
# These should be safe assumptions and allow for simple visual sifting | |||
# without risking lost emails. | |||
required_hits 5 | |||
report_safe 0 | |||
rewrite_header Subject [SPAM] | |||
use_bayes 1 | |||
bayes_auto_learn 1 | |||
bayes_path /etc/mail/spamassassin/bayes | |||
bayes_file_mode 0666 | |||
bayes_learn_to_journal 1 | |||
bayes_min_ham_num 1 | |||
bayes_min_spam_num 1 | |||
score SUBJ_FULL_OF_8BITS 0.00 | |||
score HTML_COMMENT_8BITS 0.01 | |||
score HEADER_8BITS 0.00 | |||
score TO_NO_USER 0.01 | |||
score FORGED_MUA_OUTLOOK 0.5 | |||
score X_AUTH_WARNING 0.01 | |||
score SUBJ_HAS_UNIQ_ID 9.99 | |||
score HTTP_USERNAME_USED 9.99 | |||
score FORGED_YAHOO_RCVD 9.99 | |||
score FORGED_JUNO_RCVD 16 | |||
score UNWANTED_LANGUAGE_BODY 1.02 | |||
score MLM 5.55 | |||
score RCVD_NUMERIC_HELO 4.95 | |||
ok_locales en ru | |||
whitelist_from root@localhost | |||
whitelist_from root@localhost.localhost | |||
# | |||
# Google uses DKIM so this should only whitelist real google mails | |||
# | |||
whitelist_auth adwords-noreply@google.com | |||
whitelist_auth googlealerts-noreply@google.com | |||
#blacklist_from *@888.com | |||
#blacklist_from *@msn.com | |||
#blacklist_from *@cat.es | |||
#blacklist_from *@pmail.gen.nz | |||
#blacklist_from *@femenino.com | |||
#blacklist_from *@infonium.com</pre> | |||
=== Postgrey === | === Postgrey === | ||
Line 554: | Line 618: | ||
Более подробную информацию можно найти на сайте “https://wiki.centos.org/HowTos/postgrey”. | Более подробную информацию можно найти на сайте “https://wiki.centos.org/HowTos/postgrey”. | ||
=== SASL === | |||
В настройке “postfix” присутствует использование “sasl”-аутентификации. Для данного примера настройки серверов её использование не нужно, но всё же установка её на почтовый сервер будет рассмотрена. Необходимо только установить следующие пакеты: “'''cyrus-sasl'''” и “'''cyrus-sasl-lib'''”. А также сделать пакет загружаемым: | В настройке “postfix” присутствует использование “sasl”-аутентификации. Для данного примера настройки серверов её использование не нужно, но всё же установка её на почтовый сервер будет рассмотрена. Необходимо только установить следующие пакеты: “'''cyrus-sasl'''” и “'''cyrus-sasl-lib'''”. А также сделать пакет загружаемым: | ||
Line 562: | Line 626: | ||
Настройка этого сервиса нужна для автоматической аутентификации с удалёнными клиентскими программами, такими как “sendmail”, “postfix” и им подобными. Например, на удалённом компьютере почта отправляется через локальный почтовый сервер, который в свою очередь настроен на передачу всей своей почты на так называемый “smart-host”. | Настройка этого сервиса нужна для автоматической аутентификации с удалёнными клиентскими программами, такими как “sendmail”, “postfix” и им подобными. Например, на удалённом компьютере почта отправляется через локальный почтовый сервер, который в свою очередь настроен на передачу всей своей почты на так называемый “smart-host”. | ||
== MySQL-сервер == | |||
Прежде, чем начинать проверять почтовый сервер, надо настроить сервер базы данных. В нашем случае выбрана база данных “mariadb”. В этой базе будут храниться аккаунты почтовых пользователей. Сначала необходимо создать в рамках “vagrant” новый сервер базы данных. Для этого в файл “Vagrantfile” надо добавить новую информацию о данном сервере. Назовём, к примеру, сервер “db”, а реальное имя будет “mysql.example.edu”: | Прежде, чем начинать проверять почтовый сервер, надо настроить сервер базы данных. В нашем случае выбрана база данных “mariadb”. В этой базе будут храниться аккаунты почтовых пользователей. Сначала необходимо создать в рамках “vagrant” новый сервер базы данных. Для этого в файл “Vagrantfile” надо добавить новую информацию о данном сервере. Назовём, к примеру, сервер “db”, а реальное имя будет “mysql.example.edu”: | ||
Line 609: | Line 673: | ||
# systemctl enable mariadb</pre> | # systemctl enable mariadb</pre> | ||
== WEB-сервер == | |||
Одним из способов добавления информации для почтового сервера (домен, аккаунты) может быть использование “postfixadmin”, установленный на “web”-сервере. Его можно взять с сайта “http://postfixadmin.sourceforge.net/”. В данном случае “web”-сервер будет создан на основе “Apache”. Надо установить следующие пакеты: “'''httpd, httpd-tools, php, php-mysql, php-common, php-imap, php-mbstring'''”. Создадим новый “web”-сервер. Для этого сначала надо добавить в текущий файл “Vagrantfile” настройку для “web”-сервера: | Одним из способов добавления информации для почтового сервера (домен, аккаунты) может быть использование “postfixadmin”, установленный на “web”-сервере. Его можно взять с сайта “http://postfixadmin.sourceforge.net/”. В данном случае “web”-сервер будет создан на основе “Apache”. Надо установить следующие пакеты: “'''httpd, httpd-tools, php, php-mysql, php-common, php-imap, php-mbstring'''”. Создадим новый “web”-сервер. Для этого сначала надо добавить в текущий файл “Vagrantfile” настройку для “web”-сервера: | ||
Line 750: | Line 814: | ||
Теперь проверим аутентификацию. Для этого для созданного логина и пароля получим base64-кодировку, а затем осуществим проверку: | Теперь проверим аутентификацию. Для этого для созданного логина и пароля получим base64-кодировку, а затем осуществим проверку: | ||
$ telnet mail.example.edu 25 | $ telnet mail.example.edu 25 | ||
Trying 192.168.33.13... | Trying 192.168.33.13... |
Latest revision as of 15:19, 10 December 2018
Обычно в примерах создания серверов описывается настройка одного общего сервера почты и сервера базы данных. В данной книге будет рассмотрен пример создания независимых серверов со взаимодействием между собой.
Для этого в качестве основы создания серверов будет использоваться “vagrant” и “virtualbox”. Пакеты “vagrant” и “virtualbox” можно взять непосредственно с сайтов.
Создание гостевых узлов
В качестве сервера виртуальных машин был выбран “Oracle Linux 7”. Для этого с сайта “Oracle” был взят готовый образ для “vagrant”.
Vagrant
Установку “virtualbox” по всей видимости можно здесь не рассматривать, так как это на мой взгляд не представляет никаких проблем. Остановимся на установке гостевых систем с помощью “vagrant”. После инсталляции пакета “vagrant” и заранее установленного пакета “virtualbox” от имени не root-пользователя производится добавление гостевого исходного образа (box) и его инициализация:
$ vagrant box add --name ol7 https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box $ vagrant init ol7 $ vagrant up $ vagrant ssh
После того, как гостевая система успешно загрузится и произойдёт удачное подключение по ssh-протоколу, из гостевой системы можно будет выйти и остановить её:
$ vagrant halt
и в домашнем каталоге появится файл “Vagrantfile”. Кроме того, если запустить “virtualbox”, то можно будет увидеть, что появилась новая гостевая система. Все настройки этой и других гостевых систем, созданных с помощью “vagrant”, осуществляются в файле “Vagrantfile”.
У гостевого сервера всегда будет присутствовать один сетевой интерфейс с внутренним адресом сети “virtualbox”. В данном случае это будет один из адресов сети “10.0.2.0/24”. Кроме того, нам понадобится дополнительная внутренняя сеть для всех гостевых систем.
Для удобства имя гостевой системы в “virtualbox” можно будет переименовать в более адекватное.
DNS
Перейдём к созданию DNS-сервера на основе имеющегося образа. Для этого вместо “default”-настройки добавим в имеющийся “Vagrantfile” следующее:
config.vm.define "dns" do |dns| dns.vm.box = "ol7" dns.vm.box_url = "https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box" dns.vm.hostname = "ns.example.edu" dns.vm.network "private_network", ip: "192.168.33.12", :netmask => "255.255.255.0" dns.vm.provider "virtualbox" do |vb| vb.name = "dns" # vb.gui = true vb.memory = "512" vb.cpus = "1" vb.customize ["modifyvm", :id, "--vram", "10"] vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] end end
Инициализируем “dns”-сервер:
$ vagrant init dns $ vagrant up dns $ vagrant ssh dns
и попробуем к этому серверу подключиться через “ssh”-протокол.
Из настроек видно, что “dns”-сервер будет иметь имя “ns.example.edu”, адрес этого сервера будет “192.168.33.12” с маской “255.255.255.0”. Объём ОЗУ выбран 512 МБ, 1 процессор, 10 МБ видеопамяти. Также произведено переименование исходного имени гостевой системы в “virtualbox” после инициализации в “dns”.
Запуск сервера будет выглядить приблизительно следующим образом:
$ vagrant up dns ==> dns: Clearing any previously set forwarded ports... ==> dns: Fixed port collision for 22 => 2222. Now on port 2200. ==> dns: Clearing any previously set network interfaces... ==> dns: Preparing network interfaces based on configuration... dns: Adapter 1: nat dns: Adapter 2: hostonly ==> dns: Forwarding ports... dns: 22 (guest) => 2200 (host) (adapter 1) ==> dns: Running 'pre-boot' VM customizations... ==> dns: Booting VM... ==> dns: Waiting for machine to boot. This may take a few minutes... dns: SSH address: 127.0.0.1:2200 dns: SSH username: vagrant dns: SSH auth method: private key dns: Warning: Connection reset. Retrying... dns: Warning: Remote connection disconnect. Retrying... ==> dns: Machine booted and ready! ==> dns: Checking for guest additions in VM... ==> dns: Setting hostname... ==> dns: Configuring and enabling network interfaces... ==> dns: Mounting shared folders... dns: /vagrant => /home/eugene $
Установка пакетов и настройка DNS-сервера
В качестве DNS-сервера используется BIND. Для этого устанавливаются пакеты “bind, bind-utils”.
После установки пакетов начнём настраивать “dns”-сервер. Для этого надо будет создать прямую и реверсную зоны, а также информацию об этих зонах надо будет добавить в файл настроек “/etc/named.conf”. Файлы зон размещаются в каталоге “/var/named/” с именами “example.edu” и “33.168.192.in-addr.arpa”.
Файлы зон выглядят следующим образом:
[root@ns named]# cat /var/named/example.edu $ORIGIN example.edu. $TTL 86400 ; 1 day @ IN SOA ns.example.edu. hostmaster.example.edu. ( 2018092605 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 1209600 ; expire (2 weeks #RFC1912) 86400 ; minimum (1 day) ) ; DNS Servers IN NS ns.example.edu. ; MX Records IN MX 10 mail.example.edu. $ORIGIN example.edu. www A 192.168.33.10 mysql A 192.168.33.11 ns A 192.168.33.12 mail A 192.168.33.13
и
[root@ns named]# cat /var/named/33.168.192.in-addr.arpa $TTL 86400 ; 1 day @ IN SOA ns.example.edu. hostmaster.example.edu. ( 7 ; serial 28800 ; refresh (8 hours) 14400 ; retry (4 hours) 3600000 ; expire (5 weeks 6 days 16 hours) 86400 ; minimum (1 day) ) @ IN NS ns.example.edu. 10 PTR www.example.edu. 11 PTR mysql.example.edu. 12 PTR ns.example.edu. 13 PTR mail.example.edu.
а в файл “/etc/named.conf” надо внести следующие обновления:
options { listen-on port 53 { any; }; allow-query {any; }; ... zone "example.edu" IN { type master; file "example.edu"; allow-update { none; }; allow-query { any; }; notify yes; }; zone "33.168.192.in-addr.arpa" IN { type master; file "33.168.192.in-addr.arpa"; allow-update { none; }; allow-query { any; }; notify yes; };
В этом файле минимальные настройки, которые для нашего примера описывают только внутреннюю сеть “192.168.33.0/24”.
В каталоге “/var/named/” права для вновь созданных файлов поменяем на “named”:
# chown named:named /var/named/{example.edu,33.168.192.in-addr.arpa} # systemctl start named
и проверим, что сервис запущен без ошибок:
# systemctl status named * named.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2018-11-28 12: 55:23 EET; 52min ago Process: 1058 ExecStart=/usr/sbin/named -u named-c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS) Process: 1051 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS) Main PID: 1060 (named) CGroup: /system.slice/named.service |__1060 /usr/sbin/named -u named -c /etc/named.conf Nov 28 12:55:23 ns.example.edu named[1060]: zone 1.0.0.127.in-addr.arpa/IN: ...0 Nov 28 12:55:23 ns.example.edu named[1060]: zone 33.168.192.in-addr.arpa/IN:...7 Nov 28 12:55:23 ns.example.edu named[1060]: zone localhost.localdomain/IN: l...0 Nov 28 12:55:23 ns.example.edu named[1060]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0...0 Nov 28 12:55:23 ns.example.edu named[1060]: zone localhost/IN: loaded serial 0 Nov 28 12:55:23 ns.example.edu named[1060]: all zones loaded Nov 28 12:55:23 ns.example.edu systemd[1]: Started Berkeley Internet Name Do.... Nov 28 12:55:23 ns.example.edu named[1060]: running Nov 28 12:55:28 ns.example.edu named[1060]: no longer listening on 192.168.3...3 Nov 28 12:55:32 ns.example.edu named[1060]: listening on IPv4 interface eth1...3 Hint: Some lines were ellipsized, use -l to show in full.
Теперь можно проверить, что сервер отвечает правильно на запросы:
[root@ns named]# nslookup - 127.0.0.1 > ns.example.edu Server: 127.0.0.1 Address: 127.0.0.1#53 Name: ns.example.edu Address: 192.168.33.12 > 192.168.33.12 Server: 127.0.0.1 Address: 127.0.0.1#53 12.33.168.192.in-addr.arpa name = ns.example.edu. > ^D
После того, когда убедились, что сервер правильно отвечает на запросы, надо “named.service” добавить в автоматическую загрузку при старте гостевого узла:
# systemctl enable named
Для нормального ответа на все сетевые запросы необходимо, чтобы в файле “/etc/resolv.conf” была ссылка на локальный “dns”-сервер, а так как первый интерфейс всегда “nat”, получаемый параметры через “dhcp”, то в этом файле исходно запись “nameserver” указывает на основной сервер с “virtualbox”. Поэтому необходимо после запуска гостевой системы содержимое файла /etc/resolv.conf” изменить. Это делается изменением в файле “Vagrantfile”:
config.vm.provision :shell do |shell| shell.path = "bin/fix_vagrant_resolv.conf.sh" end
В домашнем каталоге хостового узла в директории “$HOME/bin” надо создать файл “fix_vagrant_resolv.conf.sh” с содержимым:
$ cat ~/bin/fix_vagrant_resolv.conf.sh cat > /etc/resolv.conf <<EOF # # managed by vagrant # domain example.edu search example.edu nameserver 192.168.33.12 EOF
Mail-сервер
Следующим сервером установим почтовый сервер. Для этого, также как и для “dns”-сервера, воспользуемся имеющейся заготовкой “vagrant” с той лишь разницей, что вместо “dns” укажем “mail”. Для этого в имеющийся файл “Vagrantfile”, также как и для “dns”-сервера, надо добавть информацию о “mail”-сервере:
config.vm.define "mail" do |mail| mail.vm.box = "ol7" mail.vm.box_url = "https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box" mail.vm.hostname = "mail.example.edu" mail.vm.network "private_network", ip: "192.168.33.13", :netmask => "255.255.255.0" mail.vm.provider "virtualbox" do |vb| vb.name = "mail" # vb.gui = true vb.memory = "512" vb.cpus = "1" vb.customize ["modifyvm", :id, "--vram", "10"] vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] end end
и произведём инициализацию:
$ vagrant init mail $ vagrant up mail $ vagrant ssh mail
Почтовый сервер будет состоять из “postfix” и “dovecot”. Авторизация пользователей будет осуществляться через базу данных “mysql”. Для этого добавим пакеты “postfix, dovecot, dovecot-mysql”, а также “mariadb, mariadb-libs”.
Письма будут храниться в каталоге “/var/vmail” и доступ к почтовым ящикам будет иметь виртуальный пользователь “vmail”:
# groupadd -g 2000 vmail # mkdir -p /var/vmail # useradd -g vmail -u 2000 -c "Virtuial Mail User" -d /var/vmail -s /sbin/nologin vmail # chown -R vmail:vmail /var/vmail # chmod -R 770 /var/vmail
Postfix
Так как почтовый сервер должен быть сопряжён с “mysql”-базой данных, то в настройках “postfix” надо будет добавить файлы с информацией для доступа к базе. В нашем случае пользователем для базы данных “postfix” будет “postfix” с паролем “db_admin”. База данных будет находиться на сервере “mysql.example.edu”. Для начала создадим каталог “/etc/postfix/mysql” и туда запишем ряд файлов:
“relay_domains.cf”
hosts = mysql.example.edu user = postfix password = db_admin dbname = postfix query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
“virtual_alias_domain_maps.cf”
hosts = mysql.example.edu user = postfix password = db_admin dbname = postfix query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1
“virtual_alias_maps.cf”
hosts = mysql.example.edu user = postfix password = db_admin dbname = postfix query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
“virtual_mailbox_domains.cf”
hosts = mysql.example.edu user = postfix password = db_admin dbname = postfix query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
“virtual_mailbox_maps.cf”
hosts = mysql.example.edu user = postfix password = db_admin dbname = postfix query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
В файле “/etc/postfix/main.cf” надо указать на вновь созданные файлы:
# mysql mappings # relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf, mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf
Кроме этого, надо сделать ещё некоторые изменения в этом файле:
soft_bounce = no myhostname = mail.example.edu mydomain = example.edu myorigin = $myhostname mydestination = localhost.$mydomain, localhost inet_interfaces = all mynetworks = 192.168.33.0/24, 127.0.0.0/8 alias_maps = hash:/etc/aliases
Чтобы происходила подмена исходного адреса от отправителя с
“host.domain” на “domain” необходимо в этом файле изменить “masquerade”. Для этого добавим:
# ADDRESS REWRITING # # The ADDRESS_REWRITING_README document gives information about # address masquerading or other forms of address rewriting including # username->Firstname.Lastname mapping. masquerade_domains = example.edu
Ограничения для получения или перенаправления писем почтовым сервером описываются следующим образом:
# restrictions # smtpd_discard_ehlo_keywords = etrn, silent-discard smtpd_forbidden_commands = CONNECT GET POST broken_sasl_auth_clients = yes smtpd_delay_reject = yes smtpd_helo_required = yes disable_vrfy_command = yes smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname smtpd_data_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_pipelining, reject_multi_recipient_bounce smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unknown_sender_domain smtpd_recipient_restrictions = reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_multi_recipient_bounce, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_policy_service unix:/var/spool/postfix/postgrey/socket, #reject_rbl_client zen.spamhaus.org, #reject_rbl_client bl.spamcop.net, #reject_rbl_client dnsbl.sorbs.net, reject_invalid_hostname
В целях безопасности передачи почты желательно, чтобы канал был шифрованный. Это можно достичь включив поддержку TLS. Также надо создать ограничения на размер принимаемых писем, поддержку SASL-аутентификации, указать общее с “dovecot” место хранения почты:
# tls # smtp_tls_security_level = may smtpd_tls_security_level = may smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s smtp_tls_session_cache_database = btree:$data_directory/smtp_tls_session_cache smtpd_tls_key_file = /etc/postfix/certs/key.pem smtpd_tls_cert_file = /etc/postfix/certs/cert.pem tls_random_source = dev:/dev/urandom # limits # message_size_limit = 51200000 smtpd_soft_error_limit = 10 smtpd_hard_error_limit = 15 smtpd_error_sleep_time = 20 anvil_rate_time_unit = 60s smtpd_client_connection_count_limit = 20 smtpd_client_connection_rate_limit = 30 smtpd_client_message_rate_limit = 30 smtpd_client_event_limit_exceptions = 127.0.0.0/8 smtpd_client_connection_limit_exceptions = 127.0.0.0/8 # queue # maximal_queue_lifetime = 5d bounce_queue_lifetime = 5d # sasl # smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth # virtual # virtual_mailbox_base = /var/vmail virtual_minimum_uid = 2000 virtual_uid_maps = static:2000 virtual_gid_maps = static:2000 virtual_transport = dovecot dovecot_destination_recipient_limit = 1
В данном блоке указано место хранения сертификата и ключа. Подробнее о создании самоподписанного сертификата будет рассказано ниже.
Включение кроме 25-го (smtp) по-умолчании порта дополнительного 587-го порта (submission) производится настройкой файла
“/etc/postfix/master.cf”:
submission inet n - n - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_wrappermode=no -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination -o milter_macro_daemon_name=ORIGINATING # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions
Для совместимости с “dovecot” в конце файла надо добвить следующее:
dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
Dovecot
Dovecot - агент доставки почты, а также “imap” и “pop3” сервер. Необходимые пакеты должны быть уже предустановлены.
В файле “dovecot.conf” достаточно только указать на протоколы, с которыми будет работать “dovecot”:
protocols = imap pop3
Также надо отредактировать файлы находяциеся в каталоге “conf.d”. Надо отметить, что в настройке необходимо указать тот же номер “id”, который был выбран при настройке “postfix”:
“10-mail.conf”
mail_uid = 2000 mail_gid = 2000 first_valid_uid = 2000 mail_plugins = quota mail_location = maildir:/var/vmail/%d/%n
“10-auth.conf”
disable_plaintext_auth = no auth_realms = example.edu auth_default_realm = example.edu auth_mechanisms = plain login #!include auth-system.conf.ext !include auth-sql.conf.ext
“10-master.conf”
service imap-login { inet_listener imap { port = 143 } inet_listener imaps { port = 993 ssl = yes } } service pop3-login { inet_listener pop3 { port = 110 } inet_listener pop3s { port = 995 ssl = yes } } service auth { unix_listener auth-userdb { mode = 0600 user = vmail group = vmail } unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } }
“10-ssl.conf”
ssl = yes ssl_cert = </etc/pki/dovecot/certs/dovecot.pem ssl_key = </etc/pki/dovecot/private/dovecot.pem
“15-lda.conf”
quota_full_tempfail = no lda_mailbox_autocreate = yes protocol lda { # Space separated list of plugins to load (default is global mail_plugins). mail_plugins = $mail_plugins autocreate }
“15-mailboxes.conf”
namespace inbox { # These mailboxes are widely used and could perhaps be created automatically: mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Trash { auto = subscribe special_use = \Trash } mailbox Sent { auto = subscribe special_use = \Sent } }
“20-imap.conf”
protocol imap { mail_plugins = $mail_plugins quota imap_quota }
“90-quota.conf” Здесь надо установить необходимые с вашими требованиями параметры:
plugin { quota_rule = *:storage=1G quota_rule2 = Trash:storage=+100M } plugin { quota_warning = storage=90%% quota-warning 90 %u #quota_warning2 = storage=80%% quota-warning 80 %u } service quota-warning { executable = script /usr/local/bin/quota-warning.sh user = vmail unix_listener quota-warning { user = vmail } } plugin { #quota = dirsize:User quota quota = maildir:User quota #quota = dict:User quota::proxy::quota #quota = fs:User quota }
В соответствии с настройками файла “auth-sql.conf.ext” надо создать и разместить файл, указанный в параметре “args”:
# cat /etc/dovecot/dovecot-sql.conf.ext driver = mysql connect = host=mysql.example.edu dbname=postfix user=postfix password=db_admin default_pass_scheme = MD5-CRYPT user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n'as mail, 2000 AS uid, 2000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1' password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 2000 as userdb_uid, 2000 as userdb_gid, concat('*:bytes=', quota) AS userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
Spamassassin
Чтобы отсеивать нежелательную почту существует много способов. Один из них - использование “spamassassin”. Для этого надо установить пакет “spamassassin”, а также создать системного пользователя “spamd”:
# groupadd -r spamd # useradd -r -g spamd -s /bin/false -d /var/log/spamassassin spamd # mkdir -p /var/log/spamassassin # chown -R spamd:spamd /var/log/spamassassin
и затем добавим в файл “/etc/postfix/master.cf” параметры запуска “spamassassin”:
#smtp inet n - n - - smtpd smtp inet n - n - - smtpd -o content_filter=spamassassin
а также в конце этого файла добавить следующее:
spamassassin unix - n n - - pipe flags=R user=spamd argv=/bin/spamc -e /sbin/sendmail -oi -f ${sender} ${recipient}
Также надо добавить автоматический запуск “spamassassin” при запуске сервера:
# systemctl start spamassassin # systemctl enable spamassassin # systemctl start postfix # systemctl enable postfix # systemctl start dovecot # systemctl enable dovecot
Конфигурация "spamassassin" осуществляется редактированием файла "/etc/mail/spamassassin/local.cf". Пример файла настроек:
# These values can be overridden by editing ~/.spamassassin/user_prefs.cf # (see spamassassin(1) for details) # These should be safe assumptions and allow for simple visual sifting # without risking lost emails. required_hits 5 report_safe 0 rewrite_header Subject [SPAM] use_bayes 1 bayes_auto_learn 1 bayes_path /etc/mail/spamassassin/bayes bayes_file_mode 0666 bayes_learn_to_journal 1 bayes_min_ham_num 1 bayes_min_spam_num 1 score SUBJ_FULL_OF_8BITS 0.00 score HTML_COMMENT_8BITS 0.01 score HEADER_8BITS 0.00 score TO_NO_USER 0.01 score FORGED_MUA_OUTLOOK 0.5 score X_AUTH_WARNING 0.01 score SUBJ_HAS_UNIQ_ID 9.99 score HTTP_USERNAME_USED 9.99 score FORGED_YAHOO_RCVD 9.99 score FORGED_JUNO_RCVD 16 score UNWANTED_LANGUAGE_BODY 1.02 score MLM 5.55 score RCVD_NUMERIC_HELO 4.95 ok_locales en ru whitelist_from root@localhost whitelist_from root@localhost.localhost # # Google uses DKIM so this should only whitelist real google mails # whitelist_auth adwords-noreply@google.com whitelist_auth googlealerts-noreply@google.com #blacklist_from *@888.com #blacklist_from *@msn.com #blacklist_from *@cat.es #blacklist_from *@pmail.gen.nz #blacklist_from *@femenino.com #blacklist_from *@infonium.com
Postgrey
Этот пакет позволяет отлавливать спам в случае, если письмо отправляется не с почтового сервера, так как почтовый сервер предусматривает повторную пересылку сообщения, если сразу письмо не было принято. Приём письма задерживается на некоторое время и отправителю направляется сообщение, чтобы письмо было вновь переправлено через некоторый период времени. Если же письмо отправляется не через почтовый сервер, то повтора никогда не будет и это исключит приём спама.
Установка заключается в загрузке пакета “postgrey”. Файлы настроек находятся в каталоге “/etc/postfix”. Добавим автозапуск пакета:
# systemctl start postgrey # systemctl enable postgrey
Более подробную информацию можно найти на сайте “https://wiki.centos.org/HowTos/postgrey”.
SASL
В настройке “postfix” присутствует использование “sasl”-аутентификации. Для данного примера настройки серверов её использование не нужно, но всё же установка её на почтовый сервер будет рассмотрена. Необходимо только установить следующие пакеты: “cyrus-sasl” и “cyrus-sasl-lib”. А также сделать пакет загружаемым:
# systemctl start saslauthd # systemctl enable saslauthd
Настройка этого сервиса нужна для автоматической аутентификации с удалёнными клиентскими программами, такими как “sendmail”, “postfix” и им подобными. Например, на удалённом компьютере почта отправляется через локальный почтовый сервер, который в свою очередь настроен на передачу всей своей почты на так называемый “smart-host”.
MySQL-сервер
Прежде, чем начинать проверять почтовый сервер, надо настроить сервер базы данных. В нашем случае выбрана база данных “mariadb”. В этой базе будут храниться аккаунты почтовых пользователей. Сначала необходимо создать в рамках “vagrant” новый сервер базы данных. Для этого в файл “Vagrantfile” надо добавить новую информацию о данном сервере. Назовём, к примеру, сервер “db”, а реальное имя будет “mysql.example.edu”:
config.vm.define "db" do |db| db.vm.box = "ol7" db.vm.box_url = "https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box" db.vm.hostname = "mysql.example.edu" db.vm.network "private_network", ip: "192.168.33.11", :netmask => "255.255.255.0" db.vm.provider "virtualbox" do |vb| vb.name = "mysql" # vb.gui = true vb.memory = "512" vb.cpus = "1" vb.customize ["modifyvm", :id, "--vram", "10"] vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] end end
После этого создадим сервер базы данных:
$ vagrant init db $ vagrant up db $ vagrant ssh db
Инсталлируем следующие пакеты базы данных: “mariadb, mariadb-server”. Теперь можно начинать настраивать базу данных:
# mysql_install_db # chown -R mysql:mysql /var/lib/mysql # mysql_secure_installation
После начальной настройки “mariadb-server” можно начинать настраивать базу данных для “postfix”. Также как при настройках “postfix” и “dovecot”, пользователь будет “postfix” с паролем “db_admin”:
# mysql -u root -p MariaDB [(none)]> CREATE USER postfix@localhost IDENTIFIED BY 'db_admin'; MariaDB [(none)]> CREATE USER postfix@mail.example.edu IDENTIFIED BY 'db_admi n'; MariaDB [(none)]> CREATE USER postfix@www.example.edu IDENTIFIED BY 'db_admin '; MariaDB [(none)]> CREATE DATABASE postfix; MariaDB [(none)]> GRANT ALL PRIVILEGES ON postfix.* TO postfix; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> select user, host, password from mysql.user; \q
Далее надо сделать, чтобы база данных загружалась при запуске сервера:
# systemctl start mariadb # systemctl enable mariadb
WEB-сервер
Одним из способов добавления информации для почтового сервера (домен, аккаунты) может быть использование “postfixadmin”, установленный на “web”-сервере. Его можно взять с сайта “http://postfixadmin.sourceforge.net/”. В данном случае “web”-сервер будет создан на основе “Apache”. Надо установить следующие пакеты: “httpd, httpd-tools, php, php-mysql, php-common, php-imap, php-mbstring”. Создадим новый “web”-сервер. Для этого сначала надо добавить в текущий файл “Vagrantfile” настройку для “web”-сервера:
config.vm.define "web" do |web| web.vm.box = "ol7" web.vm.box_url = "https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box" web.vm.hostname = "www.example.edu" web.vm.network "private_network", ip: "192.168.33.10", :netmask => "255.255.255.0" web.vm.network "forwarded_port", guest: 80, host:8080 web.vm.provider "virtualbox" do |vb| vb.name = "webserver" # vb.gui = true vb.memory = "512" vb.cpus = "1" vb.customize ["modifyvm", :id, "--vram", "10"] vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] end end
Здесь следует обратить внимание на строчку
“web.wm.network ”forwarded_port”, guest: 80, host: 8080”. Она означает, что будет создано “nat”-правило, позволяющее обращаться из хостовой машины к “web”-серверу через порт 8080 “http://localhost:8080”.
Создание гостевого “web”-сервера такое же, как и предыдущие:
$ vagrant init web $ vagrant up web $ vagrant ssh web
По-умолчании устанавливать “postfixadmin” будем в каталоге
“/var/www/html”. После распаковки “postfixadmin” надо поменять права каталога “postfixadmin” на “apache”:
# chown -R apache:apache /var/www/html/postfixadmin
Кроме этого внутри “postfixadmin” надо создать каталог
“template_c” и файл настроек “config.local.php” с правами “apache”.
Файл “config.local.php”:
<?php $CONF['database_type'] = 'mysqli'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = 'db_admin'; $CONF['database_name'] = 'postfix'; $CONF['database_host'] = 'mysql.example.edu'; $CONF['smtp_server'] = 'mail.example.edu'; $CONF['smtp_port'] = '25'; $CONF['configured'] = true; ?>
Проверим загрузку “web”-сервера и сделаем запуск его автоматическим:
# systemctl start httpd # systemctl enable httpd
Настройка систем и проверка работоспособности
После того, как гостевые узлы созданы, можно начать настраивать их. Чтобы не возникало проблем при настройке, на созданных узлах надо отключить систему контроля доступа “selinux”. Для этого на каждом из улов следует исправить файл настройки “selinux” “/etc/selinux/config”. В этом файле надо поменять параметр “SELINUX” с исходного “enforcing” на “permissive” или “disabled”, после чего каждый из этих узлов необходимо перезагрузить.
Postfixadmin
Начнём с настройки “pstfixadmin”. На “web”-сервере добавить файл
“postfixadmin.conf” в каталог “/etc/httpd/conf.d”:
# # Posfixadmin.conf # Alias /postfixadmin /var/www/html/postfixadmin/public <Directory /var/www/html/postfixadmin/public> Options FollowSymLinks <IfModule !mod_access_compat.c> require all granted </IfModule> <IfModule mod_access_compat.c> order allow,deny allow from all </IfModule> </Directory>
и перезагрузить “Apache”:
# systemctl restart httpd
Далее с хостового узла с помощью браузера попробуем обратиться к “postfixadmin” по адресу “http://localhost:8080/postfixadmin/setup.php”:
Во время настройки надо создать административный логин и пароль, которые будут нужны для доступа к “postfixadmin”. Далее можно попробовать зайти на сайт администратором по адресу “http://localhost:8080/postfixadmin/login.php” и добавить почтовый домен (в нашем случае это “example.edu”), а также почтовый аккаунт.
Прежде, чем начать проверять сервисы, необходимо создать и добавить сертификаты для “postfix” и “dovecot”. Для этого надо выполнить следующее:
# mkdir -p /etc/postfix/certs # openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/certs/cert.pem -keyout /etc/postfix/certs/key.pem # cp /etc/postfix/certs/cert.pem /etc/pki/dovecot/certs/dovecot.pem # cp /etc/postfix/certs/key.pem /etc/pki/dovecot/private/dovecot.pem # chmod 600 /etc/postfix/certs/key.pem /etc/pki/dovecot/private/dovecot.pem
После создания домена и почтового аккаунта в “postfixadmin” надо проверить работоспособность “postfix” и “dovecot”. На почтовом сервере надо проверить, открыты ли почтовые порты:
# netstat -antp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 1179/master tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 1054/dovecot tcp 0 0 127.0.0.1:783 0.0.0.0:* LISTEN 1139/spamd.pid -d - tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 1054/dovecot tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1028/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 1179/master tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 1054/dovecot tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 1054/dovecot
Исходя из этого видно, что открыты порты 25 (smtp), 110 (pop3), 143 (imap), 587 (submission), 993 (imaps) и 995 (pop3s).
Postfix
Зайдя на одну из гостевых систем, попробуем подключиться к почтовому серверу и проверить аутентификацию, а также отправить письмо на созданный почтовый адрес. Сначала введём фиктивный почтовый адрес:
$ telnet mail.example.edu 25 Trying 192.168.33.13... Connected to mail.example.edu. Escape character is '^]'. 220 mail.example.edu ESMTP Postfix EHLO localhost 250-mail.example.edu 250-PIPELINING 250-SIZE 51200000 250-STARTTLS 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN MAIL FROM: <vagrant@example.edu> 250 2.1.0 Ok RCPT TO: <user@example.edu> 550 5.1.1 <user@example.edu>: Recipient address rejected: User unknown in virtual mailbox table QUIT 221 2.0.0 Bye
Теперь проверим аутентификацию. Для этого для созданного логина и пароля получим base64-кодировку, а затем осуществим проверку:
$ telnet mail.example.edu 25 Trying 192.168.33.13... Connected to mail.example.edu. Escape character is '^]'. 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN MAIL FROM: <vagrant@example.edu> 250 2.1.0 Ok RCPT TO: <user@example.edu> 550 5.1.1 <user@example.edu>: Recipient address rejected: User unknown in virtual mailbox table QUIT
221 2.0.0 Bye
Теперь проверим аутентификацию. Для этого для созданного логина и пароля получим base64-кодировку, а затем осуществим проверку:
$ perl -MMIME::Base64 -e 'print encode_base64("mail.account");' bWFpbC5hY2NvdW50 $ perl -MMIME::Base64 -e 'print encode_base64("password");' cGFzc3dvcmQ= $ telnet mail.example.edu 25 Trying 192.168.33.13... Connected to mail.example.edu. Escape character is '^]'. 220 mail.example.edu ESMTP Postfix EHLO ns.example.edu 250-mail.example.edu 250-PIPELINING 250-SIZE 51200000 250-STARTTLS 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH LOGIN 334 VXNlcm5hbWU6 bWFpbC5hY2NvdW50 334 UGFzc3dvcmQ6 cGFzc3dvcmQ= 235 2.7.0 Authentication successful QUIT 221 2.0.0 Bye Connection closed by foreign host.
А теперь на созданный аккаунт попробуем отправить письмо:
# telnet mail.example.edu 25 Trying 192.168.33.13... Connected to mail.example.edu. Escape character is '^]'. 220 mail.example.edu ESMTP Postfix EHLO example.edu 250-mail.example.edu 250-PIPELINING 250-SIZE 51200000 250-STARTTLS 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN MAIL FROM: <postmaster@example.edu> 250 2.1.0 Ok RCPT TO: <mail.account@example.edu> 250 2.1.5 Ok DATA 354 End data with <CR><LF>.<CR><LF> Subject: Test Test . 250 2.0.0 Ok: queued as 353E640CEF1A QUIT 221 2.0.0 Bye
Здесь видно, что письмо отправлено. Лог прохождения письма можно посмотреть на почтовом сервере в файле “/var/log/maillog”:
Dec 1 11:47:12 mail postfix/smtpd[2904]: connect from www.example.edu[192.168.33.10] Dec 1 11:47:58 mail postfix/smtpd[2904]: 353E640CEF1A: client=www.example.edu[192.168.33.10] Dec 1 11:48:13 mail postfix/cleanup[2913]: 353E640CEF1A: message-id=<> Dec 1 11:48:13 mail postfix/qmgr[1177]: 353E640CEF1A: from=<postmaster@example.edu>, size=217, nrcpt=1 (queue active) Dec 1 11:48:13 mail spamd[1725]: spamd: connection from localhost [::1]:42538 to port 783, fd 6 Dec 1 11:48:13 mail spamd[1725]: spamd: setuid to spamd succeeded Dec 1 11:48:13 mail spamd[1725]: spamd: processing message (unknown) for spamd:993 Dec 1 11:48:13 mail spamd[1725]: spamd: clean message (4.6/5.0) for spamd:993 in 0.2 seconds, 249 bytes. Dec 1 11:48:13 mail spamd[1725]: spamd: result: . 4 - ALL_TRUSTED,DNS_FROM_AHBL_RHSBL,MISSING_DATE,MISSING_FROM,MISSING_HEADERS,MISSING_MID,RP_MATCHES_RCVD scantime=0.2,size=249,user=spamd,uid=993,required_score=5.0,rhost=localhost,raddr=::1,rport=42538,mid=(unknown),autolearn=no autolearn_force=no Dec 1 11:48:13 mail postfix/pipe[2915]: 353E640CEF1A: to=<mail.account@example.edu>, relay=spamassassin, delay=33, delays=33/0.01/0/0.3, dsn=2.0.0, status=sent (delivered via spamassassin service) Dec 1 11:48:13 mail postfix/qmgr[1177]: 353E640CEF1A: removed Dec 1 11:48:13 mail postfix/pickup[1176]: D063840CEF1B: uid=993 from=<postmaster@example.edu> Dec 1 11:48:13 mail postfix/cleanup[2913]: D063840CEF1B: message-id=<20181201094813.D063840CEF1B@mail.example.edu> Dec 1 11:48:13 mail postfix/qmgr[1177]: D063840CEF1B: from=<postmaster@example.edu>, size=767, nrcpt=1 (queue active) Dec 1 11:48:13 mail spamd[1138]: prefork: child states: II Dec 1 11:48:13 mail dovecot: lda(mail.account@example.edu): Warning: autocreate plugin is deprecated, use mailbox { auto } setting instead Dec 1 11:48:14 mail dovecot: lda(mail.account@example.edu): msgid=<20181201094813.D063840CEF1B@mail.example.edu>: saved mail to INBOX Dec 1 11:48:14 mail postfix/pipe[2919]: D063840CEF1B: to=<mail.account@example.edu>, relay=dovecot, delay=0.19, delays=0.03/0.04/0/0.12, dsn=2.0.0, status=sent (delivered via dovecot service) Dec 1 11:48:14 mail postfix/qmgr[1177]: D063840CEF1B: removed Dec 1 11:48:16 mail postfix/smtpd[2904]: disconnect from www.example.edu[192.16 8.33.10]
В каталоге “/var/vmail” автоматически будет создан
“example.edu/mail.account/{cur,new,tmp}”. Пришедшее письмо будет находиться в каталоге “new”.
TLS
Следующим этапом проверим работоспособность “TLS”. Для этого воспользуемся пакетом “openssl”:
{BASH} # openssl s_client -connect mail.example.edu:25 -starttls smtp CONNECTED(00000003) depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu verify error:num=18:self signed certificate verify return:1 depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu verify return:1 --- Certificate chain 0 s:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu i:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu --- Server certificate -----BEGIN CERTIFICATE----- MIIFZTCCA02gAwIBAgIJAIAwkJagGWjVMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV BAYTAkxWMQ0wCwYDVQQHDARSaWdhMRAwDgYDVQQKDAdIQUJJVEFMMRkwFwYDVQQD ... zBqnG97ZTzWSTMLJAat9suxGiA+uV/iX9lQRGwm7DasZoQfZ8D+5SDnUwRSdb3c7 ryHWvqXhhgZC+u5EvQTWckvJkwMcb4PGmDgq6KUFRxfdMuhD/TeXxwk= -----END CERTIFICATE----- subject=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu issuer=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu --- No client certificate CA names sent Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 2529 bytes and written 450 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384 Server public key is 4096 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384 Session-ID: 39133821CECCCD460E8DF0B95973C3801D0DC79C5C0557AF3E380A2D5AD19936 Session-ID-ctx: Master-Key: 190146AB78885A58E68B78423580C74C6024D505122E1A56424CA0F68A87BA7E48453E0A9C2523D930801D794C28FE46 Key-Arg : None Krb5 Principal: None PSK identity: None PSK identity hint: None TLS session ticket lifetime hint: 3600 (seconds) TLS session ticket: 0000 - 19 3c c8 6c 4e 15 36 18-d4 ec fb 35 f8 13 2c 90 .<.lN.6....5..,. 0010 - 0f 31 a3 6a 12 d1 95 d3-4f 3c 10 c4 7a 0a 65 a9 .1.j....O<..z.e. ... 0080 - ee ca 91 19 0c 15 2f c8-08 0d 5b 1f 49 7e 3f 95 ....../...[.I~?. 0090 - c9 da 28 b6 ad dc f5 70-4c 29 7f 65 f9 ac 29 1d ..(....pL).e..). Start Time: 1543661127 Timeout : 300 (sec) Verify return code: 18 (self signed certificate) --- 250 DSN EHLO example.edu 250-mail.example.edu 250-PIPELINING 250-SIZE 51200000 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN QUIT DONE
Убедившись, что почтовый сервер “postfix” работает, можно начинать проверять “dovecot”. Также, как и для “postfix”, проверим аутентификацию через открытый порт, SSL и TLS, указав правильный пароль:
# doveadm auth test -x service=imap -x rip=192.168.33.11 mail.account Password: passdb: mail.account auth succeeded extra fields: user=mail.account@example.edu original_user=mail.account # telnet mail.example.edu 143 Trying 192.168.33.13... Connected to mail.example.edu. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready. AUTH login "mail.account" "password" AUTH OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY SPECIAL-USE QUOTA] Logged in ^] telnet> q Connection closed. # openssl s_client -connect mail.example.edu:993 CONNECTED(00000003) depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu verify error:num=18:self signed certificate verify return:1 depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu verify return:1 --- Certificate chain 0 s:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu i:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu --- Server certificate -----BEGIN CERTIFICATE----- MIIFZTCCA02gAwIBAgIJAIAwkJagGWjVMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV BAYTAkxWMQ0wCwYDVQQHDARSaWdhMRAwDgYDVQQKDAdIQUJJVEFMMRkwFwYDVQQD ... zBqnG97ZTzWSTMLJAat9suxGiA+uV/iX9lQRGwm7DasZoQfZ8D+5SDnUwRSdb3c7 ryHWvqXhhgZC+u5EvQTWckvJkwMcb4PGmDgq6KUFRxfdMuhD/TeXxwk= -----END CERTIFICATE----- subject=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu issuer=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu --- subject=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu issuer=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu --- No client certificate CA names sent Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 2300 bytes and written 415 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384 Server public key is 4096 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384 Session-ID: 7991ADCDA30A188BB9D0492B0A1C8B848FD42F6B611F25AC2F4D4A1DA861F926 Session-ID-ctx: Master-Key: 4CC5ACE66ED245CAFC85D5B779972099D492D87A7420F3F457EC94F9C59C4B3BEFD3F4B7F6E76CD3B8819832D23128B3 Key-Arg : None Krb5 Principal: None PSK identity: None PSK identity hint: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: 0000 - b1 3d 8f 1a 77 d7 73 67-65 fa 76 33 21 99 93 06 .=..w.sge.v3!... 0010 - b2 a3 02 5b 2d a6 f2 b7-2d 6d 41 a7 67 95 e8 9c ...[-...-mA.g... ... 0080 - 2a 59 97 58 c8 f4 97 10-a8 21 06 a5 a9 42 fc 89 *Y.X.....!...B.. 0090 - f5 23 40 d6 39 e6 0e c4-26 78 0a 3c 9c 88 fa b4 .#@.9...&x.< .... Start Time: 1543750660 Timeout : 300 (sec) Verify return code: 18 (self signed certificate) --- * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready. QUIT DONE ]# openssl s_client -connect mail.example.edu:143 -starttls imap CONNECTED(00000003) depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu verify error:num=18:self signed certificate verify return:1 depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu verify return:1 --- Certificate chain 0 s:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu i:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu --- Server certificate -----BEGIN CERTIFICATE----- MIIFZTCCA02gAwIBAgIJAIAwkJagGWjVMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV BAYTAkxWMQ0wCwYDVQQHDARSaWdhMRAwDgYDVQQKDAdIQUJJVEFMMRkwFwYDVQQD ... zBqnG97ZTzWSTMLJAat9suxGiA+uV/iX9lQRGwm7DasZoQfZ8D+5SDnUwRSdb3c7 ryHWvqXhhgZC+u5EvQTWckvJkwMcb4PGmDgq6KUFRxfdMuhD/TeXxwk= -----END CERTIFICATE----- subject=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu issuer=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu --- No client certificate CA names sent Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 2631 bytes and written 441 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384 Server public key is 4096 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384 Session-ID: 2DE4552D43C98BEA7B0F75012748CF32968ED038109951266F067D708AA19DCE Session-ID-ctx: Master-Key: 60DED5473F6380B071AE3FAB3A8A52ABD43B5B34CE821CA9BA603A4DA6D6572687060A5849B7511720A0AEA58C7B5E6B Key-Arg : None Krb5 Principal: None PSK identity: None PSK identity hint: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: 0000 - f0 57 d5 71 95 2e 99 ad-7c ec 9e e5 4b 85 f3 7a .W.q....|...K..z 0010 - e1 3c 28 45 d3 ae ff 24-f3 44 85 38 8e d1 69 0f .<(E...$.D.8..i. ... 0080 - cf a6 a8 24 91 20 8f a8-02 d2 11 d5 12 09 9b a6 ...$. .......... 0090 - 05 49 5d 29 ec 50 ad 1f-b3 a9 17 dd eb 06 35 81 .I]).P........5. Start Time: 1543751398 Timeout : 300 (sec) Verify return code: 18 (self signed certificate) --- . OK Pre-login capabilities listed, post-login capabilities have more. AUTH login "mail.account" "password" * CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY SPECIAL-USE QUOTA AUTH OK Logged in QUIT DONE
Dovecot
Проверить работу “dovecot” можно с помощью команды “telnet”:
$ telnet localhost 143 Trying ::1... Connected to localhost. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready. ? LOGIN mail.account password ? OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY SPECIAL-USE QUOTA] Logged in ? LIST "" "*" * LIST (\HasNoChildren \Sent) "." Sent * LIST (\HasNoChildren \Drafts) "." Drafts * LIST (\HasNoChildren) "." "Junk E-mail" * LIST (\HasNoChildren) "." Archive * LIST (\HasNoChildren) "." drafts * LIST (\HasNoChildren) "." sent-mail * LIST (\HasNoChildren \Trash) "." Trash * LIST (\HasNoChildren) "." INBOX ? OK List completed (0.003 + 0.000 + 0.002 secs). ? Select INBOX * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 2 EXISTS * 0 RECENT * OK [UIDVALIDITY 1543354787] UIDs valid * OK [UIDNEXT 14] Predicted next UID * OK [HIGHESTMODSEQ 22] Highest ? OK [READ-WRITE] Select completed (0.014 + 0.000 + 0.013 secs). ? FETCH 1 All * 1 FETCH (FLAGS (\Seen) INTERNALDATE "27-Nov-2018 23:59:14 +0200" RFC822.SIZE 479 ENVELOPE (NIL "Welcome" ((NIL NIL "admin" "example.edu")) ((NIL NIL "admin" "example.edu")) ((NIL NIL "admin" "example.edu")) ((NIL NIL "mail.account" "example.edu")) NIL NIL NIL NIL)) ? OK Fetch completed (0.003 + 0.000 + 0.002 secs). ? FETCH 1 Body * 1 FETCH (BODY ("text" "plain" ("charset" "utf-8") NIL NIL "8bit" 37 3)) ? OK Fetch completed (0.001 + 0.000 secs). ? LOGOUT * BYE Logging out ? OK Logout completed (0.001 + 0.000 secs). Connection closed by foreign host.