Безопасность
Структура сообщения
SMTP сервис
Обработка возвратов (bounces)
Управление очередью сообщений
Маршрутизация на уровне домена
SMTP доставка
Перенаправление и списки рассылки
Локальная доставка
POP3 сервис
Чтобы не блуждать по "поддереву" qmail, приведу стандартный список подкаталогов
корневого каталога qmail (/var/qmail и т.п.), выглядящего следующим образом:
alias - файлы .qmail для системных синонимов ("алиасов") типа postmaster@... bin - набор программ и скриптов boot - стартовые скрипты control - конфигурационные файлы doc - документация man - страницы руководства (man) queue - очередь сообщений users - база данных qmail-пользователей (ex. для виртуальных эккаунтов)
Конфигурирование qmail можно признать вполне приятным занятием, особенно если до
этого Вам приходилось общаться с файлами типа /etc/sendmail.cf (пусть даже Вы использовали
широко разрекламированный препроцессор m4).
Каталог, в котором располагаются конфигурационные файлы qmail - /var/qmail/control.
Qmail, надо сказать, неприхотливая в смысле конфигурации система: для ее успешного
функционирования в общем случае абсолютно необходим лишь один конфигурационный файл - me,
состоящий к тому же из единственной строки, содержащей полное доменное имя Вашей машины
(автоматически создается при установке скриптом config-fast).
Замечу, что программа qmail-send прочитывает конфигурационные файлы только при старте,
поэтому при их изменении необходимо перезапустить qmail-send. Если qmail-send получает
сигнал HUP, она перечитывает лишь файлы locals и vurtualdomains.
Далее приведен список конфигурационных файлов qmail, которые могут располагаться в каталоге
/var/qmail/control, использующие их программы, значение по умолчанию и краткое описание.
Более полное описание с синтаксисом можно найти в соответствующих программам страницах
руководства. Все времена указываются в секундах.
файл программа default краткое описание badmailfrom qmail-smtpd нет неприемлемые адреса отправителей badmailpatterns qmail-smtpd нет bouncefrom qmail-send MAILER-DAEMON пользователь для отвергнутых сообщений bouncehost qmail-send me хост для отвергнутых сообщений concurrencylocal qmail-send 10 max число одновр. доставляемых сообщ.(лок) concurrencyremote qmail-send 20 max число одновр. доставляемых сообщ.(внеш) defaultdomain qmail-inject me домен по умолчанию defaulthost qmail-inject me хост по умолчанию databytes qmail-smtpd 0 максимальный размер сообщения в байтах doublebouncehost qmail-send me хост для повторно отвергнутых сообщений doublebounceto qmail-send postmaster пользователь для повторно отвергнутых сообщ. envnoathost qmail-send me домен для адресов без знака @helohost qmail-remote me имя хоста для приветствия удал. SMTP сервера idhost qmail-inject me localiphost qmail-smtpd me замена локальных IP-адресов на имя хоста locals qmail-send me список доменов для локальной доставки morercpthosts qmail-smtpd нет дополнительные разрешенные RCPT-домены percenthack qmail-send нет домены для кот. возможен в адресах знак % plusdomain qmail-inject me имя домена для имен хостов, оканчивающихся + qmqpservers qmail-qmqpc нет queuelifetime qmail-send 604800 max время нахождения сообщения в очереди rcpthosts qmail-smtpd нет разрешенные RCPT-домены smtpgreeting qmail-smtpd me приглашение SMTP smtproutes qmail-remote нет искусственная SMTP маршрутизация timeoutconnect qmail-remote 60 таймаут ожидания связи с удал. SMTP сервером timeoutremote qmail-remote 1200 таймаут ожидания ответа от удал. SMTP сервера timeoutsmtpd qmail-smtpd 1200 таймаут в данных от удал. SMTP клиента virtualdomains qmail-send нет список виртуальных пользователей или доменов
| qmtp & qmqp enabled qmail system (46K) |
Каждое сообщение добавляется в центральный каталог очереди сообщений
с помощью qmail-queue. Qmail-queue вызывается по необходимости, обычно
программой qmail-inject для локально составленных сообщений, qmail-smtpd - для
сообщений, полученных по SMTP, qmail-local - для пересланных сообщений и
qmail-send - для возвращенных сообщений
Каждое сообщение затем отправляется программой qmail-send совместно с qmail-lspawn
и qmail-rspawn и удаляется из очереди программой qmail-clean. Эти
4 программы - демоны.
Структура очереди сообщений
Каждое сообщение из очереди имеет свой уникальный номер (пусть 457). Центральная очередь
организована в виде набора каталогов, каждый из которых может содержать файлы,
связанные с сообщением 457:
Mess/457: сообщение
Todo/457: конверт: откуда сообщение пришло и куда отправляется
Intd/457: конверт, создается qmail-queue
Info/457: адрес отправителя конверта, после предварительной обработки
Local/457: локальные адреса получателя конверта, после предварительной обработки
Remote/457: удаленные адреса получателя конверта, после предварительной обработки
Bounce/457: постоянные ошибки доставки
Стадии, в которых может находиться сообщение. '+' означает, что файл существует;
'-' не существует, '?' может как существовать, так и нет.
S1. -mess -intd -todo -info -local -remote -bounce
S2. +mess -intd -todo -info -local -remote -bounce
S3. +mess +intd -todo -info -local -remote -bounce
S4. +mess ?intd +todo ?info ?local ?remote -bounce (queued)
S5. +mess -intd -todo +info ?local ?remote ?bounce (preprocessed)
Как сообщение попадает в очередь
Чтобы добавить сообщение в очередь, qmail-queue сначала создает файл в отдельном
каталоге, pid/, с уникальным именем. Файловая система назначает этому файлу
номер inode. Qmail-queue переименовывает pid/whatever как mess/457, перемещая
сообщение в состояние S2, записывает сообщение в mess/457. Далее
создает intd/457, перемещая сообщение в состояние S3, и записывает необходимую
информацию в intd/457.
Наконец, qmail-queue создает новую ссылку, todo/457, для intd/457, - это стадия S4.
В этот момент сообщение успешно поставлено в очередь, и qmail-queue покидает его для
дальнейшей обработки программой qmail-send.
Qmail-queue включает 24-часовой таймер до доступа к любому файлу и "совершает самоубийство", если данное
время истекает.
Как сообщение из очереди проходит предварительную обработку
Как только сообщение было поставлено в очередь, qmail-send должен решить, какие адресаты
являются локальными и какие удаленными.
Когда qmail-send замечает файл todo/457, он узнает, что сообщение 457 находится в состоянии S4.
Qmail-send удаляет info/457, local/457 и remote/457, если они существуют. После чего, он прочитывает todo/457,
создает info/457, возможно local/457 и возможно remote/457, после чего удаляет intd/457.
Наконец, qmail-send удаляет todo/457, и сообщение попадает в состояние S5. К этому моменту сообщение удачно прошло
предварительную обработку перед дальнейшей отправкой.
Как сообщения доставляются
Сообщения в состоянии S5 управляются следующим образом. Каждый адрес в local/457 и remote/457
помечается как NOT DONE или DONE.
DONE: сообщение было успешно доставлено или последняя попытка доставки встречается с постоянным отказом,
другими словами, qmail-send не будет больше совершать попыток доставки данного
сообщения.
NOT DONE: qmail-send будет пытаться доставить данное сообщение в будущем.
Если попытка доставки сообщения сталкивается с постоянным отказом, qmail-send сперва добавляет заметку
в bounce/457, создавая этот файл при необходимости, после чего помечает данный адрес как DONE.
Qmail-send может обрабатывать bounce/457 в любое время следующим образом: добавляет новые заметки об
отказах; удаляет bounce/457.
Когда все адреса в local/457 помечены как DONE, qmail-send удаляет local/457 (аналогично для remote/457).
После обработки всех адресов из local/457 и remote/457, qmail-send устраняет сообщение следующим образом.
Сначала, если существует bounce/457, qmail-send управляет им как описано выше. Как только bounce/457
точно обработан, qmail-send удаляет info/457 и mess/457, помещая сообщение в состояние S1.
Очистка очереди
Если происходит крах системы в то время, как qmail-queue пытается поставить сообщение в очередь
или qmail-send устраняет сообщение, оно может быть потеряно в состояниях S2 или S3.
Когда qmail-send видит сообщение в состояниях S2 или S3, причем mess/457 'старше' 36 часов,
qmail-send удаляет intd/457, если он существует.
Аналогично, когда qmail-send, видит файл в каталоге pid/, который 'старше' 36 часов, также удаляет его.
Чистки очереди не являются необходимыми, если крах системы происходит в то время, как qmail-send доставляет
сообщение. Хуже ситуация, когда сообщение доставляется дважды (это может случиться, например,
если SMTP-соединение рушится как раз перед моментом оповещения сервером об успешном получении
сообщения).
Sendmail, конечно, популярный транспортный агент системы
электронной почты, но... Ни для кого не секрет, что практически каждые несколько месяцев CERT (Computer Emergency Response
Team) публикует очередной список дыр в безопасности sendmail. Можно не без оснований предполагать,
что этот процесс будет продолжаться еще достаточно долго...
"Sendmail характерен тем, что практически любой незначительный баг в нескольких десятках тысяч строк кода
несет в себе серьезный риск с точки зрения безопасности" (© Russell Nelson).
Qmail разрабатывалась как серьезная альтернатива sendmail, лишенная подобного удовольствия.
Автор qmail, Д.Бернстейн, в марте 1997 года установил премию в размере $500 тому, кто
первым предоставит сведения о дырах в безопасности в последних версиях qmail.
До сегодняшнего момента никому не удалось обнаружить ничего подобного.
Группа пользователей qmail предложила приз в $1000 на 1 год со схожими условиями.
Этот приз также не был востребован, и деньги были пожертвованы в Фонд Свободно
Распространяемого Программного Обеспечения (Free Software Foundation).
Sendmail обращается к программам и файлам как к адресам. Это фактически дает возможность
любому пользователю выполнять произвольные программы или производить запись в произвольные файлы.
В qmail программы и файлы - не адреса. Локальный доставочный агент, qmail-local,
может выполнять программы или писать в файлы, перечисленные в ~user/.qmail (по предназначению
сродни .bashrc, .cshrc и т.п.), но это всегда происходит с правами данного пользователя.
Понятие пользователя может быть определено конфигурацией, при этом root никогда не выступает
в роли пользователя.
Из двадцати самых весомых дыр в защите sendmail одиннадцать работали только
потому что вся система sendmail - setuid.
Лишь одна программа qmail - setuid: qmail-queue. Ее задача - добавить новое почтовое сообщение
в очередь исходящих сообщений.
Sendmail выполняется с правами суперпользователя, что лишает возможности отслеживать возникающие
ошибки встроенными системами защиты операционной системы.
Напротив, только две программы qmail, qmail-start и qmail-lspawn, выполняются с правами root.
Пять из программ qmail -- qmail-smtpd, qmail-send, qmail-rspawn, qmail-remote, и tcp-env --
не критические с точки зрения безопасности. Даже при условии, что все они поставлены под угрозу,
и кто-либо получил контроль над qmaild, qmails, qmailr и очередью сообщений,
тем не менее он не сможет взломать Вашу систему.
Ни одна из других программ не доверяет результатам работы этих пяти.
Кроме этого эти пять программ не доверяют даже друг другу. Они принадлежат трем разным группам,
и можно сказать, что каждая группа обладает иммунитетом по отношению к атакам программ из других
групп.
Qmail - набор отдельных простых, но эффективных программ, в отличие от грузных монстров - большинства
других почтовых транспортных агентов.
Различные аспекты безопасности qmail рассматриваются в связи с другими вопросами, такими как структура очереди сообщений, процесс отправки сообщений, формат Maildir и т.п.
Д.Дж.Бернстейн вместе с новым MTA, предложил использовать и новый формат почтовых ящиков - Maildir. Попытаемся вкратце разобраться в преимуществах и недостатках использования нового формата.
Как известно, все новое приживается обычно с трудом: необходимо, чтобы предлагаемое новшество наголову превосходило имеющиеся образцы, лишь тогда есть надежда, что на него хотя бы обратят внимание. Итак, большинство традиционных MUA не поддерживают формат Maildir, для дополнительных серверов (IMAP, POP3 и т.п.) нужны либо родные варианты программ qmail, либо заплатки. Для умеренного консерватора уже достаточно: лучше все оставить как есть...
Ладно, представим ситуацию: происходит крах ситемы во время доставки сообщения. Для файлов в формате mbox это значит, что сообщение будет молчаливо обрезано и присоединено к следующему сообщению. Далее, mbox формат предполагает во время доставки почты конкретному пользователю обновление единого центрального файла программой доставки. Если программа не использует механизм запирания (lock), центральный файл может быть испорчен.
Пользователь может пытаться удалить сообщения из почтового ящика в тот же самый момент, когда доставляется новое сообщение. В этом случае, при использовании формата mbox пользовательская программа чтения почты должна знать об использовании механизма запирания программой доставки.
Известно, что NFS (Network File System) не использует надежного механизма запирания. Это, как уже говорилось, чревато тем (для формата mbox), что при возможной доставке почты двумя машинами некоторому пользователю или при чтении пользователем почты откуда-либо, кроме самой машины, осуществляющей доставку почты - существует риск потерять часть почтовых сообщений. Что неприятно. Да, формат mh обладает практически теми же недостатками, что и mbox.
А что же Maildir? Maildir - структура каталогов для хранения входящей почты. Каталог в формате Maildir состоит из трех подкаталогов: tmp, new и cur.
Каждый файл в каталоге new представляет собой новое доставленное сообщение. Время модификации файла соответствует времени доставки сообщения. Сообщение доставляется без дополнительной строки From_ (UUCP-style), без пустой строки в конце. Формат сообщения соответствует RFC 822. Файлы в каталоге cur такие же, как в new, но файлы в cur не являются уже 'новыми' почтовыми сообщениями: они были просмотрены пользовательской программой чтения почты.
Каталог tmp используется для обеспечения гарантированной доставки сообщений. Программа доставки производит следующие операции: переходит в каталог Maildir; создает (с некими предварительными проверками уникальности и отсутствия ошибок) файл tmp/time.pid.host, где time - число секунд с 1970 года по времени GMT (Гринвичу), pid - ID процесса доставки (гарантия уникальности - создается для каждой доставки вызовом fork), host - имя машины; записывает сообщение в файл; перемещает сообщение в new/time.pid.host.
Программа чтения почты просматривает каталог new на наличие новых сообщений. Она может вывести содержимое нового сообщения new/unique, удалить new/unique или переименовать сообщение в каталог cur/unique:info (info эквивалентно полю Status, используемому программами чтения почты в формате mbox). Программа чтения также ожидает просмотра каталога tmp и удаляет обнаруженные там 'старые' файлы с сообщениями. Файл из tmp может быть надежно удален, если к нему не было доступа в течение 36 часов.
На этом закончу этот краткий обзор. Итак, выбор за Вами: некоторые аргументы представлены.
Если Вы решились, то, во-первых, можете посмотреть FAQ о переключении на
использование Maildir. Во-вторых, этот процесс можно некоторым образом автоматизировать на будущее, а именно
модифицировать скрипт adduser, добавив туда создание каталога Maildir (maildirmake), дополнить
дот-файлы (dot-files), копируемые системой в домашний каталог при добавлении нового пользователя,
установив необходимые переменные окружения (см. FAQ о Maildir),
создать там файл типа dot.qmail содержащий строку ./Maildir/
Теперь, при добавлении нового пользователя будут производиться необходимые операции, обеспечивающие
работу почтовой системы при использовании формата Maildir.
О конфигурировании пользовательских почтовых программ для работы с qmail - см. соответствующий раздел FAQ.
Итак, Вы, как достаточно любопытный и продвинутый пользователь,
узнали о том, что Ваш системный администратор установил qmail.
Возникает резонный вопрос: чем это Вам грозит? В принципе Вы имеете
законное право на получение некоторой информации, связанной с особенностями
конфигурации qmail. И если сисадмин немного разбирается в том, чем он,
собственно, занимается, то он наверняка пошлет ... письмо с подобающими
объяснениями (список необходимых вопросов можно обнаружить в последнем пункте).
Ну, а пока Вы ждете ответа...
Попробуем выяснить, где же теперь расположен Ваш почтовый ящик. Сперва стоит написать себе письмо (по Вашему усмотрению -приличного или не очень содержания). Ждем 6 секунд - есть надежда, что письмо пришло. Теперь смотрим в свой домашний каталог: тут появляются варианты
В первом случае сисадмин сконфигурил qmail так, что для локальной доставки сообщений используется собственная программа qmail под названием qmail-local. Теперь попробуйте прочесть почту обычным образом (для примера, с помощью программы mail). Успех? Это означает, что Ваш почтовый ящик перекочевал в ~you/Mailbox и сделана символическая ссылка из /var/spool/mail/you на ~you/Mailbox для того, чтобы Ваш пользовательский агент (MUA) мог обнаружить почтовый ящик на новом месте. Правда, нужно отметить, что не со всеми пользовательскими агентами (pine, MH, elm и т.п.) удастся так запросто справиться - впрочем, это уже забота системного администратора.
Во втором случае предполагается использовать, собственно, одно из преимуществ qmail - новый формат почтовых ящиков Maildir. Для чтения почты Вам придется использовать программы maildir2mbox, maildirwatch и установить некоторые переменные окружения (см. раздел FAQ - дополнительно).
В последнем случае - все осталось по старому
с точки зрения Вас - пользователя: не нужно совершать никаких лишних телодвижений
(например, нажимать на разные клавиши).
Контроль за появлением петель при пересылке почты
Локальный доставочный агент qmail -- qmail-local автоматически добавляет поле
Delivered-To в заголовок каждого сообщения. Это дает возможность предотвратить
появление петель при перенаправлении сообщений.
Контроль за исходящими сообщениями
При использовании qmail Вы имеете возможность контролировать вид исходящих сообщений дополнительно к тому, что предлагается Вашим MUA. Например, программа qmail-inject может автоматически устанавливать поле Mail-Followup-To для списков рассылки определенных в файле, заданном переменной окружения $QMAILMFTFILE.
Дополнительно можно организовать так называемую маскировку пользователя (в поле From будет добавляться нечто отличное от you@yourhost: см. раздел FAQ - управление видом исходящих сообщений).
Перенаправление почты, списки рассылки
Qmail имеет мощные инструменты для поддержки личных списков рассылки, причем это не
предполагает обязательного общения с системным администратором.
Вы можете контролировать доставку почты, приходящей на адреса you-anything (вместо
anything, понятно может быть практически все что угодно, в зависимости от Вашей фантазии).
Используйте для этого соответствующие файлы в Вашем домашнем каталоге ~you/.qmail-anything
(см. раздел FAQ - маршрутизация входящих сообщений на уровне пользователя).
К тому же можно управлять почтовыми сообщениями, приходящим на адреса you-unknown, т.е. для неопределенных Вами you-... адресов (используйте файл ~you/.qmail-default в Вашем домашнем каталоге).
Более полную и конкретную информацию (естественно, не только касающуюся данного пункта) можно отыскать в разделе FAQ и руководстве по qmail (добавьте пути к man-страницам qmail - скорее всего - /var/qmail/man, если это не сделано на системном уровне, и вперед - man dot-qmail).
Да, здесь, Вам придется все-таки дождаться ответа сисадмина о следующих особенностях конфигурации qmail:
Простейшие примеры содержимого файлов .qmail
Предположим, что почтовый ящик пользователя располагается в его домашнем каталоге в файле Mailbox.