Створення поштового сервера на базі MTA Exim (exim mail mta virtual spam virus clamav freebsd imap postgresql)
У цій статті піде мова про створення ефективного поштового сервера на базі MTA exim. Перше питання, яке, звичайно ж приходить в голову - "А чому саме exim?". Відповідають на це питання по-різному, тому я скажу, що мене так приваблює в exim-е:
- логічна схема обробки пошти;
- висока швидкість роботи;
- зручний формат конфігураційного файлу;
- найширші можливості по пошуку будь-яких значень у файлах, СУБД, LDAP
- вбудована підтримка smtp-аутентифікації
- невелике число знайдених вразливостей (фактично я знаю тільки про одну, знайденої нещодавно, вона стосувалася версій exim-a до 4.20 включно)
- дуже велика кількість можливостей, а також надзвичайна гнучкість
- можливість повної заміни sendmail (тобто. можна зробити ln -sf / usr / local / sbin / exim / usr / libexec / sendmail :-))
На мій погляд, exim є вельми і вельми вдалим продуктом, не дарма він використовується за умовчанням в ОС Debian GNU Linux. Два великих мінуса exim-a полягають у тому, що відсутня якісна документація російською мовою необхідність правки Makefile для включення тих чи інших можливостей exim-а.
Отже, для початку подумаємо, що повинна містити "ідеальна" з точки зору зручності адміністрування і використання поштова система. Сформулюємо ряд вимог до поштової системи:
1) простота управління користувачами
2) можливість надання доступу для відправки пошти користувачам локальної мережі і мобільним користувачам (за допомогою smtp аутентифікації)
3) максимальний захист від хакерських атак, вірусів і спаму
Базовою системою для установки MTA з'явилася FreeBSD 5.2.1, що зумовило певні особливості установки.
Перерахую весь набір програмного забезпечення для організації mail сервера:
- exim-4.34 - MTA (mail transfer agent - агент передачі пошти)
- courier-3.0.4 - imap сервер, щоб отримати доступ до пошти користувачів, які не мають локальних призначених для користувача облікових записів (віртуальні користувачі)
- clamav - для пошуку вірусів
- spamassasin - для пошуку спамерських листів
- postgresql-7.4.2 - для зберігання всіх даних про користувачів поштової системи
- squirrelmail - просто приємний веб-інтерфейс для пошти (вимагає веб-сервер і php)
Звичайно, можна зібрати всі перераховані вище компоненти і вручну, але я не прихильник такого підходу. По-перше треба дуже чітко уявляти порядок складання різних компонентів. По-друге, необхідно розбиратися в купі опцій для зв'язки різних бібліотек. По-третє, треба чітко уявляти собі всі шляхи і знати, яких користувачів треба додавати. Ну і по-четверте, це справа дуже складно оновлювати. Тому ми скористаємося послугами системи портів (якщо у вас, наприклад, Debian GNU Linux, то потрібний пакет називається exim4-daemon-heavy). Для цього ставимо наступні порти:
- databases / pogstgresql7
- mail / exim (при компіляції необхідно вказати наступні опції: make WITH_PGSQL = yo
- mail / p5-Mail-SpamAssassin
- security / clamav
- mail / courier-imap (при компіляції знову ж вказуємо: make WITH_CRAM = yo WITH_POSTGRESQL = yo
- mail / squirrelmail
Після складання всього потрібного переходимо до стадії налаштування. Тут доведеться затратити порядна кількість часу на налаштування всіх компонентів поштової системи, і метою цієї статті є мінімізація цього часу :) Отже, почнемо з налаштування СУБД postgresql, як основи для побудови поштової системи.
По-перше postgresql працює з правами системного користувача pgsql (зверніть увагу, цей користувач має реальний shell і домашній каталог - / usr / local / pgsql /). Тому для початку задаємо пароль для даного користувача:
Далі робимо su pgsql і починаємо створення бази даних:
вводимо пароль користувача pgsql і потрапляємо в командний рядок sql запитів. Для детального ознайомлення з можливостями СУБД, раджу звернутися до керівництва або ж однією з книг.
CREATE DATABASE users;
приєднуємося до цієї БД:
CREATE TABLE accounts (
uid serial NOT NULL,
login character varying (128),
"Password" character varying (128),
maildir character varying (255),
gecos character varying (255),
gid integer DEFAULT 150,
home character varying (255),
mailquota integer DEFAULT 20
);
ALTER TABLE ONLY accounts
ADD CONSTRAINT uid_k PRIMARY KEY (uid);
ALTER TABLE ONLY accounts
ADD CONSTRAINT login_k UNIQUE (login);
створюємо таблицю алиасов:
CREATE TABLE aliases (
mail character varying (128) NOT NULL,
alias character varying (128)
);
ALTER TABLE ONLY aliases
ADD CONSTRAINT mail_k PRIMARY KEY (mail);
Поясню призначення таблиць і полів:
Після цього будемо вважати, що postgresql у нас працює. Однак, для повного використання можливостей цієї СУБД краще почитати документацію.
Далі перейдемо до налаштування власне MTA exim. Конфігураційний файл для версії "з портів" зберігається в / usr / local / etc / exim / configure. Для початку я б хотів пояснити значення деяких термінів і розповісти про базові принципи роботи exim'a.
Уявімо собі шлях проходження будь-якого поштового повідомлення. Будь-які повідомлення складається з так званого "конверта" і власне даних. Те, з чим ми звикли працювати в поштових клієнтах, якраз є "даними" і не має до конверту ніякого відношення. У конверті описуються 2 параметра: mail from: і rcpt to. які вказують відправника і одержувачів відповідно.
Сеанс роботи з MTA може передувати "привітанням" - стандартним (HELO) і розширеним (EHLO). У привітанні має зазначатися FQDN клієнта, хоча, по ряду причин, не варто занадто строго стежити за саме
FQDN, тому що багато машин можуть перебувати за NAT'ом. MTA у відповідь на HELO або EHLO повідомляє про свої можливості, забезпечуючи тим самим синхронізацію клієнта і сервера.
Далі лист потрапляє на ланцюжок так званих "роутерів", які визначають, як саме доставляти лист. Серед роутерів фігурує dnslookup, який доставляє листи на підставі MX записів в DNS, перевірка файлу алиасов і .forward файлів ну і локальна доставка. Кожен роутер має якесь умова спрацьовування і відповідний транспорт. При виконанні умови, exim вибирає вказаний транспорт для доставки листи, інакше лист проходить на наступний роутер (тому важливий порядок опису роутерів в конфігураційному файлі).
Транспорти ж визначають порядок доставки листа. Таким чином, настройка exim'а складається з декількох частин:
-настройка глобальних параметрів
-настройка acl's
-настройка роутерів
-настройка транспортів
-настройка аутентифікатор
-настройка черзі
-настройка rewrite правил
У налаштуванні exim'а широко використовуються різні списки (hostlist, domainlist і dnslist) і так звані lookup'и, за допомогою яких exim отримує дані із зовнішніх джерел.
Багато моїх знайомих, намагаючись освоїти exim, вважали lookup'и найзаплутанішій темою, тому я зупинюся на цьому питанні трохи докладніше.
Існує два типи пошуку: пошук по одному ключу (single-key) і пошук за запитом (query). Перший використовується для пошуку в локальних файлах, а другий - в різного роду базах (sql, ldap та інше). Будь-які lookup'и можуть бути вкладеними, тобто в одному пошуку використовуються результати іншого.
Пошук на основі single key будується приблизно так:
особливо слід відзначити розставляння фігурних дужок. Якщо ви знайомі з функціональними мовами, на кшталт Лиспа, то такий синтаксис для вас буде звичний, інакше просто потрібно рахувати кожну конструкцію списком, який обробляє exim. Тоді всі строкові та інші константи теж полягають у фігурні дужки.
Тобто вищенаведений приклад можна розглядати як
$ Список -> $ -> $ driver>.
При цьому сам файл, в якому здійснюється пошук повинен виглядати так:
при цьому сам файл повинен виглядати наступним чином:
192.168.3.4: domain1. domain2.
192.168.1.9: domain3. domain4.
При цьому пошук здійснюється по першому полю.
Відмінність query-style пошуку в тому, що ми явно не вказуємо, що шукати, вказуючи замість цього запит. Так, наприклад виглядає типовий запит до sql базі:
При успішному виконанні запиту повертається значення з бази, інакше виконується спеціальна дія fail, що означає невдалий запит.
Кілька страшними бувають запити до ldap. Розберу їх детальніше.
уазаніе сервера і порту ldap виглядає наступним чином:
запити до директорії виглядають так:
Форма запиту описана в стандарті, але, думаю, її варто додатково пояснити.
Там, де необхідно аутентифікація на сервері, тоді просто вказуємо щось на кшталт
Зауважте необхідність заміни прогалин на% 20, як того вимагає стандарт.
Думаю, для подальшого розуміння статті, цього цілком достатньо.
# Openssl genrsa -out mailed.key 2048
# Openssl req -new -x509 -key mailed.key -days 365 -out mailed.crt
При цьому всі поля сертифіката будуть запитані. Врахуйте, що файл секретного ключа не повинен бути зашифрований, інакше exim не зможе його прочитати, просто встановіть власником цього файлу root: wheel і встановіть права 0600.
Після цього можна спробувати запустити exim в режимі налагодження:
і поспостерігати за виведеними повідомленнями. Щоб включити exim замість sendmail робимо наступні дії:
в файлі /etc/rc.conf потрібні такі рядки:
sendmail_enable = "NONE"
exim_enable = "YES"
# А також для spamassasin і clamav:
clamav_clamd_enable = "YES"
spamd_enable = "YES"
Далі налаштовуємо доставку пошти для локальних додатків через exim, для чого файл /etc/mail/mailer.conf у нас повинен виглядати наступним чином:
sendmail / usr / local / sbin / exim
send-mail / usr / local / sbin / exim
mailq / usr / local / sbin / exim -bp
newaliases / usr / local / sbin / exim -bi
hoststat / usr / local / sbin / exim
purgestat / usr / local / sbin / exim
Далі перейдемо до налаштування clamav: заходимо в / usr / local / etc / і копіюємо clamav.conf.sample в clamav.conf і правимо його таким чином, щоб він приймав з'єднання через tcp / ip, а не через локальний сокет, для чого в clamav.confнужни
наступні рядки:
TCPSocket 3310
TCPAddr 127.0.0.1
Далі копіюємо freshclam.conf.sample в freshclam.conf. Цей файл вказує настройки для програми freshclam, що використовується для поновлення антіфірусних баз clamav.
SpamAssasin працює без додаткових налаштувань.
Перейдемо до наступної частини - настройка courier'a. Цей imap сервер для своєї роботи використовує кілька процесів, які, в свою чергу, налаштовуються з різних конфігураційних файлів. У моєму прикладі запущено 3 процесу - authdaemon, courier-imapd і courier-imapd-ssl. Причому в зовнішній світ відкритий
тільки courier-imapd-ssl. Для початку створимо сертифікат для imapd-ssl і для TLS сполук з imapd:
правимо файл /usr/local/etc/couier-imap/imapd.cnf на предмет свого dn для сертифіката, для чого в частині req_dn прописуємо свої настройки (не забудьте, що cn повинен збігатися з FQDN imap сервера):
[Req_dn]
C = RU
ST = Moskow region
L = Moskow
O = Tehnopark
OU = Internet technologies
CN = test.ru
[email protected]
Далі генеруємо сертифікат спеціальним скриптом:
cd / usr / local / share / courier-imap /
./ mkimapdcert
Після чого налаштуємо imap аутентифікацію:
cd / usr / local / etc / courier-imap /
cp authdaemonrc.dist authdaemonrc
далі в authdaemonrc замінюємо список модулів для аутентифікації на:
Тепер courier знає, що йому потрібно аутентифицироваться через pgsql. Треба тільки налаштувати сам pgsql модуль, настройки якого зберігаються в authpqsqlrc. Він повинен містити наступне:
# Настройки таблиці для аутентифікації, тут ми вказуємо, в яких полях
# Таблиці зберігаються різні дані користувача:
PGSQL_USER_TABLE accounts
PGSQL_CLEAR_PWFIELD password
DEFAULT_DOMAIN test.ru
PGSQL_UID_FIELD uid
PGSQL_GID_FIELD gid
PGSQL_LOGIN_FIELD login
PGSQL_HOME_FIELD home
PGSQL_NAME_FIELD gecos
PGSQL_MAILDIR_FIELD maildir
Перейдемо до налаштування безпосередньо imapd:
скопріуем imapd.dist в imapd. Правимо наступні рядки (для інших налаштувань
цілком підходять значення за замовчуванням):
# За замовчуванням в NO, робимо в YES, щоб imapd міг запускатися
IMAPDSTART = YES
Цих налаштувань, в принципі, вистачає. Далі копіюємо imapd-ssl.dist в imapd-ssl і
правимо наступні рядки:
Після чого робимо запуск courier-imap при старті системи. Для цього заходимо в /usr/local/etc/rc.d і знову трохи попереіменовиваем файли:
# Mv courier-imap-imapd-ssl.sh.sample courier-imap-imapd-ssl.sh
# Mv courier-imap-imapd.sh.sample courier-imap-imapd.sh
Після цього вважаємо, що наша поштова система практично готова. Потрібно тільки трохи понабудовували squirrelmail для чого заходимо в / usr / local / www / squirrelmail і запускаємо скрипт ./configure. В принципі, інтерфейс конфігурації зрозумілий без зайвих пояснень, тому я не буду особливо зупинятися на цій проблемі (не забудьте, головне, вказати imap і smtp сервера). Робимо симлінк на / usr / local / www / squirrelmail з будь-якого VirtualHost'а або з під безпосередньо DocumentRoot самого apache. Ось, в принципі, і все.
Є деякі особливості запуску squirrelmail в при включеному safe_mode в php. По-перше все php файли і каталоги squirrelmail повинні належати тому користувачеві, з під якого працює apache (настройка VirtualHost або глобальна, за замовчуванням - www: nogroup). Крім того необхідно змінити дозволу в / var / spool / squirrelmail:
# Chmod +1777 / var / spool / squirrelmail / attach
# Chmod +1777 / var / spool / squirrelmail / pref
Ну і власника встановити того ж, що і на / usr / local / www / squirrelmail.
В кінці приведу список корисних посилань: