Страница 1 из 1

Exim + dovecot + postfixadmin + ..pgsql :) ..но есть трабл

Добавлено: 2007-01-03 15:42:39
iamserge
Всем привет!

Задолбал qmail, решил дать суровый отлуп спаму и построил связку Exim + dovecot + postfixadmin + ..pgsql . Лисяре пасиб за идею про постфиксный админ, немного пришлось пройтись напильником чтоб c pg заработал, но завел, наплодил, домен, юзеров и алиасов, админит. Да и конфиг с большего по его писал...
По POP3 давкот отдает коннект, сессия проходит нормально. В почт.каталоге юзера он завел свои индексные файлы и 3 папки cur, new, tmp. Стало быть все вроде ок, в т.ч. и с правами... Пробую послать мессагу локальному юзеру тестового домена, скажем serge@test.net ... Exim кажись также нормально по smtp кушает тестовую мессагу и по тесту
exim -d -bt testuser@test.net
показывает что нормально скармливает ее коту, о чем и в логах обозначена сия попытка. Однако потом пишет следующее (вотк кусок лога сеанса smtp):
2007-01-03 11:01:39 1H220B-0004KI-1o <= "testuser@test.net"@test.net H=serge.lc.test.net [10.0.0.5]
I=[10.
0.0.5]:25 P=esmtpa A=auth_cram_md5:testuser@test.net S=617 id=459B70F2.701@test.net from <testuser@test.net> for serge@test.net
и потом вдруг, блин... :
2007-01-03 11:01:39 1H220B-0004KI-1o ** serge@test.net R=dovecot_user T=dovecot_delivery: Child proc
es
s of dovecot_delivery transport returned 89 from command: /usr/libexec/dovecot/deliver
2007-01-03 11:01:39 1H220B-0004KO-HT <= <> R=1H220B-0004KI-1o U=exim P=local S=1416 from <> for "tes
tuser@test.net"@test.net
2007-01-03 11:01:39 1H220B-0004KO-HT ** testuser@test.net@test.net <"testuser@test.net"@test.net>: U
nrouteab
le address
2007-01-03 11:01:39 1H220B-0004KO-HT Frozen (delivery error message)
2007-01-03 11:01:39 1H220B-0004KI-1o Completed
-- тут мне во-первых непонятно как у него получилось testuser@test.net@test.net -- перепахал все конфиги -- ХЕЗ... Или это у него такой манер в логи писать, или где бага какая... ?? Роем в очереди exima -- находим:
1H252L-0004jZ-F3-D
This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

serge@test.net
local delivery failed

------ This is a copy of the message, including all the headers. ------

Return-path: <"testuser@test.net"@test.net>
Received: from serge.lc.test.net ([10.0.0.5])
by serge.lc.test.net with esmtpa (Exim 4.62)
(envelope-from <"testuser@test.net"@test.net>)
id 1H252K-0004jT-U5
for serge@test.net; Wed, 03 Jan 2007 14:16:05 +0200
Message-ID: <459B9E84.9070607@test.net>
Date: Wed, 03 Jan 2007 14:16:04 +0200
From: test uset <testuser@test.net>
User-Agent: Thunderbird 1.5 (X11/20060119)
MIME-Version: 1.0
To: serge@test.net
Subject: =?KOI8-R?Q?=D4=C5=D3=D4_=D0=D2=CF=C8=CF=D6=C4=C5=CE=C9=D1?=
Content-Type: text/plain; charset=KOI8-R; format=flowed
Content-Transfer-Encoding: 8bit
Sender: "testuser@test.net"@test.net

Тест прохождения.

