четверг, марта 29, 2007

Mysql+cyrus-sasl+courier-imap+postfix Freebsd 6.2

Рекомендую к прочтению также вот этот документ (Установка связки Postfix, MySQL, SpamAssassin, Maia в FreeBSD.), как более свежий :)

по мотивам статьи http://www.opennet.ru/base/net/postfix_tls.txt.html

подключаемся к mysql
mysql –u root –p
создаем базу mail
create database mail;
use mail;
создаем таблицу транспорт
create table transport(
domain varchar(255) not null default '',
transport varchar(255) not null default '',
comment text,
primary key(domain)
);
Пишем в таблицу транспорт все свои домены
insert into transport(domain, transport)
values('вашдомен.ru','virtual:');
Создаем таблицу aliases
create table aliases(
alias varchar(255) not null default '',
rcpt varchar(255) not null default '',
comment text,
primary key(alias)
);
Добавляем алиасы для root, postmaster
insert into aliases(alias, rcpt)
values('root@вашдомен.ru', 'пользователь@вашдомен.ru');
insert into aliases(alias, rcpt)
values('postmaster@вашдомен.ru', 'пользователь@вашдомен.ru');
Создаем таблицу пользователи
create table users(
login varchar(255) not null default '',
password varchar(255) not null default '',
maildir varchar(255) not null default '',
expired char default '0',
antivirus char default '1',
antispam char default '1',
comment text,
primary key(login),
key login_expired(login, expired),
key login_antivirus(login, antivirus),
key login_antispam(login, antispam)
);
Пишем в таблицу пользователи
insert into users(login, password, maildir)
values('пользователь@вашдомен.ru', encrypt('password:)'), 'вашдомен.ru/пользователь/');
Создаем таблицу форвард
create table forward(
id int(10) unsigned not null auto_increment,
type varchar(50) not null default 'delivered-to',
mask varchar(255) not null default '.+',
forward_addr varchar(255) not null default 'root',
what char not null default 'i',
comment text,
primary key(id),
key what(what),
key type_mask(type, mask)
);
Всю почту для домена пересылать на
insert into forward(type, mask, forward_addr, what, comment)
values('delivered-to', '[a-z0-9\- _]+\\@вашдомен\\.ru', 'me@вашдомен.ru',
'i', 'forwarding all mail for raven.elk.ru');
Почту для test1 не пересылать на
insert into forward(type, mask, forward_addr, what, comment)
values('delivered-to', 'test1\\@вашдомен\\.ru', 'me@вашдомен.ru', 'e', 'ex
clude forward test1 mail');
Даем права пользователю
grant select on mail.* to mailer@localhost
identified by 'mailer_password';
grant select, insert, update on mail.* to mail_admin@localhost
identified by 'mail_admin_password';

cd /usr/ports/security/cyrus-sasl2
make install
cd /usr/ports/security/cyrus-sasl2-saslauthd
make install clean
ee /usr/local/lib/sasl2/smtpd.conf
содержимое smtpd.conf
#####
pwcheck_method: saslauthd

#####

cd /usr/ports/security/pam-mysql
make install clean
ln –sf /usr/local/lib/pam_mysql.so /usr/lib/pam_mysql.so
ee /etc/pam.conf права доступа 600 root:wheel
#####две строки, начинаются с smtp
smtp auth required pam_mysql.so user=mailer passwd=mailer_password db=mail
table=users usercolumn=login passwdcolumn=password crypt=1 where=expired=0
smtp account required pam_mysql.so user=mailer passwd=mailer_password db=mail
table=users usercolumn=login passwdcolumn=password crypt=1 where=expired=0

#####

В /etc/rc.conf добавить
saslauthd_enable=”YES”
saslauthd_flags=”-a pam -r”
/usr/local/etc/rc.d/saslauthd start
Проверить ps ax| grep sasl

/usr/ports/mail/postfix
make config
X PCRE
X SASL2
X TLS
X MySQL
make install

в /etc/rc.conf добавить: sendmail_enable="NONE"
в /etc/periodic.conf:
###
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

###

в /etc/rc.conf добавить postfix_enable=”YES”

содержимое /usr/local/etc/postfix/main.cf

###
soft_bounce = no
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
mail_owner = postfix
default_privs = nobody
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8, 192.168.11.0/24, 192.168.12.0/24
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
mail_spool_directory = /var/mail
smtpd_banner = $myhostname $mail_name
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = no
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_rbl_client list.dsbl.org, reject_rbl_client dynablock.wirehub.net, reject_rbl_client blackholes.wirehub.net, reject_rbl_client dnsbl.njabl.org
transport_maps = mysql:/usr/local/etc/postfix/sql/transport.cf
virtual_mailbox_base = /var/mail/virtual
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/sql/users.cf
virtual_alias_maps = mysql:/usr/local/etc/postfix/sql/aliases.cf
virtual_uid_maps = mysql:/usr/local/etc/postfix/sql/uids.cf
virtual_gid_maps = mysql:/usr/local/etc/postfix/sql/gids.cf
relay_domains = $transport_maps
local_recipient_maps = $virtual_mailbox_maps $virtual_maps $transport_maps $alias_maps
smtpd_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
#smtp_use_tls = yes
#smtp_tls_key_file = /usr/local/share/courier-imap/pop3d.pem
#smtp_tls_cert_file = $smtp_tls_key_file
#smtp_tls_CAfile = $smtp_tls_key_file
#smtp_tls_note_starttls_offer = yes
#smtpd_tls_auth_only = yes
#smtpd_use_tls = yes
#smtpd_tls_loglevel = 1
#smtpd_tls_received_header = yes
#smtpd_tls_session_cache_timeout = 3600s
#tls_random_source = dev:/dev/urandom
#smtpd_tls_key_file = /usr/local/share/courier-imap/pop3d.pem
#smtpd_tls_cert_file = $smtpd_tls_key_file
#smtpd_tls_CAfile = $smtpd_tls_key_file
message_size_limit = 20000000
notify_classes = bounce, delay, policy, protocol, resource, software
#content_filter = smtp-amavis:[127.0.0.1]:10024

###

/usr/local/etc/postfix/sql/transport.cf
###
user = mailer
password = mailer_password
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = localhost
###

содержимое /usr/local/etc/postfix/sql/users.cf
###
user = mailer
password = mailer_password
dbname = mail
table = users
select_field = maildir
where_field = login
additional_conditions = and expired = '0'
hosts = localhost
###

содержимое /usr/local/etc/postfix/sql/aliases.cf:
###
user = mailer
password = mailer_password
dbname = mail
table = aliases
select_field = rcpt
where_field = alias
hosts = localhost
###

содержимое /usr/local/etc/postfix/sql/gids.cf:
###
user = mailer
password = mailer_password
dbname = mail
table = users
select_field = 6 # это gid группы mail
where_field = login
additional_conditions = and expired = '0'
hosts = localhost
###

содержимое /usr/local/etc/postfix/sql/uids.cf:
###
user = mailer
password = mailer_password
dbname = mail
table = users
select_field = 125 # это uid пользователя postfix
where_field = login
additional_conditions = and expired = '0'
hosts = localhost
###

mkdir -pv /var/mail/virtual
chown postfix:mail /var/mail/virtual
chmod 770 /var/mail/virtual

postfix check
postfix start

Проверка работы postfix
#telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 raven.elk.ru mail sterver
#mail from: user@aol.com
250 Ok
#rcpt to: me@raven.elk.ru
250 Ok
#data
354 End data with .
#test message
#.
250 Ok: queued as AB11E334F2
#quit
221 Bye
Connection closed by foreign host.

Проверка работы с возможностью авторизации

#telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 raven.elk.ru mail sterver
#ehlo aol.com
250-raven.elk.ru
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
#AUTH PLAIN bWVAcmF2ZW4uZWxrLnJ1AG1lQHJhdmVuLmVsay5ydQBwYXNzd29yZDop
235 Authentication successful

строка 'bWVAcmF2ZW4uZWxrLnJ1AG1lQHJhdmVuLmVsay5ydQBwYXNzd29yZDop'
справедлива для логина 'me@raven.elk.ru' и пароля 'password:)'.
генерируется эта строчка следующим образом:

perl -MMIME::Base64 -e \
'print encode_base64("логин\0логин\0пароль");'

если диалог с почтовым сервером прошёл как показано выше, то
значит авторизация работает. если же нет, то, читайте
/var/log/maillog. вероятно, вы что-то не так сделали и очень
вероятно, что чтение данного лога поможет выяснить что же
конкретно неправильно.
Лично мне было лень и я настроил в почтовом клиенте пользователя и пароль и отправил.
Обратите внимание!!! Для того чтобы заработал новый почтовый ящик необходимо отправить на него письмо, создастся для него директория.

Настройка POP3 сервера.
cd /usr/ports/mail/courier-imap
make config
X OPENSSL
X AUTH_MYSQL
make install

cd /usr/localetc/authlib

редактируем authdaemonrc
####
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
LOGGEROPTS=""
####

редактируем authmysqlrc
####
MYSQL_SERVER localhost
MYSQL_USERNAME mailer
MYSQL_PASSWORD mailer_password
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD '125'
MYSQL_GID_FIELD '6'
MYSQL_LOGIN_FIELD login
MYSQL_HOME_FIELD '/var/mail/virtual/'
MYSQL_MAILDIR_FIELD maildir
MYSQL_WHERE_CLAUSE expired='0'
####

редактируем /usr/local/etc/courier-imap/pop3d
####
PIDFILE=/var/run/pop3d.pid
MAXDAEMONS=40
MAXPERIP=4
POP3AUTH="LOGIN PLAIN"
POP3AUTH_ORIG="LOGIN PLAIN"
POP3AUTH_TLS="LOGIN PLAIN"
POP3AUTH_TLS_ORIG="LOGIN PLAIN"
POP3_PROXY=0
PORT=110
ADDRESS=0
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=pop3d"
POP3DSTART=YES
MAILDIRPATH=Maildir
####

редактируем /usr/local/etc/courier-imap/pop3d-ssl
####
SSLPORT=995
SSLADDRESS=0
SSLPIDFILE=/var/run/pop3d-ssl.pid
SSLLOGGEROPTS="-name=pop3d-ssl"
POP3DSSLSTART=YES
POP3_STARTTLS=YES
POP3_TLS_REQUIRED=0
COURIERTLS=/usr/local/bin/couriertls
TLS_PROTOCOL=SSL3
TLS_STARTTLS_PROTOCOL=TLS1
TLS_CERTFILE=/usr/local/share/courier-imap/pop3d.pem
TLS_VERIFYPEER=NONE
TLS_CACHEFILE=/usr/local/var/couriersslcache
TLS_CACHESIZE=524288
MAILDIRPATH=maildir
####

теперь сгенерируем сертификат для нашего почтового сервера. для
этого сначала нужно отредактировать /usr/local/etc/courier-imap/pop3d.cnf:
####
RANDFILE = /usr/local/share/courier-imap/pop3d.rand

[ req ]
default_bits = 4096
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
C=ru
ST=RF
L=Ulianovsk
O=вашдомен.ru
OU= вашдомен.ru POP3 SSL key
CN= имясервера.вашдомен.ru
emailAddress=postmaster@ вашдомен.ru


[ cert_type ]
nsCertType = server
####
запустим генерилку сертификатов:
rm /usr/local/share/courier-imap/pop3d.pem
/usr/local/share/courier-imap/mkpop3dcert

Добавим в /etc/rc.conf
courier_imap_pop3d_enable=”YES”
courier_imap_pop3d_ssl_enable=”YES”
courier_authdaemond_enable=”YES”

Проверим работу POP3 сервера
#telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
#user me@raven.elk.ru
+OK Password required.
#pass password:)
+OK logged in.
L#ist
+OK POP3 clients that break here, they violate STD53.
1 623
#.
#quit
+OK Bye-bye.
Connection closed by foreign host

Далее смотри статью http://argo-uln.blogspot.com/2006/07/postfixclamavspamassassinamavisd_05.html

16 комментариев:

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

Спасибо за отличный мануал, но у меня возникли проблемы:
Apr 27 04:55:22 db postfix/virtual[95944]: fatal: open /usr/local/etc/postfix/sql/users.cf: Permission denied
Apr 27 04:55:23 db postfix/master[95786]: warning: process /usr/local/libexec/postfix/virtual pid 95944 exit status 1
Apr 27 04:55:23 db postfix/master[95786]: warning: /usr/local/libexec/postfix/virtual: bad command startup -- throttling


Причем дело не в правах на файл users.cf
Подскажите пожалуйста в чем может быть проблема!

Рамиль комментирует...

Как вариант, нет директории пользователя. После создания пользователя надо отправить на него письмо, через этот же smtp сервер. Создастся директория для пользователя. У меня это
/var/mail/virtual/domen.com/user1
(например).
А статью эту не я написал, просто под себя адаптировал. В оригинале были ошибкию :)

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

