В данной статье речь пойдет о создании почтового сервера на операционной системе CentOS 7, используя хостинг VDS.
Почтовый сервер будет работать используя Postfix, Dovecot, PHP, PHP-FPM, MariaDB, NGINX, phpMyAdmin, PostfixAdmin, Roundcube и систему защиты от вирусов и СПАМа.

Почтовый сервер на CentOS 7 своими руками

Почтовый сервер на CentOS 7 своими руками

Данное эссе не претендует на глубокое исследование или руководство к действию, скорее это памятка для системного администратора, у которого есть необходимость быстро вспомнить, или отыскать ту или иную команду, материал, и как бы всегда находящийся под рукой.

Все действия, в данной статье происходят на виртуальной машине, но также воспроизводились на живом хостинге.
Для примера имя почтового сервера будет mail.ho.local IP адрес 192.10.1.10
дистрибутив Linux CentOS 7 — minimal.

Условие:
1. Должен быть установлен Linux CentOS 7, minimal, или выбран и оплачен сервер VDS, с подходящим тарифом.
2. Права и пароль для root.
3. Доступ по ssh.
4. Настроено DNS записи у провайдера для имени mail.ho.local с IP адресом 192.10.1.10, и IP адрес должен разрешаться в mail.ho.local
5. Время и опыт.

Важно! Нужно учесть что антивирус ClamAV требует для работы минимум 2 Гигабайта ОЗУ!

Содержание

1. Предварительная настройка и безопасность системы
2. Настройка веб-сервера: PHP, PHP-FPM, MariaDB, NGINX, phpMyAdmin
3. Установка и настройка PostfixAdmin для Postfix
4. Установка и настройка Postfix
5. Установка и настройка Dovecot
6. Проверка работы почтового сервера
7. Установка и настройка почтового клиента Roundcube
8. Защита от вирусов
9. Защита со СПАМа
10. Разное

1. Предварительная настройка системы

Пароль для root : PassR00T

Создаем нового пользователя с правами root, а также ключ ssh для без парольного входа:
# adduser poststaff

задаем пароль
# passwd poststaff
pass456789

включаем в группу wheel (администраторов)
# gpasswd -a poststaff wheel
# exit

Заходим по ssh под юзером poststaff.
создаем директорию в домашнем каталоге нового пользователя для хранения ключа:
# mkdir ~/.ssh

даем права:
# chmod 0700 ~/.ssh

создаем файл:
# touch ~/.ssh/authorized_keys

Создаем в PuTTY Key Generator ключи, действуем в WINDOWS:
Скачать putty:
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
На момент написания статьи стабильный релиз PuTTY 0.70 цифровые подписи от 4 июля 2017 putty.zip (a .ZIP archive of all the above). Распаковываем в любую удобную директорию (каталог), запускаем PUTTYGEN.EXE, выбираем SSH-2-RSA key, жмем кнопку Generate, водим мышкой.
Создаем директорию куда сохраним ключи, например — C:/secret_dir/keys.
Жмем кнопку Save public key, сохраняем в C:/secret_dir/keys, обзываем, например public-key
Жмем кнопку Save private key, сохраняем в C:/secret_dir/keys, обзываем, например private-key, на вопрос о том что пароль для доступа к этому файлу останется пустым, соглашаемся, хотя конечно вы можете создать пароль, но тогда при каждом запуске putty, на доступ к сайту, будет происходить его запрос.
Создаем в папке C:/secret_dir/keys текстовый документ с названием, например authorized.txt
Копируем из PuTTYgen, из поля Public key for pasting into OpenSSS… текст от начала до конца, не больше, ни меньше. Вставляем в файл authorized.txt, сохраняем.
В последствии, если что-то пойдет не так, PuTTY Key Generator, можно подсунуть файл, private-key, нажать кнопку Load, и в поле Public key for… появится текст для файлика authorized.txt

Копируем из созданного ранее в puttygen authorized.txt и вставляем в linux, используем текстовый редактор vi или другой..
vi ~/.ssh/authorized_keys
вставляем ключ

Если редактор vi не нравится, устанавливаем nano:
# sudo yum update
# sudo yum install nano

Отступление. Получить информацию по программам, пакетам.
список всех установленных пакетов:
# sudo yum list installed

список подключенных репозиториев:
# sudo yum repolist

информация об определенном репозитории:
# sudo yum repoinfo epel

Продолжаем.

делаем права:
# chmod 0600 ~/.ssh/authorized_keys

перезапускаем ssh
# sudo systemctl reload sshd.service

PuTTY — настройка доступа по ключу см. интернет.

Можно сделать чтобы не запрашивался пароль при вызове sudo:
# sudo visudo

вписываем под строкой root ALL=(ALL) ALL
poststuff ALL=(ALL) ALL
для записи — shift: wq!
а можно не делать!

