LINUX.ORG.RU
ФорумAdmin

Exim, почему не работает при удалении лишнего?

 


0

1

От конфига ISP в роутерах остались блоки вида «a_*», если их удалить получаю ошибку

… sender verify fail for <my_mail_1>: Unknown user
… F=<my_mail_1> A=cram:my_mail_1 rejected RCPT <my_mail_2>: Sender verify failed
почему?

domainlist local_domains = lsearch;/etc/exim/domains
domainlist relay_to_domains = lsearch;/etc/exim/domains
hostlist relay_from_hosts = 127.0.0.1 : my_ip
acl_smtp_mail = acl_check_mail
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
acl_smtp_mime = acl_check_mime
tls_advertise_hosts = *
tls_certificate = /etc/exim/ssl/exim.crt
tls_privatekey = /etc/exim/ssl/exim.key
daemon_smtp_ports = 25 : 465 : 587
tls_on_connect_ports = 465
never_users = root
host_lookup = *
log_selector = +smtp_protocol_error +smtp_syntax_error \
        +tls_certificate_verified \
        +all_parents \
        +lost_incoming_connection \
        +received_sender \
        +received_recipients \
        +tls_cipher +tls_peerdn \
        +smtp_confirmation
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d
keep_environment = ^LDAP
add_environment = PATH=/usr/bin::/bin
LDA_ENABLE = yes
MAILDIR_ENABLE = yes

begin acl
acl_check_mail:
  deny condition = ${if eq{$sender_helo_name}{} {1}}
       message = Nice boys say HELO first
  accept

acl_check_rcpt:
  deny    message       = Restricted characters in address
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]
  deny    message       = Restricted characters in address
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
  require verify        = sender
  accept  hosts         = +relay_from_hosts
          control       = submission/sender_retain
  accept  authenticated = *
#          condition     = ${if eq{${extract{5}{:}{${lookup{$authenticated_id}lsearch{/etc/exim/passwd}}}}}{no} {yes}{no}}
#          condition     = ${if eq{${extract{3}{:}{${lookup{${domain:$authenticated_id}}lsearch{/etc/exim/domains}}}}}{no} {yes}{no}}
          control       = submission/domain=
  require message       = nice hosts say HELO first
          condition     = ${if def:sender_helo_name}
  require message = relay not permitted
          domains = +local_domains : +relay_to_domains
  require verify = recipient
  accept
acl_check_data:
  deny    message    = maximum allowed line length is 998 octets, \
                       got $max_received_linelength
          condition  = ${if > {$max_received_linelength}{998}}
  deny    !verify =     header_syntax
          message =     header syntax
          log_message = header syntax ($acl_verify_message)
  accept
acl_check_mime:
  deny message = Blacklisted file extension detected
       condition = ${if match \
                        {${lc:$mime_filename}} \
                        {\N(\.exe|\.pif|\.bat|\.scr|\.lnk|\.com)$\N} \
                     {1}{0}}
  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
procmail:
  driver = accept
           transport = procmail_pipe
           transport_home_directory = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}
  no_verify
localuser:
  driver = accept
#  check_local_user
  condition = ${lookup {$local_part@$domain} lsearch {/etc/exim/passwd} {yes} {no} }
  transport = local_delivery
  cannot_route_message = Unknown user
        a_dnslookup:
                driver = dnslookup
                domains = ! +local_domains
                transport = remote_smtp
                ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
                self = pass
                no_more
        a_local_domains:
                driver = redirect
                data = ${quote_local_part:$local_part}@${extract{1}{:}{${lookup{$domain}lsearch{/etc/exim/domains}}}}
                cannot_route_message = Unknown user
                redirect_router = a_dnslookup
                no_more
        a_aliases:
                driver = redirect
                data = ${extract{1}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/aliases}}}}
                condition = ${if exists{/etc/exim/aliases} {yes} {no} }
                redirect_router = a_dnslookup
                pipe_transport = address_pipe
        a_procmail:
                no_verify
                driver = accept
                transport = procmail_pipe
                transport_home_directory = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}
        a_local_users:
                driver = accept
                transport = local_delivery
                condition = ${lookup {$local_part@$domain} lsearch {/etc/exim/passwd} {yes} {no} }
        a_catchall_for_domains:
                driver = redirect
                headers_add = X-redirected: yes
                data = ${extract{2}{:}{${lookup{$domain}lsearch{/etc/exim/domains}}}}
                file_transport = local_delivery
                redirect_router = a_dnslookup

begin transports
remote_smtp:
  driver = smtp
                interface = <;${lookup{$sender_address_domain}lsearch{/etc/exim/domainips}}
        procmail_pipe:
                driver = pipe
                environment = "HOME=$home"
                command = "/usr/bin/procmail HOME=$home"
                return_path_add
                delivery_date_add
                envelope_to_add
                check_string = "From "
                escape_string = ">From "
                user = ${extract{1}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}
                group = ${extract{2}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}