По ходу получается, что кот не может доставить мессагу, ..о чем сообщает exim-y кодом ошибки (глядел в логи -- относится к прочим неопредленным ошибкам, вот бня :( ... ) В придачу ко всему он еще и берет и, при составлении мессаги калечит обратный адрес, сцуко. :( Хотя в его логах казалось бы все как надо (пишет в /var/log/maillog):
Jan 3 14:30:38 serge dovecot: auth(default): master in: USER 1 serge@test.net service=de
ver
Jan 3 14:30:38 serge dovecot: auth(default): sql(serge@test.net): SELECT maildir AS home, 500 AS ui
12 AS gid FROM mailbox WHERE username = 'serge@test.net' AND active='1'
Jan 3 14:30:38 serge dovecot: auth(default): master out: USER 1 serge@test.net home=/var
ool/mail/test.net/serge/ uid=500 gid=12
-- .. те, все правильно находит, а почту доставить не может какого-то х... :((
Народ подскажите, куда рыть дальше? Уже башка пухнет... :( Софт такой:
ОС: ASPLinux 11+updates (...считай Федора 4-я)
exim 4.62
dovecot (самый свежий) 1.0 rc15
..да, думал он еще плагин хочет для локальной доставки, поставил ему dovecot-sieve-1.0-3 -- не помогло.
В след. мессаге кину конфиги, exim-а и кота ...

Добавлено: 2007-01-03 16:20:09
iamserge
Вот и мои конфиги в догонку:
EXIM:
---------------
primary_hostname = serge.lc.test.net
# DB connection in format host/DBname/user/passwd
hide pgsql_servers = 10.x.x.x/postfix/xxxxxxxxxxx/xxxxxxxxxxxxxx
domainlist local_domains = ${lookup pgsql{SELECT domain FROM domain WHERE \
domain='${domain}' AND active='1'}}
domainlist relay_to_domains = ${lookup pgsql{SELECT domain FROM domain WHERE \
domain='${domain}' AND active='1'}}
hostlist relay_from_hosts = localhost:127.0.0.0/8:10.0.0.0/24
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
av_scanner = clamd:/var/run/clamav/clamd.sock
qualify_domain = test.net
# qualify_recipient =
never_users = root
rfc1413_query_timeout = 0s
sender_unqualified_hosts = +relay_from_hosts
recipient_unqualified_hosts = +relay_from_hosts
ignore_bounce_errors_after = 45m
# This option cancels (removes) frozen messages that are older than a week.
timeout_frozen_after = 7d
helo_accept_junk_hosts = 10.0.0.0/24
auto_thaw = 1h
smtp_banner = "test.net , ESMTP ready"
smtp_accept_max = 50
smtp_accept_max_per_connection = 25
smtp_connect_backlog = 30
smtp_accept_max_per_host = 20
split_spool_directory = true
remote_max_parallel = 15
return_size_limit = 70k
message_size_limit = 10M
helo_allow_chars = _
smtp_enforce_sync = true
log_selector = \
+all_parents \
+connection_reject \
+incoming_interface \
+lost_incoming_connection \
+received_sender \
+received_recipients \
+smtp_confirmation \
+smtp_syntax_error \
+smtp_protocol_error \
-queue_run
syslog_timestamp = no
tls_advertise_hosts = *
tls_certificate = /usr/share/ssl/certs/exim.pem
tls_privatekey = /usr/share/ssl/private/exim.pem
begin acl
acl_check_rcpt:
accept hosts = :
deny message = Restricted characters in address
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]

deny message = Restricted characters in address
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

deny message = "HELO/EHLO require by SMTP RFC"
condition = ${if eq{$sender_helo_name}{}{yes}{no}}

accept hosts = +relay_from_hosts
control = submission

accept authenticated = *
control = submission

deny message = "Your IP in HELO - access denied, get out!"
hosts = * : !+relay_from_hosts
condition = ${if eq{$sender_helo_name}{$sender_host_address}{true}{false}}

deny condition = ${if eq{$sender_helo_name}{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "Your HELO contains my IP! Fuck off, spamer."

deny condition = ${if match{$sender_helo_name}{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "HELO contains numbers only - bad trick, buddy."

deny condition = ${if match{$sender_address}{\N^\s+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "Why HELO contains whitespaces only?! Non-RFC... get out!"

deny condition = ${if eq{$sender_address}{}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "Where is sender of this mail?! Get out!"

deny message = "your hostname is bad (adsl, poll, ppp & etc)."
condition = ${if match{$sender_host_name}{adsl|dialup|pool|peer|dhcp}{yes}{no}}

warn
set acl_m0 = 10s

warn
hosts = +relay_from_hosts:80.253.9.18/32
set acl_m0 = 0s

warn
logwrite = Delay $acl_m0 for $sender_host_name \
[$sender_host_address] with HELO=$sender_helo_name. Mail from $sender_address to $local_part@$domain. delay = $acl_m0

deny message = "rejected because $sender_host_address is blacklisted in $dnslist_domain\n$dnslist_text
dnslists = relays.ordb.org : cbl.abuseat.org

accept domains = +local_domains
endpass
verify = recipient

accept domains = +relay_to_domains
endpass
verify = recipient

accept hosts = +relay_from_hosts

deny message = relay not permitted

acl_check_data:

deny message = "Nobody speaks chinese here. This is spam - fuck off!"
condition = ${if match{$message_body} \
{105[-_]*51[-_]*86|778[-_]*98[-_]*94} \
{yes}{no}}
deny malware = *
message = This message contains a virus ($malware_name).

accept

acl_check_mime:

warn decode = default

deny message = Blacklisted file extension detected
condition = ${if match \
{${lc:$mime_filename}} \
{\N(\.exe|\.pif|\.bat|\.scr|\.lnk|\.com)$\N} \
{1}{0}}
accept

acl_check_content:

deny message = This message contains malware ($malware_name)
malware = *

warn message = X-Spam-Score: $spam_score ($spam_bar)
spam = nobody:true
warn message = X-Spam-Report: $spam_report
spam = nobody:true

warn message = X-Spam-Flag: YES
spam = nobody

deny message = This message scored $spam_score points. Congratulations!
spam = nobody:true
condition = ${if >{$spam_score_int}{100}{1}{0}}

# finally accept all the rest
accept

begin routers

dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more

system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup pgsql{SELECT goto FROM alias WHERE \
address='${quote_pgsql:$local_part@$domain}' OR \
address='${quote_pgsql:@$domain}'}}

# Всё что осталось - это локальные адресаты.
# Доставляем почту в dovecot
dovecot_user:
driver = accept
condition = ${lookup pgsql{SELECT goto FROM alias WHERE \
address='${quote_pgsql:$local_part@$domain}' OR \
address='${quote_pgsql:@$domain}'}{yes}{no}}
transport = dovecot_delivery

begin transports

remote_smtp:
driver = smtp

dovecot_delivery:
driver = pipe
command = /usr/libexec/dovecot/deliver -d $local_part@$domain
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
log_output
user = mail

address_pipe:
driver = pipe
return_output

address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add

address_reply:
driver = autoreply

begin retry

* * F,2h,15m; G,16h,1h,1.5; F,4d,6h

begin rewrite

begin authenticators

auth_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${lookup pgsql{SELECT username FROM mailbox WHERE \
username = '${quote_mysql:$1}' AND \
password = '${quote_mysql:$2}'}{yes}{no}}
server_set_id = $2
server_prompts = :

auth_login:
driver = plaintext
public_name = LOGIN
server_condition = ${lookup pgsql{SELECT username FROM mailbox WHERE \
username = '${quote_mysql:$1}' AND \
password = '${quote_mysql:$2}'}{yes}{no}}
server_prompts = Username:: : Password::
server_set_id = $1

auth_cram_md5:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${lookup pgsql{SELECT password FROM mailbox WHERE \
username = '${quote_pgsql:$1}'}{$value}fail}
server_set_id = $1

# Усе. Конфиг кончился.
# - serge 29-12-2006, 17:03
************************************************
## Dovecot configuration file

base_dir = /var/run/dovecot/
protocols = imap pop3
listen = *
disable_plaintext_auth = no
shutdown_clients = yes
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail
ssl_disable = yes
login_dir = /var/run/dovecot/login

login_chroot = yes
login_user = dovecot
login_process_size = 32
login_process_per_connection = yes
login_processes_count = 3
login_max_processes_count = 64
login_max_connections = 128
login_greeting = Mail System ready.
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
mail_location = maildir:/var/spool/mail/%d/%n
mail_extra_groups = mail
mail_debug = yes
verbose_proctitle = yes
first_valid_uid = 500
umask = 0077

protocol imap {
imap_client_workarounds = delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep
}

protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}

protocol lda {
postmaster_address = postmaster@test.net
mail_plugins = cmusieve
mail_plugin_dir = /usr/lib/dovecot/lda
auth_socket_path = /var/run/dovecot/auth-master
}

auth_executable = /usr/libexec/dovecot/dovecot-auth
auth_debug = yes
auth_debug_passwords = yes
auth default {
mechanisms = plain
passdb sql {
args = /etc/dovecot-sql.conf
}

userdb sql {
args = /etc/dovecot-sql.conf
}

user = root
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = mail
#group = mail
}
}
}

plugin {
}
============================
driver = pgsql
connect = host=10.x.x.x dbname=postfix user=xxxxxxxxxxxxxxx password=xxxxxxxxxxxxxxxx
default_pass_scheme = PLAIN
password_query = SELECT username as user, password FROM mailbox WHERE username = '%n@%d' AND active='1'
user_query = SELECT maildir AS home, 500 AS uid, 12 AS gid FROM mailbox WHERE username = '%n@%d' AND active='1'

Добавлено: 2007-01-03 16:48:38
Alex Keda
многа букав - ниасилил.
шутка.
включай отладку и смотри что происходит.

Добавлено: 2007-01-03 17:37:19
iamserge
lissyara писал(а):многа букав - ниасилил.
шутка.
включай отладку и смотри что происходит.
дык ф коте включена аж все 3 опции... Есть подозрение, что проблема в указании полного пути к ящику, счас попробую в базу забить частичный путь, + забить коту в конфиг что-то типа mail_chroot = .....
Но с указанием мыла с двумя собаками при возврате мессаги -- наверно явный баг кота...

Добавлено: 2007-01-03 18:27:47
Alex Keda
хе, у меня рикошеты при неверном ящике нормальные генерятся...

Добавлено: 2007-01-04 11:34:38
iamserge
Камрады, Ахтунг! :)

Поиск проблемы сузился до ........ Вобщем, на свежую голову пришла мысль прошуршать /var/log/messages -- оказваццо этот сцуко deliver и туда пописывает, а не только в мыллог, как задано в конфиге кота. Вот что он пишет:
Jan 3 18:18:54 serge deliver(serge@test.net): auth input: serge@test.net
Jan 3 18:18:54 serge deliver(serge@test.net): auth input: home=/var/spool/mail/test.net/serge/
Jan 3 18:18:54 serge deliver(serge@test.net): auth input: uid=500
Jan 3 18:18:54 serge deliver(serge@test.net): auth input: gid=12
Jan 3 18:18:54 serge deliver(serge@test.net): setuid(500) failed: Operation not permitted

-- что ему не хватает? Пробовал эти uid,gid ставить на каталог /var/spool/mail , пробовал chmod u+s -- ни рожна не помогло. Че делать?
..С другой стороны, если выкосить все подкаталоги ниже /var/spool/mail , то при первом же обращении к ящику по РОР3 давкот все корректно создает сам по-новой с правами uid.gid =500.12 , т.е. сам кот могет делать этот setuid как ему предписывает ответ sql-запроса.., а деливер - нет. Подкиньте залечку, pls. :)

Добавлено: 2007-01-04 13:13:45
Alex Keda
чего-то знакомое про 500 uid... помниться там именно на нём ограничения.
пользователя с 501 создать можешь? интересно просто...
==========
и кстати - 500 - это кто у тебя?

Добавлено: 2007-01-04 13:26:00
iamserge
lissyara писал(а):чего-то знакомое про 500 uid... помниться там именно на нём ограничения.
пользователя с 501 создать можешь? интересно просто...
==========
и кстати - 500 - это кто у тебя?
...канэшна могу! В Линуксе обычные пользователи с этого номера именно и начинаются. Каждому очередному user-y созданному обычным например useradd vasya присваивается очередной 500, 501, 502... и т.д. Это не ограничения, это нормальный дефолт который ставится при Линуксовой сборке.
Вы мне выдайте залечку как победить впринципе этот setuid?
А то поисковики ниче дельного не дают. :(
Кста, у тебя какая версия кота сейчас?

Добавлено: 2007-01-04 13:26:58
Alex Keda
dovecot-1.0.r15

Добавлено: 2007-01-05 18:24:03
iamserge
у мня тож такой.

Нихто низнает. Уууу, тоска... :( Придеццо в dovecot-овскую рассылку писать.

Добавлено: 2007-01-05 18:37:01
Alex Keda
ты откуда ставил, кстати?

Добавлено: 2007-01-08 12:36:41
iamserge
lissyara писал(а):ты откуда ставил, кстати?
Всмысле? ..Брал где-то из rpm-ных апдейтов к Федоре + там мелкие непринципиальные патчи. Пересобирал...
Уже (в пятницу) rc16 вышел ...
Кста, трабл с деливером разрешен. Надо согласовывать юзера/группу под которой работает экзим и uid/gid которые возвращает SQL-запрос, т.е. под которыми будет запускаться deliver. Т.е. в случае линукса, это uid и группа одни из exim,mail ... Мля, как сразу-то не догадался, тьху...
Осталось с двоением домена разобраться. Где-то в настройках экзима похоже ковырять надо...

Добавлено: 2007-01-08 12:44:09
Alex Keda
Надо фряху поставить :)))

Добавлено: 2007-01-08 12:50:34
iamserge
lissyara писал(а):Надо фряху поставить :)))
та ну... :) жизни не хватит новые ОС осваивать... вот имею навязчивые мысли забить на fc-based и перейти под Debian -- оч. добротная система. С тех пор как RedHat закрыл основной свой релиз и сделал вечно тестовую Федору на свои же шкурные нужды, то кач-во всех дистров основанных на rpm резко упало.. :(

Добавлено: 2007-01-08 13:20:57
Alex Keda
ну - как хочешь...
Debian - говорят, тоже неплохая система... У меня на работе один живёт, по наследству достался. После праздников плотно заёмусь его искоренением :)

