Copyright (C) 2004 М. Альхименко.
Оригинал статьи находится на http://lithium.opennet.ru
По всем вопросам обращайтесь на articles <at> lithium.opennet.ru
Любая публикация и перепечатка этого документа разрешается только с предварительного разрешения автора.
При публикации запрещается каким-либо образом изменять содержимое документа.
Содержание:
В предыдущей статье был рассмотрен процесс запуска qmail-start и qmail-smtpd.
Следующий этап — запуск pop3-демона, чтобы пользователи могли
получать доступ к своим maildir удаленно. Для этих целей мы будем использовать pop3d из состава qmail. Следует иметь
виду два обстоятельства:
- Этот pop3d работает только с форматом Maildir
- Пароли передаются открытым текстом.
Первое обстоятельство нас не волнует, т.к. у нас изначально используется Maildir, а по поводу второго мы предпримем
кое-какие шаги.
Кратко, как все работает. Как и в случае qmail-smtpd сокет слушается
программой tcpserver, которая принимает соединение и
запускает программу qmail-popup. Qmail-popup имеет два параметра запуска — хост и программа.
Qmail-popup читает имя пользователя и пароль и передает их
программе, которая используется для авторизации. В нашем случае это будет checkpassword (http://cr.yp.to/checkpwd.html) — программа, написанная
DJB и предназначеная для проверки имени пользователя/пароля в локальной БД паролей (файлах passwd/shadow). Сейчас мы работаем с локальными пользователями,
поэтому checkpassword нам как раз подходит. Сheckpassword получает логин и пароль,
проверяет их и, если они верны, запускает pop3-демон — qmail-pop3d (указывается, как параметр запуска checkpassword). Перед запуском qmail-pop3d,
checkpassword устанавливает переменные окружения $USER, $HOME и $SHELL, добавочные группы, gid, uid,
и домашний каталог пользователя. Все дальнейшие манипуляции с Maildir пользователя производит qmail-pop3d. Параметром запуска qmail-pop3d
является имя каталога, где хранятся сообщения пользователя (обычно Maildir).
Следует заметить, что путем замены checkpassword можно осуществить другие схемы
авторизации (например, 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
+OK
pass Friend
-ERR authorization failed
Имитируем удачный логин, используя корректные имя пользователя и пароль. Вы должны увидеть домашний каталог
пользователя:
# /var/qmail/bin/qmail-popup blah /bin/checkpassword pwd
+OK <32326.1076056411@blah>
user max
+OK
pass mypasword
/home/max
Имитируем удачный логин, но взамен программы pwd будет запущена программа id, и мы должны увидеть uid и gid аккаунта:
# /var/qmail/bin/qmail-popup blah /bin/checkpassword id
+OK <32321.1076056345@blah>
user max
+OK
pass mypassword
uid=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
В этом случае необходимо найти этот файл (у нас это krb5.h) и в Makefile включить путь к нему в параметр INCS, который
по умолчанию закомментирован:
INCS=-I /usr/kerberos/include/
Также, это возможно сделать в файле conf-cc добавив там в параметры запуска gcc параметр -I/usr/kerberos/include/.
Более подробно обо всем этом — man gcc.
Итак, мы собрали и установили пропатченный tcpserver. После этого можно запустить остановленные сервисы, попытаться
подключиться к ним и посмотреть в журналы чтобы проверить, не мало ли мы им отвели ресурсов.
Как уже упоминалось, pop3 передает пароли открытым текстом по
сети, поэтому это решение крайне небезопасное, особенно в
случае реальных пользователей, как у нас (DJB тоже предупреждает об этом в man qmail-popup). Поэтому вначале мы
рассмотрим создание обычного pop3-сервиса (для тренировки), а потом с
поддержкой ssl, чтобы следовать принципу "от простого к сложному". Если вы в себе чувствуете силы сразу перейти к
настройке ssl, то можете пропустить этот раздел.
Создаем каталог для сервиса:
# mkdir /var/qmail/pop3d
# cd /var/qmail/pop3d
создаем файл скрипта запуска:
# touch run down
# chmod 755 run
C помощью любимого редактора меняем его содержимое на:
#!/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
Здесь вначале перенаправляется stderr, потом запускается softlimit, который устанавливает пределы на использование
памяти и запускает tcpserver. В tcpserver передаются некоторые параметры, слушаемый адрес, порт (запись для pop3 должна быть у вас в
/etc/services). Tcpserver при установлении соединения перенаправляет полученные данные в программу qmail-popup,
параметрами запуска которой являются имя хоста (host.domain.ru) и программа проверки пароля (checkpassword). Qmail-popup принимает пароль и передает его
checkpassword, который проверяет логин/пароль в файлах passwd/shadow и запускает программу qmail-pop3d, единственным
параметром запуска которой является имя каталога с хранилищем сообщений пользователя (Maildir). Вам необходимо изменить имя хоста
host.domain.ru на имя вашего хоста.
После этого создаем подкаталог log для запуска программы логирования:
# mkdir log
# cd log
# touch run down
# chmod 755 run
Содержимое скрипта запуска:
#!/bin/sh
exec 2>&1
exec setuidgid qmaill /var/qmail/bin/splogger pop3d 2
параметры запуска уже обсуждались в предыдущей статье.
Следует иметь в виду что при указанных параметрах запуска tcpserver он будет выводить в лог только записи об ошибках.
Если вам нужна более подробная информация используйте параметр -v.
Создаем символическую ссылку в /services:
# ln -s /var/qmail/pop3d /services
C помощью pstree убеждаемся, что стартовали две новых копии supervise для каталогов pop3d и pop3d/log. Запустим pop3d:
# svc -u /service/pop3d/ /service/pop3d/log/
C помощью pstree убедимся, что обе копии supervise запустили процессы tcpserver и splogger. C помощью ps -auxw и cat
/var/log/maillog (или куда у вас кидаются сообщения с faculty = mail) убедимся, что ошибок нет. Присоединимся с помощью
telnet и выполним пару основных команд pop3 (если у вас в maildir нет почты пошлите себе тестовое письмо):
# telnet host.domain.ru 110
Trying 123.45.67.8...
Connected to host.domain.ru.
Escape character is '^]'.
+OK <5904.1076185678@host.domain.ru>
user max
+OK
pass mypassword
+OK
stat
+OK 113 5103091
retr 1
+OK
[здесь выводится содержимое первого письма]
quit
+OK
Connection closed by foreign host.
Здесь было произведено подключение, авторизация, просмотр статистики, чтение первого письма и отключение. Если Вы делаете эти
действия через сеть, то лучше сменить после этого пароль, т.к. его могли перехватить.
Мы научились запускать pop3d, теперь сделаем это же самое с использование ssl. Но перед этим надо удалить pop3d-сервис:
# cd /var/qmail/pop3d
# rm -f /service/pop3d
# svc -x . ./log
# svc -d /service/pop3d/ /service/pop3d/log/
Через несколько секунд оба процесса supervise завершатся. Теперь можно запускать pop3 через ssl.
Здесь все то же самое, поэтому будут объяснены только новые
моменты:
# mkdir /var/qmail/pop3sd
# cd /var/qmail/pop3sd
# touch run down
# chmod 755 run
После наложения патча нам стали доступны два новых параметра запуска tcpserver:
- "-s" Разрешает использование SSL.
- "-n" Указывает путь к SSL сертификату.
В Makefile стали доступны еще две цели: cert и cert-req. Первый создает самоподписанный сертификат, второй — запрос на
сертификат. Вряд ли вы будете заверять свой сертификат в Verising, поэтому сгенерируем его с помощью make cert в папке
исходников tcpserver:
# cd /usr/src/ucspi-tcp-0.88
# make cert
После этого вам буду заданы несколько вопросов. Впишите свои данные, желательно правдивые. Сведения об имени хоста надо
указывать обязательно подлинные, иначе клиентские программы могут ругаться.
После этого перенесем сертификат в надежное место и установим соответствующие права на него:
# mv cert.pem /var/qmail/control
# chmod 400 /var/qmail/control/cert.pem
# cd /var/qmail/pop3sd
(Этот шаг очень важен: в файле сертификата хранится информация, которая не должна быть доступна для чтения никому,
кроме root!)
Затем изменяем файл запуска pop3sd на следующее содержимое:
#!/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
Все отличия — разрешение использования SSL, указание пути к сертификату и другой номер порта, т.к. для POP3 over SSL
определен свой порт.
После этого создаем подкаталог log для запуска программы логирования:
# mkdir log
# cd log
# touch run down
# chmod 755 run
Содержимое скрипта запуска:
#!/bin/sh
exec 2>&1
exec setuidgid qmaill /var/qmail/bin/splogger pop3d 2
# ln -s /var/qmail/pop3sd /service
# svc -u /service/pop3sd/ /service/pop3sd/log/
Проверки запуска процессов те же самые. Однако, присоединиться с помощью telnet по POP3 over SSL мы уже не можем. Используем функции
пакета openssl:
# openssl
OpenSSL> s_client -host host.domain.ru -port 995
[После выдачи информации о сертификате и подключении мы получаем обычный сеанс pop3. Проверим работу pop3d, используя
приведенные ранее команды.]
OpenSSL> quit
Все, можно удалить файлы pop3sd/down и pop3sd/log/down и настраивать клиентов. Не забудьте, что сейчас используется POP3 over SSL и, соответственно, другой порт.
Чтобы правильно настроить клиентскую программу, обратитесь к её документации. Все основные современные почтовые клиенты
могут использовать этот протокол.
Т.о. теперь есть законченное решение по запуску почтового сервера (MTA+POP3D) с помощью qmail с использование системных аккаунтов. Если
вы не хотите, чтобы пользователи могли использовать оболочку на сервере, измените оболочку пользователя в /etc/passwd или файл конфигурации openssh.
|