local_delivery:
  driver = appendfile
                maildir_format = true
                maildir_use_size_file = true
                create_directory = true
                directory_mode = 700
                directory = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}/.maildir
                delivery_date_add
                envelope_to_add
                return_path_add
                mode = 0660
                quota = ${extract{3}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}M
                quota_warn_threshold = 75%
                use_lockfile = no
                no_mode_fail_narrower
                user = ${extract{1}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}
                group = ${extract{2}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}
address_pipe:
  driver = pipe
                ignore_status
                return_output
                use_shell
address_reply:
  driver = autoreply
                headers = ${readfile{${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}/vacation/message.txt}}
                to = $sender_address

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

begin rewrite

begin authenticators
cram:
  driver = cyrus_sasl
  public_name = CRAM-MD5
  server_set_id = $1
plain:
  driver = cyrus_sasl
  public_name = PLAIN
  server_set_id = $1
login:
  driver = cyrus_sasl
  public_name = LOGIN
  server_set_id = $1

остались блоки вида «a_*»,

Это вы про routers? Посмотрите с помощью отладки или ″exim -bt″ какой маршут выбирается для ваших адресов.

mky ★★★★★ ()
Ответ на: комментарий от mky

Конечную ошибку пока не нашел, но нашел временную...

localuser router ругался так: getpwnam() returned NULL (user not found)

Прописал ему local_parts = ${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}

Теперь не может открыть... лог:

lookup yielded: 505:505:70:/var/www/user/data/email/mydomain/office:no:
 ├──expanding: ${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}
 └─────result: 505:505:70:/var/www/user/data/email/mydomain/office:no:
LOG: MAIN PANIC DIE
   failed to open /var/www/user/data/email/mydomain/office when checking "${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}": Permission denied (euid=93 egid=93)
SMTP>> 421 Unexpected failure, please try later

2 вопроса, чего не так? и я не понимаю зачем он вообще хочет открыть ящик с которого я отправляю?

yarnik ()
Ответ на: комментарий от yarnik

в конфиге есть sender = verify в самом начале. Удаленные сендеры он проверяет по домену. локальных - по роутерам. В нормальных конфигурациях sender = verify убирают ниже авторизованных юзеров и хостов, ибо не нужно.

anonymous ()
Ответ на: комментарий от yarnik
require verify        = sender

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

anonymous ()
Ответ на: комментарий от yarnik

Это обработка команды rcpt to любой smtp сессии к демону exim. Есть ещё rcpt to non smtp сессии при запуске exim или через алиас sendmail локально.

anonymous ()
Ответ на: комментарий от anonymous

ага, кажется ясно, я ошибался. Получается что если я с локального ящика слал на локальный ящик, но при этом используя TheBat у себя на ПК, это все равно соединение по smtp, поэтому в acl_check_rcpt и заходил, так?

А вот если бы я сообщение слал скриптом с сервера на локальный ящик, то это было бы локальное соединение и он не зашел бы в первые 2 ACL? так?

yarnik ()
Ответ на: комментарий от anonymous

Итак, исправил роутер localuser для успешной проверки:

localuser:
  driver = accept
# вместо check_local_user, стоит условие
  condition = ${lookup {$local_part@$domain} lsearch {/etc/exim/passwd} {yes} {no} }
  transport = local_delivery
  cannot_route_message = Unknown user

Но появилась другая проблема, авторизация SMTP теперь ни на что не влияет. При успешном провале, конфиг доходит до require verify = sender, уходит в роутеры, где этот же блок localuser четко все отработав, говорит sender verified ok

Как сказать что если авторизация не прошла в начале, то нечего идти дальше?

yarnik ()
Ответ на: комментарий от yarnik

accept authenticated = *

authenticated = authenticator тестирует на авторизацию и применяется в acl. Читай acl и смотри логику.

anonymous ()
Ответ на: комментарий от anonymous

Все равно не понятно.

SMTP>> 535 Incorrect authentication data
...
check authenticated = *
accept: condition test failed in ACL "acl_check_rcpt"
...
require: condition test succeeded in ACL "acl_check_rcpt"
...
require: condition test succeeded in ACL "acl_check_rcpt"
По логам видно что авторизация не пройдена, проверка провалена, но все равно идет проверка дальше.

yarnik ()
Ответ на: комментарий от yarnik

Кондишн не сработал - аксепт не сработал. Идем дальше.правмла так работают. Напиши require authentication = * тогда вывалится с 5хх реджектом и дальше ее пойдет.

anonymous ()
Ответ на: комментарий от anonymous

изначальный вопрос был тут касался он того, что после не удачной авторизации, роутер localuser выдает ОК.

При SMTP отправке с не правильным логином вот что происходит:

1. authentication - fail
2. check authenticated - fail
3. localuser: - ok
и письмо ушло

yarnik ()
Ответ на: комментарий от yarnik

смтп сессия получила ок на все acl. Все роутеры и транспорты сработали. Если вы не понимаете базовое устройство exim, о чем тут продолжать разговаривать. Я могу подсказать тонкие вещи, но пересказывать базу exim увольте...

anonymous ()
Ответ на: комментарий от yarnik

роутер и авторизация никак не связаны. в acl есть условия проверки авторизации. дальше сочиняйте как хотите.

anonymous ()
Ответ на: комментарий от anonymous

Скажите, где вы видите успешно пройденную авторизацию?

20:20:56 21762 SMTP<< AUTH CRAM-MD5
20:20:56 21762 SMTP>> 535 Incorrect authentication data
20:20:56 21762 SMTP<< AUTH LOGIN
20:20:56 21762 SMTP>> 535 Incorrect authentication data
20:20:56 21762 SMTP<< AUTH PLAIN
20:20:56 21762 SMTP>> 535 Incorrect authentication data

и далее ACL подтверждает что авторизация пройдена не была:

20:20:56 21762 processing "accept"
20:20:56 21762 check authenticated = *
20:20:56 21762 accept: condition test failed in ACL "acl_check_rcpt"

yarnik ()
Ответ на: комментарий от yarnik

require verify = recipient

accept

verify локального ресипиента через роутер прошла успешно.вся цепочка acl пройдена. в конце стоит accept. Что не так?

Нигде в правилах не написано, что авторизация обязательно должна быть успешной. Если она прошла успешно, выход ок. Иначе - проверять далее. в конце стоит accept.

anonymous ()
Ответ на: комментарий от anonymous

понял, спасибо за объяснение, я думал... не важно что думал, ушел был читать и курил о правилах до просветления. И как же быть в данном случае? Через SMTP проходит три варианта:

1. SMTP без авторизации, тут мы проверяем все что можно и в конце получаем accept.

2. SMTP с правильной авторизацией, тут мы получаем accept на проверке отметки об авторизации.

3. SMTP с НЕ_правильной авторизацией, тут я хочу не принимать сообщение, а получается что оно ведет себя как будто нет авторизации вообще.

yarnik ()
Ответ на: комментарий от yarnik

3. Так не принято. Есть 2 состояния: аутентифицировано кем-то или нет. Это может быть результатом ошибки. Если это перебор пароля, поможет smtp_accept_max_nonmail, например.

Если хочется Очень заморочиться на эту тему, есть acl_smtp_auth - acl для проверки auth и вот такая статья для заморочки

https://github.com/Exim/exim/wiki/BlockCracking

anonymous ()
Ответ на: комментарий от yarnik

Заблокировать свои mailfrom без авторизации? Во первых важно, в каком месте это будет относительно других правил. Во вторых это всего лишь mailfrom, который все подделывают. В третьих блокируются форварды своих доменов извне, ситуация редкая, но легитимная.

anonymous ()
Ответ на: комментарий от anonymous

отлично получилось, я убирал все роутеры «a_», получилось хорошо. Жалко нельзя более 3х раз обновлять тему, я бы показал ;)

Сейчас бодаюсь с автоответом, по документации не понял, примеров не нашел. ISPmanager юзал файл $home/vacation/message.txt в котором было:

From: 
Subject: 
Content-Type: text/plain; charset="UTF-8"

this massage

Но с таким файлом, роутер ругается:

23:25:10 26538 userforward router: defer for ...
23:25:10 26538   message: error in redirect file: missing or malformed local part (expected word or "<") in "From: ...

Я не против юзать и стандартные решения, но пока есть вот такое правило:

userforward:
  driver = redirect
  file = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}/vacation/message.txt
  no_verify
  no_expn
  check_ancestor
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply

yarnik ()
Ответ на: комментарий от yarnik

в попытках хоть как то запустить дошел до варианта

userforward:
  driver = redirect
  file = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}/.forward
  user = local_user
  allow_filter
  no_verify
  no_expn
  check_ancestor
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply

address_reply:
  driver = autoreply

файл .forward:

# Exim filter
if personal then vacation endif

файл .vacation.msg

"This is an automatic reply. Please feel free to send\n\n"

Но попытка была не удачной. И только после того как я вернул то что было в ISP, пришла почта со всех моих не удачных попыток

# userforward:

autoreplay:
  driver = accept
  condition = ${lookup{$local_part@$domain}lsearch{/etc/exim/vaclist}{yes}{no}}
  retry_use_local_part
  transport = address_reply
  unseen

address_reply:
  driver = autoreply
  headers = ${readfile{${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/passwd}}}}/vacation/message.txt}}
  to = $sender_address

чудны дела, жаль что так и не получилось эту часть подтянуть под стандартный конфиг...

yarnik ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.