Не так давно перевёл pop3/imap4 почтовик с courier imap на dovecot и последним очень доволен. Работает в разы быстрее, интеграция с vpopmail делается очень просто и при том несколькими методами. Я выбрал самый удобный для меня, через прямой коннект к Mysql-базе впопмыла.
Авторизацию настраивается через dovecot-sql.conf - просто создаём запрос для проверки наличия пользователя и пароля. Сложнее оказалось применить ограничения vpopmail и сделать обновление в базе последней авторизации пользователя. Хотя и тут ничего гениального.
Мой запрос для password_query:
password_query = SELECT CONCAT(pw_name, ‘@’, pw_domain) AS user, pw_clear_passwd AS password FROM vpopmail WHERE pw_name = ‘%n’ AND pw_domain = ‘%d’ AND NOT (pw_gid & (ELT(FIELD(’%s’,'imap’, ‘pop3′), ‘8′, ‘2′)) OR (’%r’='192.168.0.5′ AND (pw_gid & 4)))
Выглядит немного страшно, но зато использует ВСЕ возможнные ограничения, которые ставятся через vmoduser и проверяет флаги пользователя. А это:
- -p ( disable POP access ) - запрещает доступ по POP
- -w ( disable webmail [IMAP from localhost*] access ) - запрещает доступ через вебмейл (в моём случае адрес вебмейл сервера - 192.168.0.5)
- -i ( disable non-webmail IMAP access ) - запрещает доступ по IMAP
и попытка авторизации юзера, который не проходит по одному из ограничений завершится неудачей на этапе авторизации. Жаль только, что он не получит вменяемого сообщения, почему ему отказано в авторизации… но это уже мелочи.
Запрос для user_query, насколько помню, взял почти полностью из wiki, лишь доработав “под себя”:
user_query = SELECT pw_dir as home, 107 AS uid, 98 AS gid, concat(’maildir:storage=’, floor(pw_shell/1024)) AS quota FROM vpopmail WHERE pw_name = ‘%n’ AND pw_domain = ‘%d’
После этого dovecot начинает замечательно работать с пользователями, но, к сожалению, не пишет информацию о времени последней авторизации пользователя в базу vpopmail.
Исправляется оно очень просто через механизм post-login.
Создаём 2 bash скриптика (можно на php или perl) с таким содержимым:
#!/bin/sh
DBHOST=*****
DBUSER=vpopmailuser
DBPASS=********
DBNAME=vpopmailmysql -u $DBUSER -h $DBHOST -p$DBPASS -e ‘INSERT INTO lastauth SET user=SUBSTRING_INDEX( “‘$USER’” , “@”, 1), domain=SUBSTRING_INDEX( “‘$USER’” , “@”, -1), remote_ip=”‘$IP’”, timestamp=UNIX_TIMESTAMP(NOW()) ON DUPLICATE KEY UPDATE remote_ip=”‘$IP’”, timestamp=UNIX_TIMESTAMP(NOW())’ $DBNAME &> /dev/null
exec /usr/lib/dovecot/imap $*
Подправляем параметры базы и для pop3 приводим в соответствие строку exec.
В конфиге dovecot.conf переключаем mail_drop_priv_before_exec в yes, чтобы во время выполнения нашего скрипта, уже были сброшены привилегии рута (мало ли чего) и не забываем выставить владельца и права на скрипте, чтобы он был доступен только dovecot на выполнение и чтение.
В секции для протоколов imap и pop говорим давкоту использовать наш скрипт для пользователей сразу после авторизации в таком виде: mail_executable = /home/vpopmail/dovecot/last_login_imap.sh
Всё, теперь имеем полную интеграцию vpopmail c dovecot лишь через mysql и bash.
P.S. Если вы ещё продолжаете пользовать Courier очень рекомендую перейти на Dovecot - не пожалеете.
Свежие комментарии