пятница, 14 октября 2011 г.

Postfix maildir umask

Захотел написать небольшое веб-приложение для управления почтовым сервером. Одна из функций этого приложения - удаление почтового ящика из БД. Стандартная задача, которая обычно возникает при удалении почтового ящика, - это создать пересылку с удалённого адреса на другой и перенести уже принятые письма в каталог преемника.

Пример: сотрудник раздавал клиентам визитки со своим электронным адресом. Сотрудник уволился, но его электронную почту нужно обрабатывать, чтобы не потерять клиентов. Для этого можно создать пересылку на другой почтовый ящик, уже полученные письма перенести в почтовый ящик преемника, а сам почтовый ящик уволившегося сотрудника удалить.

Переносом писем по задумке должно заниматься веб-приложение, работающее с правами веб-сервера. Чтобы веб-сервер мог перенести письма, ему нужно иметь соответствующие права доступа. Для этого я включил пользователя www-data в группу vmail, затем дал группе vmail права rwx на каталоги почтовых ящиков.

Каталоги почтовых ящиков создаёт программа virtual почтовой системы Postfix. Можно задать uid и gid, с которыми будет работать эта программа. Это делается с помощью параметров virtual_uid и virtual_gid. Я для пробы решил создать один почтовый ящик и отправить на него письмо. virtual создал каталоги почтового ящика, но выставил для группы vmail права доступа, которые не позволяют ей делать ничего с этим ящиком.

Я прочитал man virtual в надежде найти какой-нибудь параметр вроде virtual_umask, но не нашёл. Попробовал выставить umask в файле /etc/init.d/postfix, перезапустил его, удалил каталог почтового ящика и снова отправил тестовое письмо. Каталог создался с теми же правами. В недоумении я стал искать в интернете, не сталкивался ли кто с такой же проблемой.

Оказалось - сталкивались. А параметра virtual_umask нет и не будет. Вьетце Венема аргументирует свою позицию тем, что он сисадмин с 20-летним стажем и доступ к письмам со стороны левых программ может отрицательно отразиться на безопасности почтовой системы. Никаких других доводов он слышать не желает. В том числе он не желает слышать о том, что система прав в Unix задумана такой не для того, чтобы искусственно обходить её стороной. Патчи, если кто такие и напишет, судя по молчанию Вьетце, приняты в основную ветку не будут.

Единственное приемлемое решение моей задачи, по мнению Вьетце Венема, - это забрать почту по протоколу POP из этого ящика и отправить её на другой ящик по протоколу SMTP.

У меня отношение к этому простое - безопасность ради безопасности не нужна. Я лучше постараюсь заменить Courier на какую-нибудь другую программу, которая сама умеет складывать письма в почтовые ящики и имеет собственный модуль доставки для Postfix или умеет работать по протоколу LMTP. В качестве замены исправно работающего много лет Courier воспользуюсь Dovecot.

В общем, если что - не удивляйтесь невменяемости этого уважаемого всеми товарища.

P.S. Настроил Dovecot вместо Courier и... всё то же самое. Настройка umask у Dovecot в прошлом была, но потом была удалена. Вместо неё придумали плагины для работы с общими почтовыми ящиками. Не смешно, но для такой простой операции, видимо, придётся воспользоваться чем-то вроде fetchmail. Хотя, можно воспользоваться sudo, в конфиге которой прописать одну строго ограниченную команду, можно сделать скрипт, работающий по cron'у, можно пропатчить сам Dovecot, а вот использование LMTP из Dovecot тоже не поможет.

2 комментария:

Avari комментирует...

По-моему, есть ряд несложных решений, основанных на том, что скрипты вообще-то не обязаны запускаться именно с правами www-data.
- тупо сделать суидный cgi. не suid root, а suid vmail или что там за пользователь. Написать на перле, на баше, на чём угодно (php тут не подходит). Если безопасность не пугает, это тоже испугать не должно ;)
- отказаться от апача и использовать nginx+php-fpm (наверное, можно apache2+php-fpm, только зачем?) - в php-fpm можно настроить несколько пулов, в каждом из которых воркеры от разных пользователей. Тут, понятно, и на php писать можно. Вообще очень гибкое решение, не нарадуюсь. Особенно на производительность не нарадуюсь - в нашем случае после перехода с apache2+mod_php5 на nginx+php-fpm нагрузка на серверы рухнула на глаз примерно вдвое...
- поставить apache2-mpm-itk. Осторожно, ему тоже нужно указывать, от имени какого пользователя запускается какой виртуальный хост, причём без этого он работать не хочет ;) Идея та же.

morbo комментирует...

- сделать суидный cgi можно и на php, только не хочется ради одного веб-приложения городить огород. К тому же, хоть производительность в моём случае и не важна, но cgi-скрипты работают несколько помедленне, чем скрипты в mod_php или на fastcgi.

- я апачем и не пользуюсь, а пользуюсь lighttpd + fastcgi. Считайте, что этот пункт уже почти реализован.

Сейчас посмотрел в документацию на fastcgi - есть возможность запускать fastcgi от разных пользователей. Кажется, это то, что нужно.

- я апачем не пользуюсь. Во всяком случае, стараюсь не пользоваться.

Спасибо за подсказку.