да, каталог virtual пуст, отправил письмо юзеру - результата не получил, есть какие мысли?
в логах при отправке:

Apr 27 07:26:29 db postfix/pickup[96226]: 6C3B7A1024: uid=0 from=root
Apr 27 07:26:29 db postfix/cleanup[96552]: 6C3B7A1024: message-id=<20070427112629.GA96542@server.com>
Apr 27 07:26:29 db postfix/qmgr[96227]: 6C3B7A1024: from=root@server.com, size=445, nrcpt=1 (queue active)
Apr 27 07:26:49 db postfix/virtual[96555]: fatal: open /usr/local/etc/postfix/sql/users.cf: Permission denied
Apr 27 07:26:50 db postfix/master[96225]: warning: process /usr/local/libexec/postfix/virtual pid 96555 exit status 1
Apr 27 07:26:50 db postfix/master[96225]: warning: /usr/local/libexec/postfix/virtual: bad command startup -- throttling

Рамиль комментирует...

в файле /usr/local/etc/postfix/main.cf проверить наличие строки
virtual_mailbox_base = /var/mail/virtual
Проверить права на папку
mkdir -pv /var/mail/virtual
chown postfix:mail /var/mail/virtual
chmod 770 /var/mail/virtual

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

о, работает, еще раз проследил все права и удалил лишние файлы. каталог создался :) спасибо!