Добавлено: 2007-01-08 14:05:21
iamserge
lissyara писал(а):ну - как хочешь...
Debian - говорят, тоже неплохая система... У меня на работе один живёт, по наследству достался. После праздников плотно заёмусь его искоренением :)
я когда-то давно интересовался BSD, мне компетентные ребята посоветовали таки углубится в Линукс, как ниаболее перспективную ОС для платформы IBM PC. Впечатление таково, что под Линукс для РС больше всяческого софта, равно как и информации... Ну да ладно.
...таки не могу отрыть, где из-за чего exim лепит такие
Return-path
envelope-from
и Sender
:evil:

..может идеи какие есть? Конфиг с большего на твой похож (см. 1-й мессаг).

Добавлено: 2007-01-08 14:11:59
iamserge
...такое впечатление, что exim расценивает все адреса отправителей с локального хоста как unqualified, берет их в кавычки и лепит во все вдогонку подряд параметр qualify_domain и qualify_recipient ...

Добавлено: 2007-01-08 14:36:12
Alex Keda
отладку чтоли включил бы...

Добавлено: 2007-01-08 15:02:56
iamserge
lissyara писал(а):отладку чтоли включил бы...
да повключал, бня, где тока можно.. :)

Все, разобрался. Покурил доки на екзимном сайте. Засада в том, что оно берет в кач-ве имя юзера то, что передается при авторизации черещз SMTP, т.е. например, в клиенте прописано для смтп-сесий подавать testuser@test.com -- оно к нему и лепит... :( Взял чуть изменил механизм авторизации, чтоб давало чисто юзера testuser -- все стало работать правильно . Но, тут возникает вопрос, а что если будет несколько доменов и в них юзеры с одинаковыми именами - что вполне реально. Путей решения 2:
1) завести в БД в таблице mailbox отдельное поле для чисто этого имени
2) пробовать использовать в exim.conf параметр gecos_name
-- последний мне нравится больше. Только надо разобраться... Если ты силен в регулярных выражениях то помоги мне написать таковое, pls :) Дело в том, что для пользования указанного параметра надо задать еще один gecos_pattern
например (из доки по екзиму)
gecos_pattern= "([^,]*)"
gecos_name = $1
Вот, сцылка на доку.
http://www.exim.org/exim-html-3.10/doc/ ... tml#SEC218
..пробовал
gecos_pattern= "([^@]*)"
у меня не канает ....

... надо хорошенько изучить эти regexp -- хорошая штука они, да времени критически, нет бня... :(

////// в догонку.
кажется этот gecos -- не совсем то, о чем я подумалю Вобщем, народ, вопрос в лоб: как отрезать имя user из адреса вида user@domain.com в конфиге экзима, на этапе smtp-сессии..?

Добавлено: 2007-01-08 17:08:57
Alex Keda

Добавлено: 2007-01-08 18:18:17
iamserge
пасиб. Полезный раздел.

Решил таки несколько по-другому:
local_from_check = no
# Type: boolean
# Default: true
# When a message is submitted locally (that is, not over a TCP/IP connection)
# by a non-trusted user, Exim checks that the From: header line matches the login
# of the calling user, and if not, it adds a Sender: header. If local_from_check
# is set false, this checking is disabled, and no Sender: header is ever added.
# Nevertheless, the envelope sender is still forced to be the login id at the qualify domain.
Хотя, не совсем это мне нравится. По логике вещей надо его заставить понимать, что прологиненный
username в виде конструкции "user@domain.com" и есть user + domain .., в таком случае, если он совпадает с локальным существующим аккаунтом, оно не должно согласно дефолтных настроек пихать в заголовки эти Return-path
envelope-from и Sender
то есть надо выставить какие-то переменные...?
...уфф, за....парился приседать. Пока надо двигаться дальше и как-то тестить систему на реальной работе в сети.

Добавлено: 2007-01-08 19:14:11
Alex Keda
У тебя юзер при отправке как логинится - как user или как user@domain.su?

Добавлено: 2007-01-09 12:49:54
iamserge
lissyara писал(а):У тебя юзер при отправке как логинится - как user или как user@domain.su?

именно так. А как иначе при мультидоменной системе сделать?..