После пробного подключения, если все нормально работает, отключаем доступ руту, и доступ по паролю:
# sudo nano /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeyFile .ssh/authorized_keys

Правила для Firewall

Проверяем работает или нет
# sudo firewall-cmd —state
=running
если не запущен:
# sudo systemctl start firewalld.service

Проверить дефалтные зоны:
# firewall-cmd —get-default-zone
=public

Проверить активные зоны:
#
=public
interfaces: eth0

Все зоны:
# firewall-cmd —list-all

Не большое отступление:

смотрим открытые порты и сервисы
# sudo firewall-cmd —zone=public —list-ports
# sudo firewall-cmd —zone=public —list-services

Автоматический запуск после перезагрузки:
# sudo systemctl enable firewalld

ПРИМЕРЫ:
Правило блокировки, для ненавистных IP адресов, для зоны публичного интерфейса (по умолчанию — public):
# sudo firewall-cmd —permanent —zone=public —add-rich-rule=’rule family=»ipv4″ source address=»AA.BB.CC.DD» drop’
# sudo firewall-cmd —reload
удалить из блокировки:
# firewall-cmd —permanent —zone=public —remove-rich-rule=’rule family=»ipv4″ source address=»AA.BB.CC.DD» drop’
# sudo firewall-cmd —reload
добавить разрешающее правило для конкретного IP — порт, протокол:
# firewall-cmd —permanent —zone=public —add-rich-rule=’rule family=»ipv4″ source address=»AA.BB.CC.DD/32″ port protocol=»udp» port=»68″ accept’
# sudo firewall-cmd —reload
смотреть что есть в rich-rule:
# sudo firewall-cmd —zone=public —list-rich-rule
Если захочется удалить (закрыть) порт или сервис из правил:
# sudo firewall-cmd —permanent —zone=public —remove-port=80/tcp
# sudo firewall-cmd —permanent —zone=public —remove-service=http

перечитать правила
# sudo firewall-cmd —reload

Вернемся к делу:

На всякий случай проверяем, или сразу открываем 22 порт для доступа по ssh:
# sudo firewall-cmd —permanent —zone=public —add-port=22/tcp
# sudo firewall-cmd —permanent —zone=public —add-service=ssh

перезапускаем сервис sshd:
# sudo systemctl reload sshd.service

Проверить состояние SELinux:
# sudo sestatus
можно временно изменить режим SELinux
# sudo setenforce 0
Чтобы навсегда отключить SELinuxvi
# sudo vi /etc/selinux/config
установить для SELINUX режим в disabled
Перезагрузка
# sudo shutdown -r now

обновить все пакеты прежде чем что-то устанавливать:
# sudo yum update

От подбора паролей и прочего:
# sudo yum install fail2ban
No package fail2ban available

Добавляем репозиторий..
Extra Packages for Enterprise Linux (EPEL)
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum update

Устанавливаем..
# sudo yum install epel-release yum-utils
# yum install fail2ban
# sudo yum install nano
# sudo systemctl start fail2ban

копируем
# sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

правим
# sudo nano /etc/fail2ban/jail.local
включить sshd правила — секция JAIL [sshd]:
добавить enabled = true
секция JAIL [sshd-ddos]
добавить enabled = true

стартуем fail2ban:
# sudo systemctl start fail2ban
# sudo systemctl status fail2ban
# sudo systemctl enable fail2ban

# sudo fail2ban-client status
# sudo fail2ban-client status sshd

Дата, время, часовой пояс
# date

какой часовой пояс:
# ls -l /etc/localtime

какие существуют часовые пояса:
# timedatectl list-timezones
# timedatectl list-timezones | grep Europe

для москвы:
# sudo timedatectl set-timezone Europe/Moscow

Проверяем запущена ли chrony:
# sudo systemctl status chronyd
если нет:
# sudo yum install chrony

Запускаем и добавляем в автозагрузку:
# sudo systemctl start chronyd
# sudo systemctl status chronyd
# sudo systemctl enable chronyd

Имя сервера, версия linux, время:
uname -a

узнаем IP адрес
# ip a | grep ‘inet ‘
# ip a | grep ‘inet6 ‘

узнаем имя машины:
# hostname
должно быть — mail.ho.local

Если нет, правим:
# sudo nano /etc/hostname
mail.ho.local

пишем:
# sudo hostname mail.ho.local

смотрим:
# hostname -f
mail.ho.local
# hostname -s
mail

если все так, правим /etc/hosts:
# sudo nano /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#добавляем для IPv4
192.10.1.10 mail.ho.local mail
#добавляем для IPv6
64-x_битный_адрес mail.ho.local mail

# sudo shutdown -r now

С предварительной настройкой системы закончено, можно переходить к следующему шагу — Настройка веб-сервера: PHP, PHP-FPM, MariaDB, NGINX, phpMyAdmin.

Всем удачи!