Анонимный комментирует...

Здравствуйте!
Спасибо за хороший мануал, все работает как часы! А не подскажите как прикрутить postfixadmin к этой бд (mail)?
Заранее большое спасибо!

Рамиль комментирует...

К сожалению помочь тут не могу,
postfixadmin не использую.

Анонимный комментирует...

Да вроде через webmin нормально юзеров заводит.
Еще один вопрос пожалуйста, как сделать чтоб в бд пароли хранились в не зашифрованом виде? что нужно отключить?
Надеюсь на скорый ответ, спасибо!

Анонимный комментирует...

Или может есть другие средства для того чтоб заводить юзеров, не подскажите что вы используете для этого?

Рамиль комментирует...

Хранить пароли в незашифрованном виде не получится. Подумайте почему. Для администрирования пользователей использую скрипт на php. Выкладывать не буду, недоделан он. Если из под windows
можно рулить http://www.heidisql.com/ Прога бесплатна.

Анонимный комментирует...

Нет не из под виндовз, а можно мне на мыло ваш скрипт скинуть? stasneru@mail.ru

Рамиль комментирует...

Вебинтерфейс для добавления почтовых пользователей в mysql

Анонимный комментирует...

фактически
virtual_uid_maps = mysql:/usr/local/etc/postfix/sql/uids.cf
virtual_gid_maps = mysql:/usr/local/etc/postfix/sql/gids.cf
лишнее
можно сразу указать uid и gid

Анонимный комментирует...

у меня вопрос а как быть если я не хочу чтоб вся почта от всех юзеров не форвардилась , тоесть мне не надо чтоб я просматривал кто че пишет

Анонимный комментирует...

сорри !!!!форвардилась

Рамиль комментирует...

вообще по статье почта не должна никуда дублироваться