В предыдущей статье был рассмотрен процесс запуска qmail-start и qmail-smtpd. Следующий этап — запуск pop3-демона, чтобы пользователи могли получать доступ к своим maildir удаленно. Для этих целей мы будем использовать pop3d из состава qmail. Он работает только с форматом maildir.
Кратко, как все работает. Как и в случае qmail-smtpd сокет слушается программой tcpserver, которая принимает соединение и запускает программу qmail-popup. Qmail-popup имеет два параметра запуска — хост и программа. Qmail-popup читает имя пользователя и пароль и передает их программе, которая используется для авторизации. Для общения с этой программой служит описанный DJB checkpassword-интерфейс. В нашем случае этой программой будет checkpassword — программа, написанная DJB и предназначеная для проверки имени пользователя/пароля в локальной БД паролей (файлах passwd/shadow). Сейчас мы работаем с локальными пользователями, поэтому checkpassword нам как раз подходит. К сожалению, checkpassword не поддерживает APOP, поэтому мы будем использовать SSL. Сheckpassword получает логин и пароль, проверяет их и, если они верны, запускает pop3-демон — qmail-pop3d (указывается, как параметр запуска checkpassword). Перед запуском qmail-pop3d, checkpassword устанавливает переменные окружения $USER, $HOME и $SHELL, добавочные группы, gid, uid, и домашний каталог пользователя. Все дальнейшие манипуляции с Maildir пользователя производит qmail-pop3d. Параметром запуска qmail-pop3d является имя каталога, где хранятся сообщения пользователя (обычно Maildir).
Следует заметить, что путем замены checkpassword можно осуществить другие схемы авторизации (например, APOP) и содержать отдельную от системной БД пользователей. Imho vpopmail — один из лучших претендентов на эту роль, а его альтернатива checkpassword — vchkpw поддерживает APOP.
Скачиваем и распаковываем исходники checkpassword:# cd /usr/src# wget http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz# gunzip checkpassword-0.90.tar# tar -xf checkpassword-0.90.tar# cd checkpassword-0.90Создаем каталог для патча, скачиваем его и накладываем:# mkdir patch# cd patch# wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/checkpassword-0.90.errno.patch (этот патч устраняет несовместимость с glibc 2.3.1 и выше )# cd ..# patch -p1 < patch/checkpassword-0.90.errno.patchСобираем и устанавливаем:# make# make setup checkТестирование:Имитируем неудавшуюся попытку pop3-авторизаци:# /var/qmail/bin/qmail-popup blah /bin/checkpassword pwd+OK <...@blah>user Frodo+OKpass Friend-ERR authorization failedИмитируем удачный логин, используя корректные имя пользователя и пароль. Вы должны увидеть домашний каталог пользователя:# /var/qmail/bin/qmail-popup blah /bin/checkpassword pwd+OK <32326.1076056411@blah>user max+OKpass mypasword/home/maxИмитируем удачный логин, но взамен программы pwd будет запущена программа id, и мы должны увидеть uid и gid аккаунта:# /var/qmail/bin/qmail-popup blah /bin/checkpassword id+OK <32321.1076056345@blah>user max+OKpass mypassworduid=500(max) gid=500(max) groups=500(max)На этом установку checkpassword можно считать законченной.
Теперь нам надо позаботиться о безопасности паролей. Для tcpserver из состава ucspi-tcp есть патч для поддержки ssl. Мы будем использовать его, но можно использовать программу stunnel, которая осуществляет прозрачное туннелирование трафика через SSL для демонов, которые не знают о ssl.Скачиваем, распаковываем и накладываем патч:# cd /usr/src/ucspi-tcp-0.88/patch# wget http://www.nrg4u.com/qmail/ucspi-tcp-ssl-20020705.patch.gz# gunzip ucspi-tcp-ssl-20020705.patch.gz# cd ..# patch -p0 < patch/ucspi-tcp-ssl-20020705.patchТеперь нам нужно сделать две вещи: остановить все сервисы, использующие tcpserver и увеличить заранее параметр softlimit на 2-3 мегабайта, т.к. tcpserver теперь будет занимать больше памяти из счет библиотек SSL. В простейшем случае это будет:# svc -d /service/smtpdи редактирование файла /var/qmail/smtpd/run.Если вы недостаточно увеличите лимит ресурсов, то в журналах могу появиться записи вроде:error while loading shared libraries: libc.so.6 failed to map segment from shared object Cannot allocate memoryи tcpserver будет падать или при запуске или при попытке коннекта к нему. В этом случае надо еще немного поднять лимит.Итак, мы отредактировали скрипты запуска и остановили все сервисы, использующие tcpserver.Пересоберем и переустановим tcpserver:# make clean# make setup checkСледует иметь в виду, что в некоторых случаях заголовочные файлы могут размещаться в нестандарных местах или их может не быть. Для сборки нужен пакет openssl и его заголовочные файлы (в RH9 это пакет openssl-devel), библиотеки и заголовочные файлы Kerberos (krb5-libs и krb5-devel в RH9). Если при сборке необходимые файлы не будет найдены, вы получите что-то вроде этого:
In file included from /usr/include/openssl/ssl.h:179, from tcpserver.c:4: /usr/include/openssl/kssl.h:72:18: krb5.h: No such file or directory и далее несколько строк с ошибками, заканчивающимися make: *** [tcpserver.o] Error 1
Как уже упоминалось, pop3 при работе с оригинальным checkpassword передает пароли открытым текстом по сети, поэтому это решение крайне небезопасное, особенно в случае реальных пользователей, как у нас (DJB тоже предупреждает об этом в man qmail-popup). Поэтому вначале мы рассмотрим создание обычного pop3-сервиса (для тренировки), а потом с поддержкой ssl, чтобы следовать принципу "от простого к сложному". Если вы в себе чувствуете силы сразу перейти к настройке ssl, то можете пропустить этот раздел.Создаем каталог для сервиса:# mkdir /var/qmail/pop3d# cd /var/qmail/pop3dсоздаем файл скрипта запуска:# touch run down# chmod 755 runC помощью любимого редактора меняем его содержимое на:
#!/bin/sh exec 2>&1 exec softlimit -m 5000000 \ tcpserver -RHD 0 pop3 /var/qmail/bin/qmail-popup host.domain.ru \ /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir
#!/bin/sh exec 2>&1 exec setuidgid qmaill /var/qmail/bin/splogger pop3d 2
Здесь все то же самое, поэтому будут объяснены только новые моменты:# mkdir /var/qmail/pop3sd# cd /var/qmail/pop3sd# touch run down# chmod 755 runПосле наложения патча нам стали доступны два новых параметра запуска tcpserver:
#!/bin/sh exec 2>&1 exec softlimit -m 5000000 \ tcpserver -RHD -s -n /var/qmail/control/cert.pem 0 pop3s \ /var/qmail/bin/qmail-popup host.domail.ru \ /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir